Title: [277426] trunk/Source/WebKit
Revision
277426
Author
[email protected]
Date
2021-05-13 01:00:14 -0700 (Thu, 13 May 2021)

Log Message

[GTK][WPE] Add ArgumentCoder for GTlsCertificate
https://bugs.webkit.org/show_bug.cgi?id=225509

Reviewed by Adrian Perez de Castro.

Move the GTlsCertificate serialization from CertificateInfo ArgumentCoder to its own.

* Shared/glib/ArgumentCodersGLib.cpp:
(IPC::ArgumentCoder<GRefPtr<GVariant>>::encode):
(IPC::ArgumentCoder<GRefPtr<GVariant>>::decode):
(IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::encode):
(IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::decode):
(IPC::encode): Deleted.
(IPC::decode): Deleted.
* Shared/glib/ArgumentCodersGLib.h:
* Shared/glib/UserMessage.cpp:
(WebKit::UserMessage::encode const):
(WebKit::UserMessage::decode):
* Shared/soup/WebCoreArgumentCodersSoup.cpp:
(IPC::ArgumentCoder<CertificateInfo>::encode):
(IPC::ArgumentCoder<CertificateInfo>::decode):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (277425 => 277426)


--- trunk/Source/WebKit/ChangeLog	2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/ChangeLog	2021-05-13 08:00:14 UTC (rev 277426)
@@ -1,3 +1,27 @@
+2021-05-13  Carlos Garcia Campos  <[email protected]>
+
+        [GTK][WPE] Add ArgumentCoder for GTlsCertificate
+        https://bugs.webkit.org/show_bug.cgi?id=225509
+
+        Reviewed by Adrian Perez de Castro.
+
+        Move the GTlsCertificate serialization from CertificateInfo ArgumentCoder to its own.
+
+        * Shared/glib/ArgumentCodersGLib.cpp:
+        (IPC::ArgumentCoder<GRefPtr<GVariant>>::encode):
+        (IPC::ArgumentCoder<GRefPtr<GVariant>>::decode):
+        (IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::encode):
+        (IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::decode):
+        (IPC::encode): Deleted.
+        (IPC::decode): Deleted.
+        * Shared/glib/ArgumentCodersGLib.h:
+        * Shared/glib/UserMessage.cpp:
+        (WebKit::UserMessage::encode const):
+        (WebKit::UserMessage::decode):
+        * Shared/soup/WebCoreArgumentCodersSoup.cpp:
+        (IPC::ArgumentCoder<CertificateInfo>::encode):
+        (IPC::ArgumentCoder<CertificateInfo>::decode):
+
 2021-05-12  Chris Dumez  <[email protected]>
 
         Notification.requestPermission() should return a Promise

Modified: trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp (277425 => 277426)


--- trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp	2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp	2021-05-13 08:00:14 UTC (rev 277426)
@@ -27,13 +27,13 @@
 #include "ArgumentCodersGLib.h"
 
 #include "DataReference.h"
