[WebAuthN] Implement authenticatorMakeCredential
[WebKit-https.git] / Source / WebCore / Modules / webauthn / PublicKeyCredentialCreationOptions.h
index 2554226..495d58b 100644 (file)
@@ -30,6 +30,7 @@
 #include "BufferSource.h"
 #include "PublicKeyCredentialDescriptor.h"
 #include "PublicKeyCredentialType.h"
+#include <wtf/CrossThreadCopier.h>
 #include <wtf/Forward.h>
 
 namespace WebCore {
@@ -45,13 +46,17 @@ struct PublicKeyCredentialCreationOptions {
     };
 
     struct UserEntity : public Entity {
-        BufferSource id;
+        BufferSource id; // id becomes idVector once it is passed to UIProcess.
+        mutable Vector<uint8_t> idVector;
         String displayName;
     };
 
     struct Parameters {
         PublicKeyCredentialType type;
-        long alg;
+        int64_t alg;
+
+        template<class Encoder> void encode(Encoder&) const;
+        template<class Decoder> static std::optional<Parameters> decode(Decoder&);
     };
 
     RpEntity rp;
@@ -62,8 +67,83 @@ struct PublicKeyCredentialCreationOptions {
 
     std::optional<unsigned long> timeout;
     Vector<PublicKeyCredentialDescriptor> excludeCredentials;
+
+    template<class Encoder> void encode(Encoder&) const;
+    template<class Decoder> static std::optional<PublicKeyCredentialCreationOptions> decode(Decoder&);
 };
 
+template<class Encoder>
+void PublicKeyCredentialCreationOptions::Parameters::encode(Encoder& encoder) const
+{
+    encoder << type << alg;
+}
+
+template<class Decoder>
+std::optional<PublicKeyCredentialCreationOptions::Parameters> PublicKeyCredentialCreationOptions::Parameters::decode(Decoder& decoder)
+{
+    PublicKeyCredentialCreationOptions::Parameters result;
+    if (!decoder.decodeEnum(result.type))
+        return std::nullopt;
+    if (!decoder.decode(result.alg))
+        return std::nullopt;
+    return result;
+}
+
+// Not every member is encoded.
+template<class Encoder>
+void PublicKeyCredentialCreationOptions::encode(Encoder& encoder) const
+{
+    encoder << rp.id << rp.name << rp.icon;
+    Vector<uint8_t> idVector;
+    idVector.append(user.id.data(), user.id.length());
+    encoder << idVector << user.displayName << user.name << user.icon << pubKeyCredParams << excludeCredentials;
+}
+
+template<class Decoder>
+std::optional<PublicKeyCredentialCreationOptions> PublicKeyCredentialCreationOptions::decode(Decoder& decoder)
+{
+    PublicKeyCredentialCreationOptions result;
+    if (!decoder.decode(result.rp.id))
+        return std::nullopt;
+    if (!decoder.decode(result.rp.name))
+        return std::nullopt;
+    if (!decoder.decode(result.rp.icon))
+        return std::nullopt;
+    if (!decoder.decode(result.user.idVector))
+        return std::nullopt;
+    if (!decoder.decode(result.user.displayName))
+        return std::nullopt;
+    if (!decoder.decode(result.user.name))
+        return std::nullopt;
+    if (!decoder.decode(result.user.icon))
+        return std::nullopt;
+    if (!decoder.decode(result.pubKeyCredParams))
+        return std::nullopt;
+    if (!decoder.decode(result.excludeCredentials))
+        return std::nullopt;
+    return result;
+}
+
 } // namespace WebCore
 
+namespace WTF {
+// Not every member is copied.
+template<> struct CrossThreadCopierBase<false, false, WebCore::PublicKeyCredentialCreationOptions> {
+    typedef WebCore::PublicKeyCredentialCreationOptions Type;
+    static Type copy(const Type& source)
+    {
+        Type result;
+        result.rp.name = source.rp.name.isolatedCopy();
+        result.rp.icon = source.rp.icon.isolatedCopy();
+        result.rp.id = source.rp.id.isolatedCopy();
+
+        result.user.name = source.user.name.isolatedCopy();
+        result.user.icon = source.user.icon.isolatedCopy();
+        result.user.displayName = source.user.displayName.isolatedCopy();
+        result.user.idVector = WTFMove(source.user.idVector);
+        return result;
+    }
+};
+} // namespace WTF
+
 #endif // ENABLE(WEB_AUTHN)