Changeset 249949 in webkit


Ignore:
Timestamp:
Sep 17, 2019 1:17:17 AM (5 years ago)
Author:
jiewen_tan@apple.com
Message:

[WebAuthn] Use WebPreferences instead of RuntimeEnabledFeatures in UIProcess
https://bugs.webkit.org/show_bug.cgi?id=198176
<rdar://problem/55285709>

Reviewed by Youenn Fablet.

Source/WebCore:

No changes of behavior.

  • Modules/webauthn/PublicKeyCredential.cpp:

(WebCore::PublicKeyCredential::isUserVerifyingPlatformAuthenticatorAvailable):
Resolves the promise with false immediately when the feature flag is false.

Source/WebKit:

This patch does the following two things:
1) It merges WebAuthenticationRequestData::creationOptions and requestOptions into a variant, and therefore
merges code paths that involve WebAuthenticationRequestData.
2) It teaches WebAuthenticationRequestData to store a WebPreferences such that AuthenticatorManager could utilize
runtime feature flags to turn features on or off.

  • UIProcess/WebAuthentication/Authenticator.cpp:

(WebKit::Authenticator::handleRequest):

  • UIProcess/WebAuthentication/AuthenticatorManager.cpp:

(WebKit::AuthenticatorManager::handleRequest):
(WebKit::AuthenticatorManager::clearState):
(WebKit::AuthenticatorManager::authenticatorAdded):
(WebKit::AuthenticatorManager::startDiscovery):
(WebKit::AuthenticatorManager::makeCredential): Deleted.
(WebKit::AuthenticatorManager::getAssertion): Deleted.

  • UIProcess/WebAuthentication/AuthenticatorManager.h:
  • UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm:

(WebKit::LocalAuthenticator::makeCredential):
(WebKit::LocalAuthenticator::continueMakeCredentialAfterUserConsented):
(WebKit::LocalAuthenticator::continueMakeCredentialAfterAttested):
(WebKit::LocalAuthenticator::getAssertion):
(WebKit::LocalAuthenticator::continueGetAssertionAfterUserConsented):

  • UIProcess/WebAuthentication/Cocoa/LocalService.mm:

(WebKit::LocalService::isAvailable):
Don't check RuntimeEnabledFeatures given it is for WebCore.

  • UIProcess/WebAuthentication/WebAuthenticationRequestData.h:

(): Deleted.

  • UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp:

(WebKit::WebAuthenticatorCoordinatorProxy::makeCredential):
(WebKit::WebAuthenticatorCoordinatorProxy::getAssertion):
(WebKit::WebAuthenticatorCoordinatorProxy::handleRequest):

  • UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.h:
  • UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp:

(WebKit::CtapAuthenticator::makeCredential):
(WebKit::CtapAuthenticator::continueMakeCredentialAfterResponseReceived const):
(WebKit::CtapAuthenticator::getAssertion):

  • UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp:

(WebKit::U2fAuthenticator::makeCredential):
(WebKit::U2fAuthenticator::checkExcludeList):
(WebKit::U2fAuthenticator::issueRegisterCommand):
(WebKit::U2fAuthenticator::getAssertion):
(WebKit::U2fAuthenticator::issueSignCommand):
(WebKit::U2fAuthenticator::continueRegisterCommandAfterResponseReceived):
(WebKit::U2fAuthenticator::continueSignCommandAfterResponseReceived):

