summaryrefslogtreecommitdiffstats
path: root/dom/webauthn/WebAuthnService.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webauthn/WebAuthnService.h')
-rw-r--r--dom/webauthn/WebAuthnService.h87
1 files changed, 87 insertions, 0 deletions
diff --git a/dom/webauthn/WebAuthnService.h b/dom/webauthn/WebAuthnService.h
new file mode 100644
index 0000000000..254b75d251
--- /dev/null
+++ b/dom/webauthn/WebAuthnService.h
@@ -0,0 +1,87 @@
+/* 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/. */
+
+#ifndef mozilla_dom_WebAuthnService_h_
+#define mozilla_dom_WebAuthnService_h_
+
+#include "nsIWebAuthnService.h"
+#include "AuthrsBridge_ffi.h"
+
+#ifdef MOZ_WIDGET_ANDROID
+# include "AndroidWebAuthnService.h"
+#endif
+
+#ifdef XP_MACOSX
+# include "MacOSWebAuthnService.h"
+#endif
+
+#ifdef XP_WIN
+# include "WinWebAuthnService.h"
+#endif
+
+namespace mozilla::dom {
+
+already_AddRefed<nsIWebAuthnService> NewWebAuthnService();
+
+class WebAuthnService final : public nsIWebAuthnService {
+ public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIWEBAUTHNSERVICE
+
+ WebAuthnService()
+ : mTransactionState(Nothing(), "WebAuthnService::mTransactionState") {
+ Unused << authrs_service_constructor(getter_AddRefs(mAuthrsService));
+#if defined(XP_WIN)
+ if (WinWebAuthnService::AreWebAuthNApisAvailable()) {
+ mPlatformService = new WinWebAuthnService();
+ } else {
+ mPlatformService = mAuthrsService;
+ }
+#elif defined(MOZ_WIDGET_ANDROID)
+ mPlatformService = new AndroidWebAuthnService();
+#elif defined(XP_MACOSX)
+ if (__builtin_available(macos 13.3, *)) {
+ mPlatformService = NewMacOSWebAuthnServiceIfAvailable();
+ }
+ if (!mPlatformService) {
+ mPlatformService = mAuthrsService;
+ }
+#else
+ mPlatformService = mAuthrsService;
+#endif
+ }
+
+ private:
+ ~WebAuthnService() = default;
+
+ nsIWebAuthnService* DefaultService() {
+ if (StaticPrefs::security_webauth_webauthn_enable_softtoken()) {
+ return mAuthrsService;
+ }
+ return mPlatformService;
+ }
+
+ nsIWebAuthnService* AuthrsService() { return mAuthrsService; }
+
+ nsIWebAuthnService* SelectedService() {
+ auto guard = mTransactionState.Lock();
+ if (guard->isSome()) {
+ return guard->ref().service;
+ }
+ return DefaultService();
+ }
+
+ struct TransactionState {
+ nsCOMPtr<nsIWebAuthnService> service;
+ };
+ using TransactionStateMutex = DataMutex<Maybe<TransactionState>>;
+ TransactionStateMutex mTransactionState;
+
+ nsCOMPtr<nsIWebAuthnService> mAuthrsService;
+ nsCOMPtr<nsIWebAuthnService> mPlatformService;
+};
+
+} // namespace mozilla::dom
+
+#endif // mozilla_dom_WebAuthnService_h_