CredentialsContainer.cpp [plain text]
#include "config.h"
#include "CredentialsContainer.h"
#if ENABLE(WEB_AUTHN)
#include "AbortSignal.h"
#include "CredentialCreationOptions.h"
#include "CredentialRequestOptions.h"
#include "Document.h"
#include "ExceptionOr.h"
#include "JSDOMPromiseDeferred.h"
#include "Page.h"
#include "SecurityOrigin.h"
namespace WebCore {
CredentialsContainer::CredentialsContainer(WeakPtr<Document>&& document)
: m_document(WTFMove(document))
{
}
bool CredentialsContainer::doesHaveSameOriginAsItsAncestors()
{
if (!m_document)
return false;
auto& origin = m_document->securityOrigin();
for (auto* document = m_document->parentDocument(); document; document = document->parentDocument()) {
if (!origin.isSameOriginAs(document->securityOrigin()))
return false;
}
return true;
}
void CredentialsContainer::get(CredentialRequestOptions&& options, CredentialPromise&& promise)
{
if (!m_document || !m_document->page()) {
promise.reject(Exception { NotSupportedError });
return;
}
if (options.signal && options.signal->aborted()) {
promise.reject(Exception { AbortError, "Aborted by AbortSignal."_s });
return;
}
ASSERT(m_document->isSecureContext());
if (!options.publicKey) {
promise.reject(Exception { NotSupportedError, "Only PublicKeyCredential is supported."_s });
return;
}
if (!m_document->hasFocus()) {
promise.reject(Exception { NotAllowedError, "The document is not focused."_s });
return;
}
m_document->page()->authenticatorCoordinator().discoverFromExternalSource(*m_document, options.publicKey.value(), doesHaveSameOriginAsItsAncestors(), WTFMove(options.signal), WTFMove(promise));
}
void CredentialsContainer::store(const BasicCredential&, CredentialPromise&& promise)
{
promise.reject(Exception { NotSupportedError, "Not implemented."_s });
}
void CredentialsContainer::isCreate(CredentialCreationOptions&& options, CredentialPromise&& promise)
{
if (!m_document || !m_document->page()) {
promise.reject(Exception { NotSupportedError });
return;
}
if (options.signal && options.signal->aborted()) {
promise.reject(Exception { AbortError, "Aborted by AbortSignal."_s });
return;
}
ASSERT(m_document->isSecureContext());
if (!options.publicKey) {
promise.reject(Exception { NotSupportedError, "Only PublicKeyCredential is supported."_s });
return;
}
if (!m_document->hasFocus()) {
promise.reject(Exception { NotAllowedError, "The document is not focused."_s });
return;
}
m_document->page()->authenticatorCoordinator().create(*m_document, options.publicKey.value(), doesHaveSameOriginAsItsAncestors(), WTFMove(options.signal), WTFMove(promise));
}
void CredentialsContainer::preventSilentAccess(DOMPromiseDeferred<void>&& promise) const
{
promise.reject(Exception { NotSupportedError, "Not implemented."_s });
}
}
#endif // ENABLE(WEB_AUTHN)