-#include <glib.h>
+#include <gio/gio.h>
 #include <wtf/glib/GUniquePtr.h>
 #include <wtf/text/CString.h>
 
 namespace IPC {
 
-void encode(Encoder& encoder, GVariant* variant)
+void ArgumentCoder<GRefPtr<GVariant>>::encode(Encoder& encoder, GRefPtr<GVariant> variant)
 {
     if (!variant) {
         encoder << CString();
@@ -40,11 +40,11 @@
         return;
     }
 
-    encoder << CString(g_variant_get_type_string(variant));
-    encoder << DataReference(static_cast<const uint8_t*>(g_variant_get_data(variant)), g_variant_get_size(variant));
+    encoder << CString(g_variant_get_type_string(variant.get()));
+    encoder << DataReference(static_cast<const uint8_t*>(g_variant_get_data(variant.get())), g_variant_get_size(variant.get()));
 }
 
-Optional<GRefPtr<GVariant>> decode(Decoder& decoder)
+Optional<GRefPtr<GVariant>> ArgumentCoder<GRefPtr<GVariant>>::decode(Decoder& decoder)
 {
     CString variantTypeString;
     if (!decoder.decode(variantTypeString))
@@ -65,4 +65,66 @@
     return Optional<GRefPtr<GVariant> >(g_variant_new_from_bytes(variantType.get(), bytes.get(), FALSE));
 }
 
+void ArgumentCoder<GRefPtr<GTlsCertificate>>::encode(Encoder& encoder, GRefPtr<GTlsCertificate> certificate)
+{
+    if (!certificate) {
+        encoder << 0;
+        return;
+    }
+
+    Vector<GRefPtr<GByteArray>> certificatesDataList;
+    for (auto* nextCertificate = certificate.get(); nextCertificate; nextCertificate = g_tls_certificate_get_issuer(nextCertificate)) {
+        GRefPtr<GByteArray> certificateData;
+        g_object_get(nextCertificate, "certificate", &certificateData.outPtr(), nullptr);
+
+        if (!certificateData) {
+            certificatesDataList.clear();
+            break;
+        }
+
+        certificatesDataList.append(WTFMove(certificateData));
+    }
+
+    encoder << static_cast<uint32_t>(certificatesDataList.size());
+    if (certificatesDataList.isEmpty())
+        return;
+
+    // Encode starting from the root certificate.
+    while (!certificatesDataList.isEmpty()) {
+        auto certificateData = certificatesDataList.takeLast();
+        encoder << IPC::DataReference(certificateData->data, certificateData->len);
+    }
+}
+
+Optional<GRefPtr<GTlsCertificate>> ArgumentCoder<GRefPtr<GTlsCertificate>>::decode(Decoder& decoder)
+{
+    uint32_t chainLength;
+    if (!decoder.decode(chainLength))
+        return WTF::nullopt;
+
+    if (!chainLength)
+        return GRefPtr<GTlsCertificate>();
+
+    GType certificateType = g_tls_backend_get_certificate_type(g_tls_backend_get_default());
+    GRefPtr<GTlsCertificate> certificate;
+    GTlsCertificate* issuer = nullptr;
+    for (uint32_t i = 0; i < chainLength; i++) {
+        IPC::DataReference certificateDataReference;
+        if (!decoder.decode(certificateDataReference))
+            return WTF::nullopt;
+
+        GRefPtr<GByteArray> certificateData = adoptGRef(g_byte_array_sized_new(certificateDataReference.size()));
+        g_byte_array_append(certificateData.get(), certificateDataReference.data(), certificateDataReference.size());
+
+        certificate = adoptGRef(G_TLS_CERTIFICATE(g_initable_new(
+            certificateType, nullptr, nullptr,
+            "certificate", certificateData.get(),
+            "issuer", issuer,
+            nullptr)));
+        issuer = certificate.get();
+    }
+
+    return certificate;
+}
+
 } // namespace IPC

Modified: trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h (277425 => 277426)


--- trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h	2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h	2021-05-13 08:00:14 UTC (rev 277426)
@@ -29,10 +29,18 @@
 #include <wtf/glib/GRefPtr.h>
 
 typedef struct _GVariant GVariant;
+typedef struct _GTlsCertificate GTlsCertificate;
 
 namespace IPC {
 
-void encode(Encoder&, GVariant*);
-Optional<GRefPtr<GVariant>> decode(Decoder&);
+template<> struct ArgumentCoder<GRefPtr<GVariant>> {
+    static void encode(Encoder&, GRefPtr<GVariant>);
+    static Optional<GRefPtr<GVariant>> decode(Decoder&);
+};
 
+template<> struct ArgumentCoder<GRefPtr<GTlsCertificate>> {
+    static void encode(Encoder&, GRefPtr<GTlsCertificate>);
+    static Optional<GRefPtr<GTlsCertificate>> decode(Decoder&);
+};
+
 } // namespace IPC

Modified: trunk/Source/WebKit/Shared/glib/UserMessage.cpp (277425 => 277426)


--- trunk/Source/WebKit/Shared/glib/UserMessage.cpp	2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/glib/UserMessage.cpp	2021-05-13 08:00:14 UTC (rev 277426)
@@ -45,7 +45,7 @@
         return;
     }
 
-    IPC::encode(encoder, parameters.get());
+    encoder << parameters;
 
     Vector<IPC::Attachment> attachments;
     if (fileDescriptors) {
@@ -78,7 +78,8 @@
         return result;
     }
 
