From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- dom/webauthn/PublicKeyCredential.cpp | 168 +++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 dom/webauthn/PublicKeyCredential.cpp (limited to 'dom/webauthn/PublicKeyCredential.cpp') diff --git a/dom/webauthn/PublicKeyCredential.cpp b/dom/webauthn/PublicKeyCredential.cpp new file mode 100644 index 0000000000..a9f40c436b --- /dev/null +++ b/dom/webauthn/PublicKeyCredential.cpp @@ -0,0 +1,168 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/dom/Promise.h" +#include "mozilla/dom/PublicKeyCredential.h" +#include "mozilla/dom/WebAuthenticationBinding.h" +#include "nsCycleCollectionParticipant.h" +#include "mozilla/dom/AuthenticatorResponse.h" +#include "mozilla/HoldDropJSObjects.h" +#include "mozilla/Preferences.h" + +#ifdef OS_WIN +# include "WinWebAuthnManager.h" +#endif + +#ifdef MOZ_WIDGET_ANDROID +# include "mozilla/java/WebAuthnTokenManagerWrappers.h" +#endif + +namespace mozilla::dom { + +NS_IMPL_CYCLE_COLLECTION_CLASS(PublicKeyCredential) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PublicKeyCredential, Credential) + tmp->mRawIdCachedObj = nullptr; +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PublicKeyCredential, Credential) + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mRawIdCachedObj) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PublicKeyCredential, + Credential) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mResponse) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_ADDREF_INHERITED(PublicKeyCredential, Credential) +NS_IMPL_RELEASE_INHERITED(PublicKeyCredential, Credential) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PublicKeyCredential) +NS_INTERFACE_MAP_END_INHERITING(Credential) + +PublicKeyCredential::PublicKeyCredential(nsPIDOMWindowInner* aParent) + : Credential(aParent), mRawIdCachedObj(nullptr) { + mozilla::HoldJSObjects(this); +} + +PublicKeyCredential::~PublicKeyCredential() { mozilla::DropJSObjects(this); } + +JSObject* PublicKeyCredential::WrapObject(JSContext* aCx, + JS::Handle aGivenProto) { + return PublicKeyCredential_Binding::Wrap(aCx, this, aGivenProto); +} + +void PublicKeyCredential::GetRawId(JSContext* aCx, + JS::MutableHandle aValue, + ErrorResult& aRv) { + if (!mRawIdCachedObj) { + mRawIdCachedObj = mRawId.ToArrayBuffer(aCx); + if (!mRawIdCachedObj) { + aRv.NoteJSContextException(aCx); + return; + } + } + aValue.set(mRawIdCachedObj); +} + +already_AddRefed PublicKeyCredential::Response() const { + RefPtr temp(mResponse); + return temp.forget(); +} + +nsresult PublicKeyCredential::SetRawId(CryptoBuffer& aBuffer) { + if (NS_WARN_IF(!mRawId.Assign(aBuffer))) { + return NS_ERROR_OUT_OF_MEMORY; + } + return NS_OK; +} + +void PublicKeyCredential::SetResponse(RefPtr aResponse) { + mResponse = aResponse; +} + +/* static */ +already_AddRefed +PublicKeyCredential::IsUserVerifyingPlatformAuthenticatorAvailable( + GlobalObject& aGlobal, ErrorResult& aError) { + RefPtr promise = + Promise::Create(xpc::CurrentNativeGlobal(aGlobal.Context()), aError); + if (aError.Failed()) { + return nullptr; + } + +// https://w3c.github.io/webauthn/#isUserVerifyingPlatformAuthenticatorAvailable +// +// If on latest windows, call system APIs, otherwise return false, as we don't +// have other UVPAAs available at this time. +#ifdef OS_WIN + + if (WinWebAuthnManager::IsUserVerifyingPlatformAuthenticatorAvailable()) { + promise->MaybeResolve(true); + return promise.forget(); + } + + promise->MaybeResolve(false); +#elif defined(MOZ_WIDGET_ANDROID) + auto result = java::WebAuthnTokenManager:: + WebAuthnIsUserVerifyingPlatformAuthenticatorAvailable(); + auto geckoResult = java::GeckoResult::LocalRef(std::move(result)); + MozPromise::FromGeckoResult(geckoResult) + ->Then(GetMainThreadSerialEventTarget(), __func__, + [promise](const MozPromise::ResolveOrRejectValue& aValue) { + if (aValue.IsResolve()) { + promise->MaybeResolve(aValue.ResolveValue()); + } + }); +#else + promise->MaybeResolve(false); +#endif + return promise.forget(); +} + +/* static */ +already_AddRefed +PublicKeyCredential::IsExternalCTAP2SecurityKeySupported(GlobalObject& aGlobal, + ErrorResult& aError) { + RefPtr promise = + Promise::Create(xpc::CurrentNativeGlobal(aGlobal.Context()), aError); + if (aError.Failed()) { + return nullptr; + } + +#ifdef OS_WIN + if (WinWebAuthnManager::AreWebAuthNApisAvailable()) { + promise->MaybeResolve(true); + } else { + promise->MaybeResolve(Preferences::GetBool("security.webauthn.ctap2")); + } +#elif defined(MOZ_WIDGET_ANDROID) + promise->MaybeResolve(false); +#else + promise->MaybeResolve(Preferences::GetBool("security.webauthn.ctap2")); +#endif + + return promise.forget(); +} + +void PublicKeyCredential::GetClientExtensionResults( + AuthenticationExtensionsClientOutputs& aResult) { + aResult = mClientExtensionOutputs; +} + +void PublicKeyCredential::SetClientExtensionResultAppId(bool aResult) { + mClientExtensionOutputs.mAppid.Construct(); + mClientExtensionOutputs.mAppid.Value() = aResult; +} + +void PublicKeyCredential::SetClientExtensionResultHmacSecret( + bool aHmacCreateSecret) { + mClientExtensionOutputs.mHmacCreateSecret.Construct(); + mClientExtensionOutputs.mHmacCreateSecret.Value() = aHmacCreateSecret; +} + +} // namespace mozilla::dom -- cgit v1.2.3