tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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