瀏覽代碼

WebContent+WebWorker: Use custom certificate paths with Qt networking

This change adds a `--certificate` option to both WebContent and
WebWorker, which allows one or more custom root certificate paths to be
specified. Certificates are then loaded from these paths when Qt
networking is used.

This allows WPT tests that require a https connection to be run locally
with Qt networking.
Tim Ledbetter 1 年之前
父節點
當前提交
28b95e8ed0
共有 4 個文件被更改,包括 18 次插入6 次删除
  1. 10 1
      Ladybird/Qt/RequestManagerQt.cpp
  2. 3 3
      Ladybird/Qt/RequestManagerQt.h
  3. 2 1
      Ladybird/WebContent/main.cpp
  4. 3 1
      Ladybird/WebWorker/main.cpp

+ 10 - 1
Ladybird/Qt/RequestManagerQt.cpp

@@ -5,15 +5,24 @@
  */
  */
 
 
 #include "RequestManagerQt.h"
 #include "RequestManagerQt.h"
+#include "StringUtils.h"
 #include "WebSocketImplQt.h"
 #include "WebSocketImplQt.h"
 #include "WebSocketQt.h"
 #include "WebSocketQt.h"
 #include <QNetworkCookie>
 #include <QNetworkCookie>
 
 
 namespace Ladybird {
 namespace Ladybird {
 
 
-RequestManagerQt::RequestManagerQt()
+RequestManagerQt::RequestManagerQt(Vector<ByteString> const& certificate_paths)
 {
 {
     m_qnam = new QNetworkAccessManager(this);
     m_qnam = new QNetworkAccessManager(this);
+    auto ssl_configuration = QSslConfiguration::defaultConfiguration();
+    ssl_configuration.setPeerVerifyMode(QSslSocket::VerifyNone);
+    for (auto const& certificate_path : certificate_paths) {
+        auto certificates = QSslCertificate::fromPath(qstring_from_ak_string(certificate_path));
+        for (auto const& certificate : certificates)
+            ssl_configuration.addCaCertificate(certificate);
+    }
+    QSslConfiguration::setDefaultConfiguration(ssl_configuration);
 
 
     QObject::connect(m_qnam, &QNetworkAccessManager::finished, this, &RequestManagerQt::reply_finished);
     QObject::connect(m_qnam, &QNetworkAccessManager::finished, this, &RequestManagerQt::reply_finished);
 }
 }

+ 3 - 3
Ladybird/Qt/RequestManagerQt.h

@@ -17,9 +17,9 @@ class RequestManagerQt
     , public Web::ResourceLoaderConnector {
     , public Web::ResourceLoaderConnector {
     Q_OBJECT
     Q_OBJECT
 public:
 public:
-    static NonnullRefPtr<RequestManagerQt> create()
+    static NonnullRefPtr<RequestManagerQt> create(Vector<ByteString> const& certificate_paths)
     {
     {
-        return adopt_ref(*new RequestManagerQt());
+        return adopt_ref(*new RequestManagerQt(certificate_paths));
     }
     }
 
 
     virtual ~RequestManagerQt() override { }
     virtual ~RequestManagerQt() override { }
@@ -34,7 +34,7 @@ private slots:
     void reply_finished(QNetworkReply*);
     void reply_finished(QNetworkReply*);
 
 
 private:
 private:
-    RequestManagerQt();
+    explicit RequestManagerQt(Vector<ByteString> const& certificate_paths);
 
 
     class Request
     class Request
         : public Web::ResourceLoaderConnectorRequest {
         : public Web::ResourceLoaderConnectorRequest {

+ 2 - 1
Ladybird/WebContent/main.cpp

@@ -113,6 +113,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     args_parser.add_option(is_layout_test_mode, "Is layout test mode", "layout-test-mode");
     args_parser.add_option(is_layout_test_mode, "Is layout test mode", "layout-test-mode");
     args_parser.add_option(expose_internals_object, "Expose internals object", "expose-internals-object");
     args_parser.add_option(expose_internals_object, "Expose internals object", "expose-internals-object");
     args_parser.add_option(use_lagom_networking, "Enable Lagom servers for networking", "use-lagom-networking");
     args_parser.add_option(use_lagom_networking, "Enable Lagom servers for networking", "use-lagom-networking");
+    args_parser.add_option(certificates, "Path to a certificate file", "certificate", 'C', "certificate");
     args_parser.add_option(use_skia_painter, "Enable Skia painter", "use-skia-painting");
     args_parser.add_option(use_skia_painter, "Enable Skia painter", "use-skia-painting");
     args_parser.add_option(wait_for_debugger, "Wait for debugger", "wait-for-debugger");
     args_parser.add_option(wait_for_debugger, "Wait for debugger", "wait-for-debugger");
     args_parser.add_option(mach_server_name, "Mach server name", "mach-server-name", 0, "mach_server_name");
     args_parser.add_option(mach_server_name, "Mach server name", "mach-server-name", 0, "mach_server_name");
@@ -150,7 +151,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
 
 #if defined(HAVE_QT)
 #if defined(HAVE_QT)
     if (!use_lagom_networking)
     if (!use_lagom_networking)
-        Web::ResourceLoader::initialize(Ladybird::RequestManagerQt::create());
+        Web::ResourceLoader::initialize(Ladybird::RequestManagerQt::create(certificates));
     else
     else
 #endif
 #endif
         TRY(initialize_lagom_networking(request_server_socket));
         TRY(initialize_lagom_networking(request_server_socket));

+ 3 - 1
Ladybird/WebWorker/main.cpp

@@ -39,12 +39,14 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
 
     int request_server_socket { -1 };
     int request_server_socket { -1 };
     StringView serenity_resource_root;
     StringView serenity_resource_root;
+    Vector<ByteString> certificates;
     bool use_lagom_networking { false };
     bool use_lagom_networking { false };
 
 
     Core::ArgsParser args_parser;
     Core::ArgsParser args_parser;
     args_parser.add_option(request_server_socket, "File descriptor of the request server socket", "request-server-socket", 's', "request-server-socket");
     args_parser.add_option(request_server_socket, "File descriptor of the request server socket", "request-server-socket", 's', "request-server-socket");
     args_parser.add_option(serenity_resource_root, "Absolute path to directory for serenity resources", "serenity-resource-root", 'r', "serenity-resource-root");
     args_parser.add_option(serenity_resource_root, "Absolute path to directory for serenity resources", "serenity-resource-root", 'r', "serenity-resource-root");
     args_parser.add_option(use_lagom_networking, "Enable Lagom servers for networking", "use-lagom-networking");
     args_parser.add_option(use_lagom_networking, "Enable Lagom servers for networking", "use-lagom-networking");
+    args_parser.add_option(certificates, "Path to a certificate file", "certificate", 'C', "certificate");
     args_parser.parse(arguments);
     args_parser.parse(arguments);
 
 
 #if defined(HAVE_QT)
 #if defined(HAVE_QT)
@@ -61,7 +63,7 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
 
 
 #if defined(HAVE_QT)
 #if defined(HAVE_QT)
     if (!use_lagom_networking)
     if (!use_lagom_networking)
-        Web::ResourceLoader::initialize(Ladybird::RequestManagerQt::create());
+        Web::ResourceLoader::initialize(Ladybird::RequestManagerQt::create(certificates));
     else
     else
 #endif
 #endif
         TRY(initialize_lagom_networking(request_server_socket));
         TRY(initialize_lagom_networking(request_server_socket));