-    Optional<GRefPtr<GVariant>> parameters = IPC::decode(decoder);
+    Optional<GRefPtr<GVariant>> parameters;
+    decoder >> parameters;
     if (!parameters)
         return WTF::nullopt;
     result.parameters = WTFMove(*parameters);

Modified: trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp (277425 => 277426)


--- trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp	2021-05-13 06:45:07 UTC (rev 277425)
+++ trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp	2021-05-13 08:00:14 UTC (rev 277426)
@@ -26,9 +26,10 @@
  */
 
 #include "config.h"
-#include "DataReference.h"
 #include "WebCoreArgumentCoders.h"
 
+#include "ArgumentCodersGLib.h"
+#include "DataReference.h"
 #include <WebCore/CertificateInfo.h>
 #include <WebCore/DictionaryPopupInfo.h>
 #include <WebCore/Font.h>
@@ -54,69 +55,30 @@
 
 void ArgumentCoder<CertificateInfo>::encode(Encoder& encoder, const CertificateInfo& certificateInfo)
 {
-    auto* certificate = certificateInfo.certificate();
-    if (!certificate) {
-        encoder << 0;
+    GRefPtr<GTlsCertificate> certificate = certificateInfo.certificate();
+    encoder << certificate;
+    if (!certificate)
         return;
-    }
 
-    Vector<GRefPtr<GByteArray>> certificatesDataList;
-    for (; certificate; certificate = g_tls_certificate_get_issuer(certificate)) {
-        GByteArray* certificateData = nullptr;
-        g_object_get(G_OBJECT(certificate), "certificate", &certificateData, nullptr);
-
-        if (!certificateData) {
-            certificatesDataList.clear();
-            break;
-        }
-
-        certificatesDataList.append(adoptGRef(certificateData));
-    }
-
-    encoder << static_cast<uint32_t>(certificatesDataList.size());
-
-    if (certificatesDataList.isEmpty())
-        return;
-
-    // Encode starting from the root certificate.
-    for (size_t i = certificatesDataList.size(); i > 0; --i) {
-        GByteArray* certificate = certificatesDataList[i - 1].get();
-        encoder << IPC::DataReference(certificate->data, certificate->len);
-    }
-
     encoder << static_cast<uint32_t>(certificateInfo.tlsErrors());
 }
 
 bool ArgumentCoder<CertificateInfo>::decode(Decoder& decoder, CertificateInfo& certificateInfo)
 {
-    uint32_t chainLength;
-    if (!decoder.decode(chainLength))
+    Optional<GRefPtr<GTlsCertificate>> certificate;
+    decoder >> certificate;
+    if (!certificate)
         return false;
 
-    if (!chainLength)
-        return true;
-
-    GType certificateType = g_tls_backend_get_certificate_type(g_tls_backend_get_default());
-    GRefPtr<GTlsCertificate> certificate;
-    for (uint32_t i = 0; i < chainLength; i++) {
-        IPC::DataReference certificateDataReference;
-        if (!decoder.decode(certificateDataReference))
+    if (certificate.value()) {
+        uint32_t tlsErrors;
+        if (!decoder.decode(tlsErrors))
             return false;
 
-        GByteArray* certificateData = g_byte_array_sized_new(certificateDataReference.size());
-        GRefPtr<GByteArray> certificateBytes = adoptGRef(g_byte_array_append(certificateData, certificateDataReference.data(), certificateDataReference.size()));
-
-        certificate = adoptGRef(G_TLS_CERTIFICATE(g_initable_new(
-            certificateType, nullptr, nullptr, "certificate", certificateBytes.get(), "issuer", certificate.get(), nullptr)));
+        certificateInfo.setCertificate(certificate->get());
+        certificateInfo.setTLSErrors(static_cast<GTlsCertificateFlags>(tlsErrors));
     }
 
-    uint32_t tlsErrors;
-    if (!decoder.decode(tlsErrors))
-        return false;
-
-    certificateInfo.setCertificate(certificate.get());
-    certificateInfo.setTLSErrors(static_cast<GTlsCertificateFlags>(tlsErrors));
-
     return true;
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to