From d603b705539e1ec0d93761707d7df6d07bced98a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCri=20Valdmann?= <juri.valdmann@qt.io>
Date: Tue, 24 Jul 2018 17:21:34 +0200
Subject: [PATCH] Use net::TransportSecurityPersister to persist HSTS state

Task-number: QTBUG-69605
Change-Id: I863db484ff2bcf558585f75c73963097fb43148a
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
---
 src/core/net/url_request_context_getter_qt.cpp | 18 +++++++++++++++++-
 src/core/net/url_request_context_getter_qt.h   |  3 +++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/src/core/net/url_request_context_getter_qt.cpp b/src/core/net/url_request_context_getter_qt.cpp
index 904130611..1bb7b080f 100644
--- a/src/core/net/url_request_context_getter_qt.cpp
+++ b/src/core/net/url_request_context_getter_qt.cpp
@@ -64,6 +64,7 @@
 #include "net/http/http_auth_scheme.h"
 #include "net/http/http_cache.h"
 #include "net/http/http_server_properties_impl.h"
+#include "net/http/transport_security_persister.h"
 #include "net/proxy/proxy_script_fetcher_impl.h"
 #include "net/proxy/proxy_service.h"
 #include "net/ssl/channel_id_service.h"
@@ -142,6 +143,7 @@ void URLRequestContextGetterQt::setFullConfiguration(QSharedPointer<BrowserConte
     m_httpCachePath = browserContext->httpCachePath();
     m_httpCacheMaxSize = browserContext->httpCacheMaxSize();
     m_customUrlSchemes = browserContext->customUrlSchemes();
+    m_dataPath = browserContext->dataPath();
 }
 
 net::URLRequestContext *URLRequestContextGetterQt::GetURLRequestContext()
@@ -235,6 +237,7 @@ void URLRequestContextGetterQt::generateStorage()
         // we need to get rid of dangling pointer due to coming storage deletion
         m_urlRequestContext->set_http_transaction_factory(0);
         m_httpNetworkSession.reset();
+        m_transportSecurityPersister.reset();
     }
 
 
@@ -266,7 +269,20 @@ void URLRequestContextGetterQt::generateStorage()
                                      m_networkDelegate.get()));
 
     m_storage->set_ssl_config_service(new net::SSLConfigServiceDefaults);
-    m_storage->set_transport_security_state(std::unique_ptr<net::TransportSecurityState>(new net::TransportSecurityState()));
+    m_storage->set_transport_security_state(std::make_unique<net::TransportSecurityState>());
+
+    if (!m_dataPath.isEmpty()) {
+        scoped_refptr<base::SequencedTaskRunner> background_task_runner(
+            base::CreateSequencedTaskRunnerWithTraits(
+                {base::MayBlock(),
+                 base::TaskPriority::BACKGROUND,
+                 base::TaskShutdownBehavior::BLOCK_SHUTDOWN}));
+        m_transportSecurityPersister =
+            std::make_unique<net::TransportSecurityPersister>(
+                m_urlRequestContext->transport_security_state(),
+                toFilePath(m_dataPath),
+                background_task_runner);
+    }
 
     if (!m_httpAuthPreferences) {
         std::vector<std::string> auth_types(std::begin(kDefaultAuthSchemes), std::end(kDefaultAuthSchemes));
diff --git a/src/core/net/url_request_context_getter_qt.h b/src/core/net/url_request_context_getter_qt.h
index 0eb4a2fe4..717827543 100644
--- a/src/core/net/url_request_context_getter_qt.h
+++ b/src/core/net/url_request_context_getter_qt.h
@@ -63,6 +63,7 @@ namespace net {
 class HttpAuthPreferences;
 class MappedHostResolver;
 class ProxyConfigService;
+class TransportSecurityPersister;
 }
 
 namespace QtWebEngineCore {
@@ -126,6 +127,7 @@ private:
     std::unique_ptr<net::HttpNetworkSession> m_httpNetworkSession;
     std::unique_ptr<net::HttpAuthPreferences> m_httpAuthPreferences;
     proxy_resolver::mojom::ProxyResolverFactoryPtr m_proxyResolverFactory;
+    std::unique_ptr<net::TransportSecurityPersister> m_transportSecurityPersister;
 
     QList<QByteArray> m_installedCustomSchemes;
     QWebEngineUrlRequestInterceptor* m_requestInterceptor;
@@ -141,6 +143,7 @@ private:
     QString m_httpCachePath;
     int m_httpCacheMaxSize;
     QList<QByteArray> m_customUrlSchemes;
+    QString m_dataPath;
 
     friend class NetworkDelegateQt;
 };
-- 
GitLab