/* -*- 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/IdentityNetworkHelpers.h" namespace mozilla::dom { RefPtr> IdentityNetworkHelpers::FetchWellKnownHelper( nsIURI* aWellKnown, nsIPrincipal* aTriggeringPrincipal) { RefPtr::Private> result = new MozPromise::Private( __func__); nsresult rv; nsCOMPtr ccService = mozilla::components::CredentialChooserService::Service(&rv); if (NS_FAILED(rv) || !ccService) { result->Reject(rv, __func__); return result; } RefPtr serviceResult; rv = ccService->FetchWellKnown(aWellKnown, aTriggeringPrincipal, getter_AddRefs(serviceResult)); if (NS_FAILED(rv)) { result->Reject(rv, __func__); return result; } serviceResult->AddCallbacksWithCycleCollectedArgs( [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { IdentityProviderWellKnown value; bool success = value.Init(aCx, aValue); if (!success) { result->Reject(NS_ERROR_INVALID_ARG, __func__); return; } result->Resolve(value, __func__); }, [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), __func__); }); return result; } RefPtr, IdentityProviderAPIConfig>, nsresult, true>> IdentityNetworkHelpers::FetchConfigHelper( nsIURI* aConfig, nsIPrincipal* aTriggeringPrincipal, Maybe aWellKnownConfig) { RefPtr, IdentityProviderAPIConfig>, nsresult, true>::Private> result = new MozPromise, IdentityProviderAPIConfig>, nsresult, true>::Private(__func__); nsresult rv; nsCOMPtr ccService = mozilla::components::CredentialChooserService::Service(&rv); if (NS_FAILED(rv) || !ccService) { result->Reject(rv, __func__); return result; } RefPtr serviceResult; rv = ccService->FetchConfig(aConfig, aTriggeringPrincipal, getter_AddRefs(serviceResult)); if (NS_FAILED(rv)) { result->Reject(rv, __func__); return result; } serviceResult->AddCallbacksWithCycleCollectedArgs( [result, aWellKnownConfig](JSContext* aCx, JS::Handle aValue, ErrorResult&) { IdentityProviderAPIConfig value; bool success = value.Init(aCx, aValue); if (!success) { result->Reject(NS_ERROR_INVALID_ARG, __func__); return; } result->Resolve(std::make_tuple(aWellKnownConfig, value), __func__); }, [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), __func__); }); return result; } RefPtr> IdentityNetworkHelpers::FetchAccountsHelper( nsIURI* aAccountsEndpoint, nsIPrincipal* aTriggeringPrincipal) { RefPtr::Private> result = new MozPromise::Private( __func__); nsresult rv; nsCOMPtr ccService = mozilla::components::CredentialChooserService::Service(&rv); if (NS_FAILED(rv) || !ccService) { result->Reject(rv, __func__); return result; } RefPtr serviceResult; rv = ccService->FetchAccounts(aAccountsEndpoint, aTriggeringPrincipal, getter_AddRefs(serviceResult)); if (NS_FAILED(rv)) { result->Reject(rv, __func__); return result; } serviceResult->AddCallbacksWithCycleCollectedArgs( [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { IdentityProviderAccountList value; bool success = value.Init(aCx, aValue); if (!success) { result->Reject(NS_ERROR_INVALID_ARG, __func__); return; } result->Resolve(value, __func__); }, [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), __func__); }); return result; } RefPtr> IdentityNetworkHelpers::FetchTokenHelper(nsIURI* aAccountsEndpoint, const nsCString& aBody, nsIPrincipal* aTriggeringPrincipal) { RefPtr::Private> result = new MozPromise::Private(__func__); nsresult rv; nsCOMPtr ccService = mozilla::components::CredentialChooserService::Service(&rv); if (NS_FAILED(rv) || !ccService) { result->Reject(rv, __func__); return result; } RefPtr serviceResult; rv = ccService->FetchToken(aAccountsEndpoint, aBody.get(), aTriggeringPrincipal, getter_AddRefs(serviceResult)); if (NS_FAILED(rv)) { result->Reject(rv, __func__); return result; } serviceResult->AddCallbacksWithCycleCollectedArgs( [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { IdentityProviderToken value; bool success = value.Init(aCx, aValue); if (!success) { result->Reject(NS_ERROR_INVALID_ARG, __func__); return; } result->Resolve(value, __func__); }, [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), __func__); }); return result; } RefPtr> IdentityNetworkHelpers::FetchDisconnectHelper( nsIURI* aAccountsEndpoint, const nsCString& aBody, nsIPrincipal* aTriggeringPrincipal) { RefPtr::Private> result = new MozPromise::Private(__func__); nsresult rv; nsCOMPtr ccService = mozilla::components::CredentialChooserService::Service(&rv); if (NS_FAILED(rv) || !ccService) { result->Reject(rv, __func__); return result; } RefPtr serviceResult; rv = ccService->FetchToken(aAccountsEndpoint, aBody.get(), aTriggeringPrincipal, getter_AddRefs(serviceResult)); if (NS_FAILED(rv)) { result->Reject(rv, __func__); return result; } serviceResult->AddCallbacksWithCycleCollectedArgs( [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { DisconnectedAccount value; bool success = value.Init(aCx, aValue); if (!success) { result->Reject(NS_ERROR_INVALID_ARG, __func__); return; } result->Resolve(value, __func__); }, [result](JSContext* aCx, JS::Handle aValue, ErrorResult&) { result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), __func__); }); return result; } } // namespace mozilla::dom