Location:
trunk/Source
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r249946 r249949  
     12019-09-17  Jiewen Tan  <jiewen_tan@apple.com>
     2
     3        [WebAuthn] Use WebPreferences instead of RuntimeEnabledFeatures in UIProcess
     4        https://bugs.webkit.org/show_bug.cgi?id=198176
     5        <rdar://problem/55285709>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        No changes of behavior.
     10
     11        * Modules/webauthn/PublicKeyCredential.cpp:
     12        (WebCore::PublicKeyCredential::isUserVerifyingPlatformAuthenticatorAvailable):
     13        Resolves the promise with false immediately when the feature flag is false.
     14
    1152019-09-17  Rob Buis  <rbuis@igalia.com>
    216
  • trunk/Source/WebCore/Modules/webauthn/PublicKeyCredential.cpp

    r243193 r249949  
    3737#include "Page.h"
    3838#include "PublicKeyCredentialData.h"
     39#include "RuntimeEnabledFeatures.h"
    3940#include <wtf/text/Base64.h>
    4041
     
    7475void PublicKeyCredential::isUserVerifyingPlatformAuthenticatorAvailable(Document& document, DOMPromiseDeferred<IDLBoolean>&& promise)
    7576{
     77    if (!RuntimeEnabledFeatures::sharedFeatures().webAuthenticationLocalAuthenticatorEnabled()) {
     78        promise.resolve(false);
     79        return;
     80    }
    7681    document.page()->authenticatorCoordinator().isUserVerifyingPlatformAuthenticatorAvailable(WTFMove(promise));
    7782}
  • trunk/Source/WebKit/ChangeLog

    r249948 r249949  
     12019-09-17  Jiewen Tan  <jiewen_tan@apple.com>
     2
     3        [WebAuthn] Use WebPreferences instead of RuntimeEnabledFeatures in UIProcess
     4        https://bugs.webkit.org/show_bug.cgi?id=198176
     5        <rdar://problem/55285709>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        This patch does the following two things:
     10        1) It merges WebAuthenticationRequestData::creationOptions and requestOptions into a variant, and therefore
     11        merges code paths that involve WebAuthenticationRequestData.
     12        2) It teaches WebAuthenticationRequestData to store a WebPreferences such that AuthenticatorManager could utilize
     13        runtime feature flags to turn features on or off.
     14
     15        * UIProcess/WebAuthentication/Authenticator.cpp:
     16        (WebKit::Authenticator::handleRequest):
     17        * UIProcess/WebAuthentication/AuthenticatorManager.cpp:
     18        (WebKit::AuthenticatorManager::handleRequest):
     19        (WebKit::AuthenticatorManager::clearState):
     20        (WebKit::AuthenticatorManager::authenticatorAdded):
     21        (WebKit::AuthenticatorManager::startDiscovery):
     22        (WebKit::AuthenticatorManager::makeCredential): Deleted.
     23        (WebKit::AuthenticatorManager::getAssertion): Deleted.
     24        * UIProcess/WebAuthentication/AuthenticatorManager.h:
     25        * UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm:
     26        (WebKit::LocalAuthenticator::makeCredential):
     27        (WebKit::LocalAuthenticator::continueMakeCredentialAfterUserConsented):
     28        (WebKit::LocalAuthenticator::continueMakeCredentialAfterAttested):
     29        (WebKit::LocalAuthenticator::getAssertion):
     30        (WebKit::LocalAuthenticator::continueGetAssertionAfterUserConsented):
     31        * UIProcess/WebAuthentication/Cocoa/LocalService.mm:
     32        (WebKit::LocalService::isAvailable):
     33        Don't check RuntimeEnabledFeatures given it is for WebCore.
     34        * UIProcess/WebAuthentication/WebAuthenticationRequestData.h:
     35        (): Deleted.
     36        * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp:
     37        (WebKit::WebAuthenticatorCoordinatorProxy::makeCredential):
     38        (WebKit::WebAuthenticatorCoordinatorProxy::getAssertion):
     39        (WebKit::WebAuthenticatorCoordinatorProxy::handleRequest):
     40        * UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.h:
     41        * UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp:
     42        (WebKit::CtapAuthenticator::makeCredential):
     43        (WebKit::CtapAuthenticator::continueMakeCredentialAfterResponseReceived const):
     44        (WebKit::CtapAuthenticator::getAssertion):
     45        * UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp:
     46        (WebKit::U2fAuthenticator::makeCredential):
     47        (WebKit::U2fAuthenticator::checkExcludeList):
     48        (WebKit::U2fAuthenticator::issueRegisterCommand):
     49        (WebKit::U2fAuthenticator::getAssertion):
     50        (WebKit::U2fAuthenticator::issueSignCommand):
     51        (WebKit::U2fAuthenticator::continueRegisterCommandAfterResponseReceived):
     52        (WebKit::U2fAuthenticator::continueSignCommandAfterResponseReceived):
     53
    1542019-09-17  Carlos Garcia Campos  <cgarcia@igalia.com>
    255
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Authenticator.cpp

    r236481 r249949  
    3737    m_pendingRequestData = data;
    3838    // Enforce asynchronous execution of makeCredential/getAssertion.
    39     RunLoop::main().dispatch([weakThis = makeWeakPtr(*this)] {
     39    RunLoop::main().dispatch([weakThis = makeWeakPtr(*this), this] {
    4040        if (!weakThis)
    4141            return;
    42         if (weakThis->m_pendingRequestData.isCreationRequest)
    43             weakThis->makeCredential();
     42        if (WTF::holds_alternative<WebCore::PublicKeyCredentialCreationOptions>(m_pendingRequestData.options))
     43            makeCredential();
    4444        else
    45             weakThis->getAssertion();
     45            getAssertion();
    4646    });
    4747}
  • trunk/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.cpp

    r249108 r249949  
    2929#if ENABLE(WEB_AUTHN)
    3030
     31#include "WebPreferencesKeys.h"
    3132#include <WebCore/AuthenticatorTransport.h>
    3233#include <WebCore/PublicKeyCredentialCreationOptions.h>
     
    120121}
    121122
    122 void AuthenticatorManager::makeCredential(const Vector<uint8_t>& hash, const PublicKeyCredentialCreationOptions& options, Callback&& callback)
     123void AuthenticatorManager::handleRequest(WebAuthenticationRequestData&& data, Callback&& callback)
    123124{
    124125    using namespace AuthenticatorManagerInternal;
     
    131132
    132133    // 1. Save request for async operations.
    133     m_pendingRequestData = { hash, true, options, { } };
     134    m_pendingRequestData = WTFMove(data);
    134135    m_pendingCompletionHandler = WTFMove(callback);
    135     initTimeOutTimer(options.timeout);
    136136
    137137    // 2. Get available transports and start discovering authenticators on them.
    138     startDiscovery(collectTransports(options.authenticatorSelection));
    139 }
    140 
    141 void AuthenticatorManager::getAssertion(const Vector<uint8_t>& hash, const PublicKeyCredentialRequestOptions& options, Callback&& callback)
    142 {
    143     using namespace AuthenticatorManagerInternal;
    144 
    145     if (m_pendingCompletionHandler) {
    146         m_pendingCompletionHandler(ExceptionData { NotAllowedError, "This request has been cancelled by a new request."_s });
    147         m_requestTimeOutTimer.stop();
    148     }
    149     clearState();
    150 
    151     // 1. Save request for async operations.
    152     m_pendingRequestData = { hash, false, { }, options };
    153     m_pendingCompletionHandler = WTFMove(callback);
    154     initTimeOutTimer(options.timeout);
    155 
    156     // 2. Get available transports and start discovering authenticators on them.
    157     ASSERT(m_services.isEmpty());
    158     startDiscovery(collectTransports(options.allowCredentials));
     138    WTF::switchOn(m_pendingRequestData.options, [&](const PublicKeyCredentialCreationOptions& options) {
     139        initTimeOutTimer(options.timeout);
     140        startDiscovery(collectTransports(options.authenticatorSelection));
     141    }, [&](const  PublicKeyCredentialRequestOptions& options) {
     142        initTimeOutTimer(options.timeout);
     143        startDiscovery(collectTransports(options.allowCredentials));
     144    });
    159145}
    160146
     
    229215    using namespace AuthenticatorManagerInternal;
    230216
    231     ASSERT(m_services.isEmpty() && transports.size() <= maxTransportNumber);
     217    ASSERT(m_services.isEmpty() && transports.size() <= maxTransportNumber && m_pendingRequestData.preferences);
    232218    for (auto& transport : transports) {
     219        if (transport == AuthenticatorTransport::Internal && !m_pendingRequestData.preferences->store().getBoolValueForKey(WebPreferencesKey::webAuthenticationLocalAuthenticatorEnabledKey()))
     220            continue;
    233221        auto service = createService(transport, *this);
    234222        service->startDiscovery();
  • trunk/Source/WebKit/UIProcess/WebAuthentication/AuthenticatorManager.h

    r245987 r249949  
    5555    virtual ~AuthenticatorManager() = default;
    5656
    57     void makeCredential(const Vector<uint8_t>& hash, const WebCore::PublicKeyCredentialCreationOptions&, Callback&&);
    58     void getAssertion(const Vector<uint8_t>& hash, const WebCore::PublicKeyCredentialRequestOptions&, Callback&&);
     57    void handleRequest(WebAuthenticationRequestData&&, Callback&&);
    5958
    6059    virtual bool isMock() const { return false; }
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Cocoa/LocalAuthenticator.mm

    r248324 r249949  
    9292    ASSERT(m_state == State::Init);
    9393    m_state = State::RequestReceived;
     94    auto& creationOptions = WTF::get<PublicKeyCredentialCreationOptions>(requestData().options);
    9495
    9596    // The following implements https://www.w3.org/TR/webauthn/#op-make-cred as of 5 December 2017.
     
    99100    // Step 2.
    100101    bool canFullfillPubKeyCredParams = false;
    101     for (auto& pubKeyCredParam : requestData().creationOptions.pubKeyCredParams) {
     102    for (auto& pubKeyCredParam : creationOptions.pubKeyCredParams) {
    102103        if (pubKeyCredParam.type == PublicKeyCredentialType::PublicKey && pubKeyCredParam.alg == COSE::ES256) {
    103104            canFullfillPubKeyCredParams = true;
     
    111112
    112113    // Step 3.
    113     HashSet<String> excludeCredentialIds = produceHashSet(requestData().creationOptions.excludeCredentials);
     114    auto excludeCredentialIds = produceHashSet(creationOptions.excludeCredentials);
    114115    if (!excludeCredentialIds.isEmpty()) {
    115116        // Search Keychain for the RP ID.
     
    117118            (id)kSecClass: (id)kSecClassKey,
    118119            (id)kSecAttrKeyClass: (id)kSecAttrKeyClassPrivate,
    119             (id)kSecAttrLabel: requestData().creationOptions.rp.id,
     120            (id)kSecAttrLabel: creationOptions.rp.id,
    120121            (id)kSecReturnAttributes: @YES,
    121122            (id)kSecMatchLimit: (id)kSecMatchLimitAll,
     
    155156    };
    156157    m_connection->getUserConsent(
    157         "allow " + requestData().creationOptions.rp.id + " to create a public key credential for " + requestData().creationOptions.user.name,
     158        "allow " + creationOptions.rp.id + " to create a public key credential for " + creationOptions.user.name,
    158159        WTFMove(callback));
    159160}
     
    163164    ASSERT(m_state == State::RequestReceived);
    164165    m_state = State::UserConsented;
     166    auto& creationOptions = WTF::get<PublicKeyCredentialCreationOptions>(requestData().options);
    165167
    166168    if (consent == LocalConnection::UserConsent::No) {
     
    174176    NSDictionary* deleteQuery = @{
    175177        (id)kSecClass: (id)kSecClassKey,
    176         (id)kSecAttrLabel: requestData().creationOptions.rp.id,
    177         (id)kSecAttrApplicationTag: [NSData dataWithBytes:requestData().creationOptions.user.idVector.data() length:requestData().creationOptions.user.idVector.size()],
     178        (id)kSecAttrLabel: creationOptions.rp.id,
     179        (id)kSecAttrApplicationTag: [NSData dataWithBytes:creationOptions.user.idVector.data() length:creationOptions.user.idVector.size()],
    178180#if HAVE(DATA_PROTECTION_KEYCHAIN)
    179181        (id)kSecUseDataProtectionKeychain: @YES
     
    196198        weakThis->continueMakeCredentialAfterAttested(privateKey, certificates, error);
    197199    };
    198     m_connection->getAttestation(requestData().creationOptions.rp.id, requestData().creationOptions.user.name, requestData().hash, WTFMove(callback));
     200    m_connection->getAttestation(creationOptions.rp.id, creationOptions.user.name, requestData().hash, WTFMove(callback));
    199201}
    200202
     
    205207    ASSERT(m_state == State::UserConsented);
    206208    m_state = State::Attested;
     209    auto& creationOptions = WTF::get<PublicKeyCredentialCreationOptions>(requestData().options);
    207210
    208211    if (error) {
     
    230233    {
    231234        // -rk-ucrt is added by DeviceIdentity.Framework.
    232         String label = makeString(requestData().creationOptions.user.name, "@", requestData().creationOptions.rp.id, "-rk-ucrt");
     235        String label = makeString(creationOptions.user.name, "@", creationOptions.rp.id, "-rk-ucrt");
    233236        NSDictionary *credentialIdQuery = @{
    234237            (id)kSecClass: (id)kSecClassKey,
     
    265268        };
    266269        NSDictionary *updateParams = @{
    267             (id)kSecAttrLabel: requestData().creationOptions.rp.id,
    268             (id)kSecAttrApplicationTag: [NSData dataWithBytes:requestData().creationOptions.user.idVector.data() length:requestData().creationOptions.user.idVector.size()],
     270            (id)kSecAttrLabel: creationOptions.rp.id,
     271            (id)kSecAttrApplicationTag: [NSData dataWithBytes:creationOptions.user.idVector.data() length:creationOptions.user.idVector.size()],
    269272        };
    270273        status = SecItemUpdate((__bridge CFDictionaryRef)updateQuery, (__bridge CFDictionaryRef)updateParams);
     
    309312
    310313    // Step 12.
    311     auto authData = buildAuthData(requestData().creationOptions.rp.id, makeCredentialFlags, counter, attestedCredentialData);
     314    auto authData = buildAuthData(creationOptions.rp.id, makeCredentialFlags, counter, attestedCredentialData);
    312315
    313316    // Step 13. Apple Attestation Cont'
     
    336339        attestationStatementMap[cbor::CBORValue("x5c")] = cbor::CBORValue(WTFMove(cborArray));
    337340    }
    338     auto attestationObject = buildAttestationObject(WTFMove(authData), "Apple", WTFMove(attestationStatementMap), requestData().creationOptions.attestation);
     341    auto attestationObject = buildAttestationObject(WTFMove(authData), "Apple", WTFMove(attestationStatementMap), creationOptions.attestation);
    339342
    340343    receiveRespond(PublicKeyCredentialData { ArrayBuffer::create(credentialId.data(), credentialId.size()), true, nullptr, ArrayBuffer::create(attestationObject.data(), attestationObject.size()), nullptr, nullptr, nullptr, WTF::nullopt });
     
    346349    ASSERT(m_state == State::Init);
    347350    m_state = State::RequestReceived;
     351    auto& requestOptions = WTF::get<PublicKeyCredentialRequestOptions>(requestData().options);
    348352
    349353    // The following implements https://www.w3.org/TR/webauthn/#op-get-assertion as of 5 December 2017.
     
    352356    // Step 12 is implicitly captured by all UnknownError exception callbacks.
    353357    // Step 3-5. Unlike the spec, if an allow list is provided and there is no intersection between existing ones and the allow list, we always return NotAllowedError.
    354     HashSet<String> allowCredentialIds = produceHashSet(requestData().requestOptions.allowCredentials);
    355     if (!requestData().requestOptions.allowCredentials.isEmpty() && allowCredentialIds.isEmpty()) {
     358    auto allowCredentialIds = produceHashSet(requestOptions.allowCredentials);
     359    if (!requestOptions.allowCredentials.isEmpty() && allowCredentialIds.isEmpty()) {
    356360        receiveRespond(ExceptionData { NotAllowedError, "No matched credentials are found in the platform attached authenticator."_s });
    357361        return;
     
    362366        (id)kSecClass: (id)kSecClassKey,
    363367        (id)kSecAttrKeyClass: (id)kSecAttrKeyClassPrivate,
    364         (id)kSecAttrLabel: requestData().requestOptions.rpId,
     368        (id)kSecAttrLabel: requestOptions.rpId,
    365369        (id)kSecReturnAttributes: @YES,
    366370        (id)kSecMatchLimit: (id)kSecMatchLimitAll,
     
    381385
    382386    NSArray *intersectedCredentialsAttributes = nil;
    383     if (requestData().requestOptions.allowCredentials.isEmpty())
     387    if (requestOptions.allowCredentials.isEmpty())
    384388        intersectedCredentialsAttributes = (NSArray *)attributesArrayRef;
    385389    else {
     
    417421    StringView idStringView { static_cast<const UChar*>([idData bytes]), static_cast<unsigned>([idData length]) };
    418422    m_connection->getUserConsent(
    419         makeString("log into ", requestData().requestOptions.rpId, " with ", idStringView),
     423        makeString("log into ", requestOptions.rpId, " with ", idStringView),
    420424        (__bridge SecAccessControlRef)selectedCredentialAttributes[(id)kSecAttrAccessControl],
    421425        WTFMove(callback));
     
    437441    // Therefore, it is always zero.
    438442    uint32_t counter = 0;
    439     auto authData = buildAuthData(requestData().requestOptions.rpId, getAssertionFlags, counter, { });
     443    auto authData = buildAuthData(WTF::get<PublicKeyCredentialRequestOptions>(requestData().options).rpId, getAssertionFlags, counter, { });
    440444
    441445    // Step 11.
  • trunk/Source/WebKit/UIProcess/WebAuthentication/Cocoa/LocalService.mm

    r248308 r249949  
    4545bool LocalService::isAvailable()
    4646{
    47     // FIXME(198176)
    48     if (!WebCore::RuntimeEnabledFeatures::sharedFeatures().webAuthenticationLocalAuthenticatorEnabled())
    49         return false;
    50 
    5147    auto context = adoptNS([allocLAContextInstance() init]);
    5248    NSError *error = nil;
  • trunk/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticationRequestData.h

    r236481 r249949  
    2828#if ENABLE(WEB_AUTHN)
    2929
     30#include "WebPreferences.h"
    3031#include <WebCore/PublicKeyCredentialCreationOptions.h>
    3132#include <WebCore/PublicKeyCredentialRequestOptions.h>
     33#include <wtf/Variant.h>
    3234#include <wtf/Vector.h>
    3335
     
    3638struct WebAuthenticationRequestData {
    3739    Vector<uint8_t> hash;
    38     // FIXME: Maybe we could make an ABC of Options and then use safe casting here.
    39     bool isCreationRequest { true };
    40     WebCore::PublicKeyCredentialCreationOptions creationOptions;
    41     WebCore::PublicKeyCredentialRequestOptions requestOptions;
     40    Variant<WebCore::PublicKeyCredentialCreationOptions, WebCore::PublicKeyCredentialRequestOptions> options;
     41    RefPtr<WebPreferences> preferences;
    4242};
    4343
  • trunk/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.cpp

    r249275 r249949  
    5656void WebAuthenticatorCoordinatorProxy::makeCredential(uint64_t messageId, const Vector<uint8_t>& hash, const WebCore::PublicKeyCredentialCreationOptions& options)
    5757{
    58     auto callback = [messageId, weakThis = makeWeakPtr(*this)] (Variant<WebCore::PublicKeyCredentialData, WebCore::ExceptionData>&& result) {
    59         ASSERT(RunLoop::isMain());
    60         if (!weakThis)
    61             return;
    62 
    63         WTF::switchOn(result, [&](const WebCore::PublicKeyCredentialData& data) {
    64             weakThis->requestReply(messageId, data, { });
    65         }, [&](const  WebCore::ExceptionData& exception) {
    66             weakThis->requestReply(messageId, { }, exception);
    67         });
    68     };
    69     m_webPageProxy.websiteDataStore().authenticatorManager().makeCredential(hash, options, WTFMove(callback));
     58    handleRequest(messageId, { hash, options, m_webPageProxy.preferences().copy() });
    7059}
    7160
    7261void WebAuthenticatorCoordinatorProxy::getAssertion(uint64_t messageId, const Vector<uint8_t>& hash, const WebCore::PublicKeyCredentialRequestOptions& options)
     62{
     63    handleRequest(messageId, { hash, options, m_webPageProxy.preferences().copy() });
     64}
     65
     66void WebAuthenticatorCoordinatorProxy::handleRequest(uint64_t messageId, WebAuthenticationRequestData&& data)
    7367{
    7468    auto callback = [messageId, weakThis = makeWeakPtr(*this)] (Variant<WebCore::PublicKeyCredentialData, WebCore::ExceptionData>&& result) {
     
    8377        });
    8478    };
    85     m_webPageProxy.websiteDataStore().authenticatorManager().getAssertion(hash, options, WTFMove(callback));
     79    m_webPageProxy.websiteDataStore().authenticatorManager().handleRequest(WTFMove(data), WTFMove(callback));
    8680}
    8781
  • trunk/Source/WebKit/UIProcess/WebAuthentication/WebAuthenticatorCoordinatorProxy.h

    r248762 r249949  
    4444class WebPageProxy;
    4545
     46struct WebAuthenticationRequestData;
     47
    4648class WebAuthenticatorCoordinatorProxy : private IPC::MessageReceiver, public CanMakeWeakPtr<WebAuthenticatorCoordinatorProxy> {
    4749    WTF_MAKE_FAST_ALLOCATED;
     
    6365    void requestReply(uint64_t messageId, const WebCore::PublicKeyCredentialData&, const WebCore::ExceptionData&);
    6466
     67    void handleRequest(uint64_t messageId, WebAuthenticationRequestData&&);
     68
    6569    WebPageProxy& m_webPageProxy;
    6670};
  • trunk/Source/WebKit/UIProcess/WebAuthentication/fido/CtapAuthenticator.cpp

    r249059 r249949  
    5353{
    5454    ASSERT(!m_isDowngraded);
    55     auto cborCmd = encodeMakeCredenitalRequestAsCBOR(requestData().hash, requestData().creationOptions, m_info.options().userVerificationAvailability());
     55    auto cborCmd = encodeMakeCredenitalRequestAsCBOR(requestData().hash, WTF::get<PublicKeyCredentialCreationOptions>(requestData().options), m_info.options().userVerificationAvailability());
    5656    m_driver->transact(WTFMove(cborCmd), [weakThis = makeWeakPtr(*this)](Vector<uint8_t>&& data) {
    5757        ASSERT(RunLoop::isMain());
     
    6464void CtapAuthenticator::continueMakeCredentialAfterResponseReceived(Vector<uint8_t>&& data) const
    6565{
    66     auto response = readCTAPMakeCredentialResponse(data, requestData().creationOptions.attestation);
     66    auto response = readCTAPMakeCredentialResponse(data, WTF::get<PublicKeyCredentialCreationOptions>(requestData().options).attestation);
    6767    if (!response) {
    6868        auto error = getResponseCode(data);
     
    7979{
    8080    ASSERT(!m_isDowngraded);
    81     auto cborCmd = encodeGetAssertionRequestAsCBOR(requestData().hash, requestData().requestOptions, m_info.options().userVerificationAvailability());
     81    auto cborCmd = encodeGetAssertionRequestAsCBOR(requestData().hash, WTF::get<PublicKeyCredentialRequestOptions>(requestData().options), m_info.options().userVerificationAvailability());
    8282    m_driver->transact(WTFMove(cborCmd), [weakThis = makeWeakPtr(*this)](Vector<uint8_t>&& data) {
    8383        ASSERT(RunLoop::isMain());
  • trunk/Source/WebKit/UIProcess/WebAuthentication/fido/U2fAuthenticator.cpp

    r249059 r249949  
    5656void U2fAuthenticator::makeCredential()
    5757{
    58     if (!isConvertibleToU2fRegisterCommand(requestData().creationOptions)) {
     58    auto& creationOptions = WTF::get<PublicKeyCredentialCreationOptions>(requestData().options);
     59    if (!isConvertibleToU2fRegisterCommand(creationOptions)) {
    5960        receiveRespond(ExceptionData { NotSupportedError, "Cannot convert the request to U2F command."_s });
    6061        return;
    6162    }
    62     if (!requestData().creationOptions.excludeCredentials.isEmpty()) {
     63    if (!creationOptions.excludeCredentials.isEmpty()) {
    6364        ASSERT(!m_nextListIndex);
    6465        checkExcludeList(m_nextListIndex++);
     
    7071void U2fAuthenticator::checkExcludeList(size_t index)
    7172{
    72     if (index >= requestData().creationOptions.excludeCredentials.size()) {
     73    auto& creationOptions = WTF::get<PublicKeyCredentialCreationOptions>(requestData().options);
     74    if (index >= creationOptions.excludeCredentials.size()) {
    7375        issueRegisterCommand();
    7476        return;
    7577    }
    76     auto u2fCmd = convertToU2fCheckOnlySignCommand(requestData().hash, requestData().creationOptions, requestData().creationOptions.excludeCredentials[index]);
     78    auto u2fCmd = convertToU2fCheckOnlySignCommand(requestData().hash, creationOptions, creationOptions.excludeCredentials[index]);
    7779    ASSERT(u2fCmd);
    7880    issueNewCommand(WTFMove(*u2fCmd), CommandType::CheckOnlyCommand);
     
    8183void U2fAuthenticator::issueRegisterCommand()
    8284{
    83     auto u2fCmd = convertToU2fRegisterCommand(requestData().hash, requestData().creationOptions);
     85    auto u2fCmd = convertToU2fRegisterCommand(requestData().hash, WTF::get<PublicKeyCredentialCreationOptions>(requestData().options));
    8486    ASSERT(u2fCmd);
    8587    issueNewCommand(WTFMove(*u2fCmd), CommandType::RegisterCommand);
     
    8890void U2fAuthenticator::getAssertion()
    8991{
    90     if (!isConvertibleToU2fSignCommand(requestData().requestOptions)) {
     92    if (!isConvertibleToU2fSignCommand(WTF::get<PublicKeyCredentialRequestOptions>(requestData().options))) {
    9193        receiveRespond(ExceptionData { NotSupportedError, "Cannot convert the request to U2F command."_s });
    9294        return;
     
    98100void U2fAuthenticator::issueSignCommand(size_t index)
    99101{
    100     if (index >= requestData().requestOptions.allowCredentials.size()) {
     102    auto& requestOptions = WTF::get<PublicKeyCredentialRequestOptions>(requestData().options);
     103    if (index >= requestOptions.allowCredentials.size()) {
    101104        receiveRespond(ExceptionData { NotAllowedError, "No credentials from the allowCredentials list is found in the authenticator."_s });
    102105        return;
    103106    }
    104     auto u2fCmd = convertToU2fSignCommand(requestData().hash, requestData().requestOptions, requestData().requestOptions.allowCredentials[index].idVector, m_isAppId);
     107    auto u2fCmd = convertToU2fSignCommand(requestData().hash, requestOptions, requestOptions.allowCredentials[index].idVector, m_isAppId);
    105108    ASSERT(u2fCmd);
    106109    issueNewCommand(WTFMove(*u2fCmd), CommandType::SignCommand);
     
    153156    switch (apduResponse.status()) {
    154157    case ApduResponse::Status::SW_NO_ERROR: {
    155         auto response = readU2fRegisterResponse(requestData().creationOptions.rp.id, apduResponse.data(), requestData().creationOptions.attestation);
     158        auto response = readU2fRegisterResponse(WTF::get<PublicKeyCredentialCreationOptions>(requestData().options).rp.id, apduResponse.data(), WTF::get<PublicKeyCredentialCreationOptions>(requestData().options).attestation);
    156159        if (!response) {
    157160            receiveRespond(ExceptionData { UnknownError, "Couldn't parse the U2F register response."_s });
     
    199202void U2fAuthenticator::continueSignCommandAfterResponseReceived(ApduResponse&& apduResponse)
    200203{
     204    auto& requestOptions = WTF::get<PublicKeyCredentialRequestOptions>(requestData().options);
    201205    switch (apduResponse.status()) {
    202206    case ApduResponse::Status::SW_NO_ERROR: {
    203207        Optional<PublicKeyCredentialData> response;
    204208        if (m_isAppId) {
    205             ASSERT(requestData().requestOptions.extensions && !requestData().requestOptions.extensions->appid.isNull());
    206             response = readU2fSignResponse(requestData().requestOptions.extensions->appid, requestData().requestOptions.allowCredentials[m_nextListIndex - 1].idVector, apduResponse.data());
     209            ASSERT(requestOptions.extensions && !requestOptions.extensions->appid.isNull());
     210            response = readU2fSignResponse(requestOptions.extensions->appid, requestOptions.allowCredentials[m_nextListIndex - 1].idVector, apduResponse.data());
    207211        } else
    208             response = readU2fSignResponse(requestData().requestOptions.rpId, requestData().requestOptions.allowCredentials[m_nextListIndex - 1].idVector, apduResponse.data());
     212            response = readU2fSignResponse(requestOptions.rpId, requestOptions.allowCredentials[m_nextListIndex - 1].idVector, apduResponse.data());
    209213        if (!response) {
    210214            receiveRespond(ExceptionData { UnknownError, "Couldn't parse the U2F sign response."_s });
     
    222226        return;
    223227    case ApduResponse::Status::SW_WRONG_DATA:
    224         if (requestData().requestOptions.extensions && !requestData().requestOptions.extensions->appid.isNull()) {
     228        if (requestOptions.extensions && !requestOptions.extensions->appid.isNull()) {
    225229            if (!m_isAppId) {
    226230                m_isAppId = true;
Note: See TracChangeset for help on using the changeset viewer.