Changeset 277426 in webkit
- Timestamp:
- May 13, 2021, 1:00:14 AM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
Shared/glib/ArgumentCodersGLib.cpp (modified) (4 diffs)
-
Shared/glib/ArgumentCodersGLib.h (modified) (1 diff)
-
Shared/glib/UserMessage.cpp (modified) (2 diffs)
-
Shared/soup/WebCoreArgumentCodersSoup.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r277420 r277426 1 2021-05-13 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GTK][WPE] Add ArgumentCoder for GTlsCertificate 4 https://bugs.webkit.org/show_bug.cgi?id=225509 5 6 Reviewed by Adrian Perez de Castro. 7 8 Move the GTlsCertificate serialization from CertificateInfo ArgumentCoder to its own. 9 10 * Shared/glib/ArgumentCodersGLib.cpp: 11 (IPC::ArgumentCoder<GRefPtr<GVariant>>::encode): 12 (IPC::ArgumentCoder<GRefPtr<GVariant>>::decode): 13 (IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::encode): 14 (IPC::ArgumentCoder<GRefPtr<GTlsCertificate>>::decode): 15 (IPC::encode): Deleted. 16 (IPC::decode): Deleted. 17 * Shared/glib/ArgumentCodersGLib.h: 18 * Shared/glib/UserMessage.cpp: 19 (WebKit::UserMessage::encode const): 20 (WebKit::UserMessage::decode): 21 * Shared/soup/WebCoreArgumentCodersSoup.cpp: 22 (IPC::ArgumentCoder<CertificateInfo>::encode): 23 (IPC::ArgumentCoder<CertificateInfo>::decode): 24 1 25 2021-05-12 Chris Dumez <cdumez@apple.com> 2 26 -
trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.cpp
r262274 r277426 28 28 29 29 #include "DataReference.h" 30 #include <g lib.h>30 #include <gio/gio.h> 31 31 #include <wtf/glib/GUniquePtr.h> 32 32 #include <wtf/text/CString.h> … … 34 34 namespace IPC { 35 35 36 void encode(Encoder& encoder, GVariant*variant)36 void ArgumentCoder<GRefPtr<GVariant>>::encode(Encoder& encoder, GRefPtr<GVariant> variant) 37 37 { 38 38 if (!variant) { … … 41 41 } 42 42 43 encoder << CString(g_variant_get_type_string(variant ));44 encoder << DataReference(static_cast<const uint8_t*>(g_variant_get_data(variant )), g_variant_get_size(variant));43 encoder << CString(g_variant_get_type_string(variant.get())); 44 encoder << DataReference(static_cast<const uint8_t*>(g_variant_get_data(variant.get())), g_variant_get_size(variant.get())); 45 45 } 46 46 47 Optional<GRefPtr<GVariant>> decode(Decoder& decoder)47 Optional<GRefPtr<GVariant>> ArgumentCoder<GRefPtr<GVariant>>::decode(Decoder& decoder) 48 48 { 49 49 CString variantTypeString; … … 66 66 } 67 67 68 void ArgumentCoder<GRefPtr<GTlsCertificate>>::encode(Encoder& encoder, GRefPtr<GTlsCertificate> certificate) 69 { 70 if (!certificate) { 71 encoder << 0; 72 return; 73 } 74 75 Vector<GRefPtr<GByteArray>> certificatesDataList; 76 for (auto* nextCertificate = certificate.get(); nextCertificate; nextCertificate = g_tls_certificate_get_issuer(nextCertificate)) { 77 GRefPtr<GByteArray> certificateData; 78 g_object_get(nextCertificate, "certificate", &certificateData.outPtr(), nullptr); 79 80 if (!certificateData) { 81 certificatesDataList.clear(); 82 break; 83 } 84 85 certificatesDataList.append(WTFMove(certificateData)); 86 } 87 88 encoder << static_cast<uint32_t>(certificatesDataList.size()); 89 if (certificatesDataList.isEmpty()) 90 return; 91 92 // Encode starting from the root certificate. 93 while (!certificatesDataList.isEmpty()) { 94 auto certificateData = certificatesDataList.takeLast(); 95 encoder << IPC::DataReference(certificateData->data, certificateData->len); 96 } 97 } 98 99 Optional<GRefPtr<GTlsCertificate>> ArgumentCoder<GRefPtr<GTlsCertificate>>::decode(Decoder& decoder) 100 { 101 uint32_t chainLength; 102 if (!decoder.decode(chainLength)) 103 return WTF::nullopt; 104 105 if (!chainLength) 106 return GRefPtr<GTlsCertificate>(); 107 108 GType certificateType = g_tls_backend_get_certificate_type(g_tls_backend_get_default()); 109 GRefPtr<GTlsCertificate> certificate; 110 GTlsCertificate* issuer = nullptr; 111 for (uint32_t i = 0; i < chainLength; i++) { 112 IPC::DataReference certificateDataReference; 113 if (!decoder.decode(certificateDataReference)) 114 return WTF::nullopt; 115 116 GRefPtr<GByteArray> certificateData = adoptGRef(g_byte_array_sized_new(certificateDataReference.size())); 117 g_byte_array_append(certificateData.get(), certificateDataReference.data(), certificateDataReference.size()); 118 119 certificate = adoptGRef(G_TLS_CERTIFICATE(g_initable_new( 120 certificateType, nullptr, nullptr, 121 "certificate", certificateData.get(), 122 "issuer", issuer, 123 nullptr))); 124 issuer = certificate.get(); 125 } 126 127 return certificate; 128 } 129 68 130 } // namespace IPC -
trunk/Source/WebKit/Shared/glib/ArgumentCodersGLib.h
r251181 r277426 30 30 31 31 typedef struct _GVariant GVariant; 32 typedef struct _GTlsCertificate GTlsCertificate; 32 33 33 34 namespace IPC { 34 35 35 void encode(Encoder&, GVariant*); 36 Optional<GRefPtr<GVariant>> decode(Decoder&); 36 template<> struct ArgumentCoder<GRefPtr<GVariant>> { 37 static void encode(Encoder&, GRefPtr<GVariant>); 38 static Optional<GRefPtr<GVariant>> decode(Decoder&); 39 }; 40 41 template<> struct ArgumentCoder<GRefPtr<GTlsCertificate>> { 42 static void encode(Encoder&, GRefPtr<GTlsCertificate>); 43 static Optional<GRefPtr<GTlsCertificate>> decode(Decoder&); 44 }; 37 45 38 46 } // namespace IPC -
trunk/Source/WebKit/Shared/glib/UserMessage.cpp
r262994 r277426 46 46 } 47 47 48 IPC::encode(encoder, parameters.get());48 encoder << parameters; 49 49 50 50 Vector<IPC::Attachment> attachments; … … 79 79 } 80 80 81 Optional<GRefPtr<GVariant>> parameters = IPC::decode(decoder); 81 Optional<GRefPtr<GVariant>> parameters; 82 decoder >> parameters; 82 83 if (!parameters) 83 84 return WTF::nullopt; -
trunk/Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp
r270573 r277426 27 27 28 28 #include "config.h" 29 #include "WebCoreArgumentCoders.h" 30 31 #include "ArgumentCodersGLib.h" 29 32 #include "DataReference.h" 30 #include "WebCoreArgumentCoders.h"31 32 33 #include <WebCore/CertificateInfo.h> 33 34 #include <WebCore/DictionaryPopupInfo.h> … … 55 56 void ArgumentCoder<CertificateInfo>::encode(Encoder& encoder, const CertificateInfo& certificateInfo) 56 57 { 57 auto*certificate = certificateInfo.certificate();58 if (!certificate) {59 encoder << 0;58 GRefPtr<GTlsCertificate> certificate = certificateInfo.certificate(); 59 encoder << certificate; 60 if (!certificate) 60 61 return; 62 63 encoder << static_cast<uint32_t>(certificateInfo.tlsErrors()); 64 } 65 66 bool ArgumentCoder<CertificateInfo>::decode(Decoder& decoder, CertificateInfo& certificateInfo) 67 { 68 Optional<GRefPtr<GTlsCertificate>> certificate; 69 decoder >> certificate; 70 if (!certificate) 71 return false; 72 73 if (certificate.value()) { 74 uint32_t tlsErrors; 75 if (!decoder.decode(tlsErrors)) 76 return false; 77 78 certificateInfo.setCertificate(certificate->get()); 79 certificateInfo.setTLSErrors(static_cast<GTlsCertificateFlags>(tlsErrors)); 61 80 } 62 63 Vector<GRefPtr<GByteArray>> certificatesDataList;64 for (; certificate; certificate = g_tls_certificate_get_issuer(certificate)) {65 GByteArray* certificateData = nullptr;66 g_object_get(G_OBJECT(certificate), "certificate", &certificateData, nullptr);67 68 if (!certificateData) {69 certificatesDataList.clear();70 break;71 }72 73 certificatesDataList.append(adoptGRef(certificateData));74 }75 76 encoder << static_cast<uint32_t>(certificatesDataList.size());77 78 if (certificatesDataList.isEmpty())79 return;80 81 // Encode starting from the root certificate.82 for (size_t i = certificatesDataList.size(); i > 0; --i) {83 GByteArray* certificate = certificatesDataList[i - 1].get();84 encoder << IPC::DataReference(certificate->data, certificate->len);85 }86 87 encoder << static_cast<uint32_t>(certificateInfo.tlsErrors());88 }89 90 bool ArgumentCoder<CertificateInfo>::decode(Decoder& decoder, CertificateInfo& certificateInfo)91 {92 uint32_t chainLength;93 if (!decoder.decode(chainLength))94 return false;95 96 if (!chainLength)97 return true;98 99 GType certificateType = g_tls_backend_get_certificate_type(g_tls_backend_get_default());100 GRefPtr<GTlsCertificate> certificate;101 for (uint32_t i = 0; i < chainLength; i++) {102 IPC::DataReference certificateDataReference;103 if (!decoder.decode(certificateDataReference))104 return false;105 106 GByteArray* certificateData = g_byte_array_sized_new(certificateDataReference.size());107 GRefPtr<GByteArray> certificateBytes = adoptGRef(g_byte_array_append(certificateData, certificateDataReference.data(), certificateDataReference.size()));108 109 certificate = adoptGRef(G_TLS_CERTIFICATE(g_initable_new(110 certificateType, nullptr, nullptr, "certificate", certificateBytes.get(), "issuer", certificate.get(), nullptr)));111 }112 113 uint32_t tlsErrors;114 if (!decoder.decode(tlsErrors))115 return false;116 117 certificateInfo.setCertificate(certificate.get());118 certificateInfo.setTLSErrors(static_cast<GTlsCertificateFlags>(tlsErrors));119 81 120 82 return true;
Note:
See TracChangeset
for help on using the changeset viewer.