IdentityNetworkHelpers.cpp (8408B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/IdentityNetworkHelpers.h" 8 9 namespace mozilla::dom { 10 11 RefPtr<MozPromise<IdentityProviderWellKnown, nsresult, true>> 12 IdentityNetworkHelpers::FetchWellKnownHelper( 13 nsIURI* aWellKnown, nsIPrincipal* aTriggeringPrincipal) { 14 RefPtr<MozPromise<IdentityProviderWellKnown, nsresult, true>::Private> 15 result = 16 new MozPromise<IdentityProviderWellKnown, nsresult, true>::Private( 17 __func__); 18 nsresult rv; 19 nsCOMPtr<nsICredentialChooserService> ccService = 20 mozilla::components::CredentialChooserService::Service(&rv); 21 if (NS_FAILED(rv) || !ccService) { 22 result->Reject(rv, __func__); 23 return result; 24 } 25 26 RefPtr<Promise> serviceResult; 27 rv = ccService->FetchWellKnown(aWellKnown, aTriggeringPrincipal, 28 getter_AddRefs(serviceResult)); 29 if (NS_FAILED(rv)) { 30 result->Reject(rv, __func__); 31 return result; 32 } 33 serviceResult->AddCallbacksWithCycleCollectedArgs( 34 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 35 IdentityProviderWellKnown value; 36 bool success = value.Init(aCx, aValue); 37 if (!success) { 38 JS_ClearPendingException(aCx); 39 result->Reject(NS_ERROR_INVALID_ARG, __func__); 40 return; 41 } 42 result->Resolve(value, __func__); 43 }, 44 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 45 result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), 46 __func__); 47 }); 48 return result; 49 } 50 51 RefPtr<MozPromise< 52 std::tuple<Maybe<IdentityProviderWellKnown>, IdentityProviderAPIConfig>, 53 nsresult, true>> 54 IdentityNetworkHelpers::FetchConfigHelper( 55 nsIURI* aConfig, nsIPrincipal* aTriggeringPrincipal, 56 Maybe<IdentityProviderWellKnown> aWellKnownConfig) { 57 RefPtr<MozPromise< 58 std::tuple<Maybe<IdentityProviderWellKnown>, IdentityProviderAPIConfig>, 59 nsresult, true>::Private> 60 result = new MozPromise<std::tuple<Maybe<IdentityProviderWellKnown>, 61 IdentityProviderAPIConfig>, 62 nsresult, true>::Private(__func__); 63 nsresult rv; 64 nsCOMPtr<nsICredentialChooserService> ccService = 65 mozilla::components::CredentialChooserService::Service(&rv); 66 if (NS_FAILED(rv) || !ccService) { 67 result->Reject(rv, __func__); 68 return result; 69 } 70 71 RefPtr<Promise> serviceResult; 72 rv = ccService->FetchConfig(aConfig, aTriggeringPrincipal, 73 getter_AddRefs(serviceResult)); 74 if (NS_FAILED(rv)) { 75 result->Reject(rv, __func__); 76 return result; 77 } 78 serviceResult->AddCallbacksWithCycleCollectedArgs( 79 [result, aWellKnownConfig](JSContext* aCx, JS::Handle<JS::Value> aValue, 80 ErrorResult&) { 81 IdentityProviderAPIConfig value; 82 bool success = value.Init(aCx, aValue); 83 if (!success) { 84 JS_ClearPendingException(aCx); 85 result->Reject(NS_ERROR_INVALID_ARG, __func__); 86 return; 87 } 88 result->Resolve(std::make_tuple(aWellKnownConfig, value), __func__); 89 }, 90 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 91 result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), 92 __func__); 93 }); 94 return result; 95 } 96 97 RefPtr<MozPromise<IdentityProviderAccountList, nsresult, true>> 98 IdentityNetworkHelpers::FetchAccountsHelper( 99 nsIURI* aAccountsEndpoint, nsIPrincipal* aTriggeringPrincipal) { 100 RefPtr<MozPromise<IdentityProviderAccountList, nsresult, true>::Private> 101 result = 102 new MozPromise<IdentityProviderAccountList, nsresult, true>::Private( 103 __func__); 104 nsresult rv; 105 nsCOMPtr<nsICredentialChooserService> ccService = 106 mozilla::components::CredentialChooserService::Service(&rv); 107 if (NS_FAILED(rv) || !ccService) { 108 result->Reject(rv, __func__); 109 return result; 110 } 111 112 RefPtr<Promise> serviceResult; 113 rv = ccService->FetchAccounts(aAccountsEndpoint, aTriggeringPrincipal, 114 getter_AddRefs(serviceResult)); 115 if (NS_FAILED(rv)) { 116 result->Reject(rv, __func__); 117 return result; 118 } 119 serviceResult->AddCallbacksWithCycleCollectedArgs( 120 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 121 IdentityProviderAccountList value; 122 bool success = value.Init(aCx, aValue); 123 if (!success) { 124 JS_ClearPendingException(aCx); 125 result->Reject(NS_ERROR_INVALID_ARG, __func__); 126 return; 127 } 128 result->Resolve(value, __func__); 129 }, 130 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 131 result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), 132 __func__); 133 }); 134 return result; 135 } 136 137 RefPtr<MozPromise<IdentityAssertionResponse, nsresult, true>> 138 IdentityNetworkHelpers::FetchTokenHelper(nsIURI* aAccountsEndpoint, 139 const nsCString& aBody, 140 nsIPrincipal* aTriggeringPrincipal) { 141 RefPtr<MozPromise<IdentityAssertionResponse, nsresult, true>::Private> 142 result = 143 new MozPromise<IdentityAssertionResponse, nsresult, true>::Private( 144 __func__); 145 nsresult rv; 146 nsCOMPtr<nsICredentialChooserService> ccService = 147 mozilla::components::CredentialChooserService::Service(&rv); 148 if (NS_FAILED(rv) || !ccService) { 149 result->Reject(rv, __func__); 150 return result; 151 } 152 153 RefPtr<Promise> serviceResult; 154 rv = ccService->FetchToken(aAccountsEndpoint, aBody.get(), 155 aTriggeringPrincipal, 156 getter_AddRefs(serviceResult)); 157 if (NS_FAILED(rv)) { 158 result->Reject(rv, __func__); 159 return result; 160 } 161 serviceResult->AddCallbacksWithCycleCollectedArgs( 162 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 163 IdentityAssertionResponse value; 164 bool success = value.Init(aCx, aValue); 165 if (!success) { 166 JS_ClearPendingException(aCx); 167 result->Reject(NS_ERROR_INVALID_ARG, __func__); 168 return; 169 } 170 result->Resolve(value, __func__); 171 }, 172 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 173 JS_ClearPendingException(aCx); 174 result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), 175 __func__); 176 }); 177 return result; 178 } 179 180 RefPtr<MozPromise<DisconnectedAccount, nsresult, true>> 181 IdentityNetworkHelpers::FetchDisconnectHelper( 182 nsIURI* aAccountsEndpoint, const nsCString& aBody, 183 nsIPrincipal* aTriggeringPrincipal) { 184 RefPtr<MozPromise<DisconnectedAccount, nsresult, true>::Private> result = 185 new MozPromise<DisconnectedAccount, nsresult, true>::Private(__func__); 186 nsresult rv; 187 nsCOMPtr<nsICredentialChooserService> ccService = 188 mozilla::components::CredentialChooserService::Service(&rv); 189 if (NS_FAILED(rv) || !ccService) { 190 result->Reject(rv, __func__); 191 return result; 192 } 193 194 RefPtr<Promise> serviceResult; 195 rv = ccService->FetchToken(aAccountsEndpoint, aBody.get(), 196 aTriggeringPrincipal, 197 getter_AddRefs(serviceResult)); 198 if (NS_FAILED(rv)) { 199 result->Reject(rv, __func__); 200 return result; 201 } 202 serviceResult->AddCallbacksWithCycleCollectedArgs( 203 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 204 DisconnectedAccount value; 205 bool success = value.Init(aCx, aValue); 206 if (!success) { 207 JS_ClearPendingException(aCx); 208 result->Reject(NS_ERROR_INVALID_ARG, __func__); 209 return; 210 } 211 result->Resolve(value, __func__); 212 }, 213 [result](JSContext* aCx, JS::Handle<JS::Value> aValue, ErrorResult&) { 214 JS_ClearPendingException(aCx); 215 result->Reject(Promise::TryExtractNSResultFromRejectionValue(aValue), 216 __func__); 217 }); 218 return result; 219 } 220 221 } // namespace mozilla::dom