@metamask/profile-sync-controller 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -1
- package/dist/chunk-2XGRQBXI.mjs +70 -0
- package/dist/chunk-2XGRQBXI.mjs.map +1 -0
- package/dist/chunk-32HAX3MW.mjs +224 -0
- package/dist/chunk-32HAX3MW.mjs.map +1 -0
- package/dist/chunk-5SXXO4MV.js +70 -0
- package/dist/chunk-5SXXO4MV.js.map +1 -0
- package/dist/chunk-5TOWF6UW.mjs +11 -0
- package/dist/chunk-5TOWF6UW.mjs.map +1 -0
- package/dist/chunk-6P6CUKKI.mjs +30 -0
- package/dist/chunk-6P6CUKKI.mjs.map +1 -0
- package/dist/chunk-76VRE4BI.mjs +18 -0
- package/dist/chunk-76VRE4BI.mjs.map +1 -0
- package/dist/chunk-AARMY5TW.mjs +86 -0
- package/dist/chunk-AARMY5TW.mjs.map +1 -0
- package/dist/chunk-AK7OTIWA.js +11 -0
- package/dist/chunk-AK7OTIWA.js.map +1 -0
- package/dist/chunk-AUFUOKJW.mjs +25 -0
- package/dist/chunk-AUFUOKJW.mjs.map +1 -0
- package/dist/{chunk-OF3TQWGX.js → chunk-AVOOINGJ.js} +34 -34
- package/dist/chunk-AVOOINGJ.js.map +1 -0
- package/dist/{chunk-CZ7YK35S.mjs → chunk-AXWK4Y23.mjs} +7 -5
- package/dist/{chunk-CZ7YK35S.mjs.map → chunk-AXWK4Y23.mjs.map} +1 -1
- package/dist/{chunk-UMKBFFZ5.mjs → chunk-B5DBQDB3.mjs} +13 -4
- package/dist/chunk-B5DBQDB3.mjs.map +1 -0
- package/dist/chunk-B6CSNLGE.js +25 -0
- package/dist/chunk-B6CSNLGE.js.map +1 -0
- package/dist/{chunk-NRH6O4QZ.js → chunk-BOET676P.js} +45 -14
- package/dist/chunk-BOET676P.js.map +1 -0
- package/dist/{chunk-2FZSWVHT.mjs → chunk-CAIIVJAO.mjs} +1 -1
- package/dist/chunk-CAIIVJAO.mjs.map +1 -0
- package/dist/chunk-ELHJSRS2.js +98 -0
- package/dist/chunk-ELHJSRS2.js.map +1 -0
- package/dist/chunk-FCT2LIGH.mjs +106 -0
- package/dist/chunk-FCT2LIGH.mjs.map +1 -0
- package/dist/chunk-FQ5SDMRE.mjs +77 -0
- package/dist/chunk-FQ5SDMRE.mjs.map +1 -0
- package/dist/chunk-H25EBXG5.mjs +58 -0
- package/dist/chunk-H25EBXG5.mjs.map +1 -0
- package/dist/chunk-H4TDS65R.js +81 -0
- package/dist/chunk-H4TDS65R.js.map +1 -0
- package/dist/{chunk-Z4BLTVTB.js → chunk-IGY2S5BC.js} +9 -3
- package/dist/chunk-IPSBQ3MS.js +30 -0
- package/dist/chunk-IPSBQ3MS.js.map +1 -0
- package/dist/{chunk-4NGEEDGV.mjs → chunk-JLDFMYAH.mjs} +9 -9
- package/dist/chunk-JLDFMYAH.mjs.map +1 -0
- package/dist/chunk-K5UKU454.mjs +158 -0
- package/dist/chunk-K5UKU454.mjs.map +1 -0
- package/dist/chunk-KBCXN3YW.mjs +98 -0
- package/dist/chunk-KBCXN3YW.mjs.map +1 -0
- package/dist/chunk-LSVRA3X2.mjs +81 -0
- package/dist/chunk-LSVRA3X2.mjs.map +1 -0
- package/dist/{chunk-GQLHSQGZ.js → chunk-MBTBE4P5.js} +9 -2
- package/dist/chunk-MBTBE4P5.js.map +1 -0
- package/dist/chunk-NLHLVVOO.js +106 -0
- package/dist/chunk-NLHLVVOO.js.map +1 -0
- package/dist/{chunk-VZXD5DCQ.js → chunk-P4DUDLMY.js} +36 -27
- package/dist/chunk-P4DUDLMY.js.map +1 -0
- package/dist/{chunk-6X6I3HZU.js → chunk-P52TG263.js} +28 -26
- package/dist/chunk-P52TG263.js.map +1 -0
- package/dist/{chunk-CFST6GWE.js → chunk-PBRUOBEQ.js} +1 -1
- package/dist/chunk-PBRUOBEQ.js.map +1 -0
- package/dist/chunk-PCOIRDTO.js +18 -0
- package/dist/chunk-PCOIRDTO.js.map +1 -0
- package/dist/chunk-PTR4DAX6.js +79 -0
- package/dist/chunk-PTR4DAX6.js.map +1 -0
- package/dist/chunk-Q5WIUNX5.js +126 -0
- package/dist/chunk-Q5WIUNX5.js.map +1 -0
- package/dist/chunk-RX5R6BUI.js +86 -0
- package/dist/chunk-RX5R6BUI.js.map +1 -0
- package/dist/chunk-SMKTWM6I.js +77 -0
- package/dist/chunk-SMKTWM6I.js.map +1 -0
- package/dist/chunk-T3FNDVE3.js +158 -0
- package/dist/chunk-T3FNDVE3.js.map +1 -0
- package/dist/{chunk-BHVT2QEA.mjs → chunk-TFFQFIJV.mjs} +8 -1
- package/dist/chunk-TFFQFIJV.mjs.map +1 -0
- package/dist/chunk-TGFMKARH.mjs +274 -0
- package/dist/chunk-TGFMKARH.mjs.map +1 -0
- package/dist/{chunk-XUI43LEZ.mjs → chunk-U5UIDVOO.mjs} +7 -1
- package/dist/chunk-UAXWZN5J.js +58 -0
- package/dist/chunk-UAXWZN5J.js.map +1 -0
- package/dist/{chunk-CYGZ4WLJ.mjs → chunk-WB6MUIML.mjs} +36 -5
- package/dist/chunk-WB6MUIML.mjs.map +1 -0
- package/dist/chunk-WJCKQLKK.mjs +79 -0
- package/dist/chunk-WJCKQLKK.mjs.map +1 -0
- package/dist/{chunk-VXPVURGH.mjs → chunk-Y46NMA3V.mjs} +9 -9
- package/dist/chunk-Y46NMA3V.mjs.map +1 -0
- package/dist/chunk-YASNOFBV.js +274 -0
- package/dist/chunk-YASNOFBV.js.map +1 -0
- package/dist/chunk-YUXN5GSW.js +224 -0
- package/dist/chunk-YUXN5GSW.js.map +1 -0
- package/dist/controllers/authentication/AuthenticationController.js +24 -0
- package/dist/controllers/authentication/AuthenticationController.mjs +24 -0
- package/dist/controllers/authentication/auth-snap-requests.js +10 -0
- package/dist/controllers/authentication/auth-snap-requests.mjs +10 -0
- package/dist/controllers/authentication/index.js +28 -0
- package/dist/controllers/authentication/index.js.map +1 -0
- package/dist/controllers/authentication/index.mjs +28 -0
- package/dist/controllers/authentication/index.mjs.map +1 -0
- package/dist/controllers/authentication/services.js +32 -0
- package/dist/controllers/authentication/services.js.map +1 -0
- package/dist/controllers/authentication/services.mjs +32 -0
- package/dist/controllers/authentication/services.mjs.map +1 -0
- package/dist/controllers/index.js +34 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/index.mjs +34 -0
- package/dist/controllers/index.mjs.map +1 -0
- package/dist/controllers/user-storage/UserStorageController.js +29 -0
- package/dist/controllers/user-storage/UserStorageController.js.map +1 -0
- package/dist/controllers/user-storage/UserStorageController.mjs +29 -0
- package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/cache.js +13 -0
- package/dist/controllers/user-storage/encryption/cache.js.map +1 -0
- package/dist/controllers/user-storage/encryption/cache.mjs +13 -0
- package/dist/controllers/user-storage/encryption/cache.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/encryption.js +12 -0
- package/dist/controllers/user-storage/encryption/encryption.js.map +1 -0
- package/dist/controllers/user-storage/encryption/encryption.mjs +12 -0
- package/dist/controllers/user-storage/encryption/encryption.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/index.js +16 -0
- package/dist/controllers/user-storage/encryption/index.js.map +1 -0
- package/dist/controllers/user-storage/encryption/index.mjs +16 -0
- package/dist/controllers/user-storage/encryption/index.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/utils.js +12 -0
- package/dist/controllers/user-storage/encryption/utils.js.map +1 -0
- package/dist/controllers/user-storage/encryption/utils.mjs +12 -0
- package/dist/controllers/user-storage/encryption/utils.mjs.map +1 -0
- package/dist/controllers/user-storage/index.js +38 -0
- package/dist/controllers/user-storage/index.js.map +1 -0
- package/dist/controllers/user-storage/index.mjs +38 -0
- package/dist/controllers/user-storage/index.mjs.map +1 -0
- package/dist/controllers/user-storage/schema.js +14 -0
- package/dist/controllers/user-storage/schema.js.map +1 -0
- package/dist/controllers/user-storage/schema.mjs +14 -0
- package/dist/controllers/user-storage/schema.mjs.map +1 -0
- package/dist/controllers/user-storage/services.js +31 -0
- package/dist/controllers/user-storage/services.js.map +1 -0
- package/dist/controllers/user-storage/services.mjs +31 -0
- package/dist/controllers/user-storage/services.mjs.map +1 -0
- package/dist/index.js +31 -62
- package/dist/index.mjs +32 -63
- package/dist/sdk/authentication-jwt-bearer/flow-siwe.js +7 -8
- package/dist/sdk/authentication-jwt-bearer/flow-siwe.mjs +6 -7
- package/dist/sdk/authentication-jwt-bearer/flow-srp.js +7 -8
- package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs +6 -7
- package/dist/sdk/authentication-jwt-bearer/services.js +10 -6
- package/dist/sdk/authentication-jwt-bearer/services.mjs +11 -7
- package/dist/sdk/authentication-jwt-bearer/types.js +3 -3
- package/dist/sdk/authentication-jwt-bearer/types.mjs +2 -2
- package/dist/sdk/authentication.js +9 -10
- package/dist/sdk/authentication.mjs +8 -9
- package/dist/sdk/encryption.js +5 -3
- package/dist/sdk/encryption.mjs +4 -2
- package/dist/sdk/env.js +5 -3
- package/dist/sdk/env.mjs +4 -2
- package/dist/sdk/errors.js +5 -3
- package/dist/sdk/errors.mjs +4 -2
- package/dist/sdk/index.js +18 -13
- package/dist/sdk/index.mjs +17 -12
- package/dist/sdk/user-storage.js +6 -6
- package/dist/sdk/user-storage.mjs +5 -5
- package/dist/sdk/utils/eip-6963-metamask-provider.js +1 -1
- package/dist/sdk/utils/eip-6963-metamask-provider.mjs +1 -1
- package/dist/sdk/utils/messaging-signing-snap-requests.js +1 -1
- package/dist/sdk/utils/messaging-signing-snap-requests.mjs +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/controllers/authentication/AuthenticationController.d.ts +74 -0
- package/dist/types/controllers/authentication/AuthenticationController.d.ts.map +1 -0
- package/dist/types/controllers/authentication/__fixtures__/index.d.ts +2 -0
- package/dist/types/controllers/authentication/__fixtures__/index.d.ts.map +1 -0
- package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts +23 -0
- package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts.map +1 -0
- package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts +10 -0
- package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts.map +1 -0
- package/dist/types/controllers/authentication/auth-snap-requests.d.ts +17 -0
- package/dist/types/controllers/authentication/auth-snap-requests.d.ts.map +1 -0
- package/dist/types/controllers/authentication/index.d.ts +5 -0
- package/dist/types/controllers/authentication/index.d.ts.map +1 -0
- package/dist/types/controllers/authentication/services.d.ts +69 -0
- package/dist/types/controllers/authentication/services.d.ts.map +1 -0
- package/dist/types/controllers/index.d.ts +3 -0
- package/dist/types/controllers/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/UserStorageController.d.ts +85 -0
- package/dist/types/controllers/user-storage/UserStorageController.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/index.d.ts +3 -0
- package/dist/types/controllers/user-storage/__fixtures__/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts +13 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts +9 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts +5 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/cache.d.ts +31 -0
- package/dist/types/controllers/user-storage/encryption/cache.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/encryption.d.ts +26 -0
- package/dist/types/controllers/user-storage/encryption/encryption.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/index.d.ts +5 -0
- package/dist/types/controllers/user-storage/encryption/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/utils.d.ts +4 -0
- package/dist/types/controllers/user-storage/encryption/utils.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/index.d.ts +6 -0
- package/dist/types/controllers/user-storage/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/schema.d.ts +22 -0
- package/dist/types/controllers/user-storage/schema.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/services.d.ts +30 -0
- package/dist/types/controllers/user-storage/services.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/sdk/__fixtures__/mock-auth.d.ts +3 -0
- package/dist/types/sdk/__fixtures__/mock-auth.d.ts.map +1 -1
- package/dist/types/sdk/__fixtures__/mock-userstorage.d.ts.map +1 -1
- package/dist/types/sdk/__fixtures__/test-utils.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/flow-siwe.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/flow-srp.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/services.d.ts +20 -2
- package/dist/types/sdk/authentication-jwt-bearer/services.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/types.d.ts +9 -2
- package/dist/types/sdk/authentication-jwt-bearer/types.d.ts.map +1 -1
- package/dist/types/sdk/authentication.d.ts +2 -1
- package/dist/types/sdk/authentication.d.ts.map +1 -1
- package/dist/types/sdk/encryption.d.ts +2 -2
- package/dist/types/sdk/encryption.d.ts.map +1 -1
- package/dist/types/sdk/env.d.ts +9 -2
- package/dist/types/sdk/env.d.ts.map +1 -1
- package/dist/types/sdk/errors.d.ts +3 -0
- package/dist/types/sdk/errors.d.ts.map +1 -1
- package/dist/types/sdk/user-storage.d.ts.map +1 -1
- package/package.json +15 -2
- package/dist/chunk-2FZSWVHT.mjs.map +0 -1
- package/dist/chunk-4NGEEDGV.mjs.map +0 -1
- package/dist/chunk-6X6I3HZU.js.map +0 -1
- package/dist/chunk-BARZBXO7.js +0 -7
- package/dist/chunk-BARZBXO7.js.map +0 -1
- package/dist/chunk-BHVT2QEA.mjs.map +0 -1
- package/dist/chunk-CFST6GWE.js.map +0 -1
- package/dist/chunk-CYGZ4WLJ.mjs.map +0 -1
- package/dist/chunk-DEATIRII.js +0 -1
- package/dist/chunk-GQLHSQGZ.js.map +0 -1
- package/dist/chunk-GVMIXMYB.mjs +0 -67
- package/dist/chunk-GVMIXMYB.mjs.map +0 -1
- package/dist/chunk-KHFPE566.js +0 -49
- package/dist/chunk-KHFPE566.js.map +0 -1
- package/dist/chunk-KKRIOEXD.mjs +0 -7
- package/dist/chunk-KKRIOEXD.mjs.map +0 -1
- package/dist/chunk-MKJYSWME.mjs +0 -1
- package/dist/chunk-NRH6O4QZ.js.map +0 -1
- package/dist/chunk-OF3TQWGX.js.map +0 -1
- package/dist/chunk-UMKBFFZ5.mjs.map +0 -1
- package/dist/chunk-UVJVONBF.js +0 -126
- package/dist/chunk-UVJVONBF.js.map +0 -1
- package/dist/chunk-VHUU4HEY.js +0 -67
- package/dist/chunk-VHUU4HEY.js.map +0 -1
- package/dist/chunk-VXPVURGH.mjs.map +0 -1
- package/dist/chunk-VZXD5DCQ.js.map +0 -1
- package/dist/chunk-WJRV2JCX.mjs +0 -49
- package/dist/chunk-WJRV2JCX.mjs.map +0 -1
- package/dist/sdk/authentication-jwt-bearer/constants.js +0 -8
- package/dist/sdk/authentication-jwt-bearer/constants.mjs +0 -8
- package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts +0 -2
- package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts.map +0 -1
- /package/dist/{chunk-DEATIRII.js.map → chunk-IGY2S5BC.js.map} +0 -0
- /package/dist/{chunk-MKJYSWME.mjs.map → chunk-U5UIDVOO.mjs.map} +0 -0
- /package/dist/{chunk-Z4BLTVTB.js.map → controllers/authentication/AuthenticationController.js.map} +0 -0
- /package/dist/{chunk-XUI43LEZ.mjs.map → controllers/authentication/AuthenticationController.mjs.map} +0 -0
- /package/dist/{sdk/authentication-jwt-bearer/constants.js.map → controllers/authentication/auth-snap-requests.js.map} +0 -0
- /package/dist/{sdk/authentication-jwt-bearer/constants.mjs.map → controllers/authentication/auth-snap-requests.mjs.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,4 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
[
|
|
10
|
+
## [0.1.1]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- export `defaultState` for `AuthenticationController` and `UserStorageController`. ([#4441](https://github.com/MetaMask/core/pull/4441))
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- `AuthType`, `Env`, `Platform` are changed from const enums to enums ([#4441](https://github.com/MetaMask/core/pull/4441))
|
|
19
|
+
|
|
20
|
+
## [0.1.0]
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- Initial release
|
|
25
|
+
|
|
26
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.1.1...HEAD
|
|
27
|
+
[0.1.1]: https://github.com/MetaMask/core/compare/@metamask/profile-sync-controller@0.1.0...@metamask/profile-sync-controller@0.1.1
|
|
28
|
+
[0.1.0]: https://github.com/MetaMask/core/releases/tag/@metamask/profile-sync-controller@0.1.0
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createEntryPath
|
|
3
|
+
} from "./chunk-AUFUOKJW.mjs";
|
|
4
|
+
import {
|
|
5
|
+
encryption_default
|
|
6
|
+
} from "./chunk-5TOWF6UW.mjs";
|
|
7
|
+
import {
|
|
8
|
+
getEnvUrls
|
|
9
|
+
} from "./chunk-FQ5SDMRE.mjs";
|
|
10
|
+
|
|
11
|
+
// src/controllers/user-storage/services.ts
|
|
12
|
+
import log from "loglevel";
|
|
13
|
+
var ENV_URLS = getEnvUrls("prd" /* PRD */);
|
|
14
|
+
var USER_STORAGE_API = ENV_URLS.userStorageApiUrl;
|
|
15
|
+
var USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;
|
|
16
|
+
async function getUserStorage(opts) {
|
|
17
|
+
try {
|
|
18
|
+
const path = createEntryPath(opts.entryKey, opts.storageKey);
|
|
19
|
+
const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
|
|
20
|
+
const userStorageResponse = await fetch(url.toString(), {
|
|
21
|
+
headers: {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
Authorization: `Bearer ${opts.bearerToken}`
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
if (userStorageResponse.status === 404) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (userStorageResponse.status !== 200) {
|
|
30
|
+
throw new Error("Unable to get User Storage");
|
|
31
|
+
}
|
|
32
|
+
const userStorage = await userStorageResponse.json();
|
|
33
|
+
const encryptedData = userStorage?.Data ?? null;
|
|
34
|
+
if (!encryptedData) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const decryptedData = encryption_default.decryptString(
|
|
38
|
+
encryptedData,
|
|
39
|
+
opts.storageKey
|
|
40
|
+
);
|
|
41
|
+
return decryptedData;
|
|
42
|
+
} catch (e) {
|
|
43
|
+
log.error("Failed to get user storage", e);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function upsertUserStorage(data, opts) {
|
|
48
|
+
const encryptedData = encryption_default.encryptString(data, opts.storageKey);
|
|
49
|
+
const path = createEntryPath(opts.entryKey, opts.storageKey);
|
|
50
|
+
const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
|
|
51
|
+
const res = await fetch(url.toString(), {
|
|
52
|
+
method: "PUT",
|
|
53
|
+
headers: {
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
Authorization: `Bearer ${opts.bearerToken}`
|
|
56
|
+
},
|
|
57
|
+
body: JSON.stringify({ data: encryptedData })
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
throw new Error("user-storage - unable to upsert data");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export {
|
|
65
|
+
USER_STORAGE_API,
|
|
66
|
+
USER_STORAGE_ENDPOINT,
|
|
67
|
+
getUserStorage,
|
|
68
|
+
upsertUserStorage
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=chunk-2XGRQBXI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/services.ts"],"sourcesContent":["import log from 'loglevel';\n\nimport { Env, getEnvUrls } from '../../sdk';\nimport encryption from './encryption';\nimport type { UserStorageEntryKeys } from './schema';\nimport { createEntryPath } from './schema';\n\nconst ENV_URLS = getEnvUrls(Env.PRD);\n\nexport const USER_STORAGE_API: string = ENV_URLS.userStorageApiUrl;\nexport const USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;\n\n/**\n * This is the Server Response shape\n */\nexport type GetUserStorageResponse = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HashedKey: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Data: string;\n};\n\nexport type UserStorageOptions = {\n bearerToken: string;\n entryKey: UserStorageEntryKeys;\n storageKey: string;\n};\n\n/**\n * User Storage Service - Get Storage Entry.\n *\n * @param opts - User Storage Options\n * @returns The storage entry, or null if fails to find entry\n */\nexport async function getUserStorage(\n opts: UserStorageOptions,\n): Promise<string | null> {\n try {\n const path = createEntryPath(opts.entryKey, opts.storageKey);\n const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);\n\n const userStorageResponse = await fetch(url.toString(), {\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.bearerToken}`,\n },\n });\n\n // Acceptable error - since indicates entry does not exist.\n if (userStorageResponse.status === 404) {\n return null;\n }\n\n if (userStorageResponse.status !== 200) {\n throw new Error('Unable to get User Storage');\n }\n\n const userStorage: GetUserStorageResponse | null =\n await userStorageResponse.json();\n const encryptedData = userStorage?.Data ?? null;\n\n if (!encryptedData) {\n return null;\n }\n\n const decryptedData = encryption.decryptString(\n encryptedData,\n opts.storageKey,\n );\n\n return decryptedData;\n } catch (e) {\n log.error('Failed to get user storage', e);\n return null;\n }\n}\n\n/**\n * User Storage Service - Set Storage Entry.\n *\n * @param data - data to store\n * @param opts - storage options\n */\nexport async function upsertUserStorage(\n data: string,\n opts: UserStorageOptions,\n): Promise<void> {\n const encryptedData = encryption.encryptString(data, opts.storageKey);\n const path = createEntryPath(opts.entryKey, opts.storageKey);\n const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);\n\n const res = await fetch(url.toString(), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.bearerToken}`,\n },\n body: JSON.stringify({ data: encryptedData }),\n });\n\n if (!res.ok) {\n throw new Error('user-storage - unable to upsert data');\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,SAAS;AAOhB,IAAM,WAAW,0BAAkB;AAE5B,IAAM,mBAA2B,SAAS;AAC1C,IAAM,wBAAwB,GAAG,gBAAgB;AAwBxD,eAAsB,eACpB,MACwB;AACxB,MAAI;AACF,UAAM,OAAO,gBAAgB,KAAK,UAAU,KAAK,UAAU;AAC3D,UAAM,MAAM,IAAI,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAAE;AAErD,UAAM,sBAAsB,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtD,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,WAAW;AAAA,MAC3C;AAAA,IACF,CAAC;AAGD,QAAI,oBAAoB,WAAW,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,WAAW,KAAK;AACtC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,UAAM,cACJ,MAAM,oBAAoB,KAAK;AACjC,UAAM,gBAAgB,aAAa,QAAQ;AAE3C,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,mBAAW;AAAA,MAC/B;AAAA,MACA,KAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,QAAI,MAAM,8BAA8B,CAAC;AACzC,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,kBACpB,MACA,MACe;AACf,QAAM,gBAAgB,mBAAW,cAAc,MAAM,KAAK,UAAU;AACpE,QAAM,OAAO,gBAAgB,KAAK,UAAU,KAAK,UAAU;AAC3D,QAAM,MAAM,IAAI,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAAE;AAErD,QAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,IACtC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK,WAAW;AAAA,IAC3C;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAAA,EAC9C,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACF;","names":[]}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createLoginRawMessage,
|
|
3
|
+
getAccessToken,
|
|
4
|
+
getNonce,
|
|
5
|
+
login
|
|
6
|
+
} from "./chunk-KBCXN3YW.mjs";
|
|
7
|
+
import {
|
|
8
|
+
createSnapPublicKeyRequest,
|
|
9
|
+
createSnapSignMessageRequest
|
|
10
|
+
} from "./chunk-6P6CUKKI.mjs";
|
|
11
|
+
import {
|
|
12
|
+
__privateAdd,
|
|
13
|
+
__privateGet,
|
|
14
|
+
__privateMethod,
|
|
15
|
+
__privateSet
|
|
16
|
+
} from "./chunk-U5UIDVOO.mjs";
|
|
17
|
+
|
|
18
|
+
// src/controllers/authentication/AuthenticationController.ts
|
|
19
|
+
import { BaseController } from "@metamask/base-controller";
|
|
20
|
+
var THIRTY_MIN_MS = 1e3 * 60 * 30;
|
|
21
|
+
var controllerName = "AuthenticationController";
|
|
22
|
+
var defaultState = {
|
|
23
|
+
isSignedIn: false
|
|
24
|
+
};
|
|
25
|
+
var metadata = {
|
|
26
|
+
isSignedIn: {
|
|
27
|
+
persist: true,
|
|
28
|
+
anonymous: true
|
|
29
|
+
},
|
|
30
|
+
sessionData: {
|
|
31
|
+
persist: true,
|
|
32
|
+
anonymous: false
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
var _metametrics, _registerMessageHandlers, registerMessageHandlers_fn, _assertLoggedIn, assertLoggedIn_fn, _performAuthenticationFlow, performAuthenticationFlow_fn, _hasValidSession, hasValidSession_fn, _snapGetPublicKey, snapGetPublicKey_fn, _snapSignMessage, snapSignMessage_fn;
|
|
36
|
+
var AuthenticationController = class extends BaseController {
|
|
37
|
+
constructor({
|
|
38
|
+
messenger,
|
|
39
|
+
state,
|
|
40
|
+
metametrics
|
|
41
|
+
}) {
|
|
42
|
+
super({
|
|
43
|
+
messenger,
|
|
44
|
+
metadata,
|
|
45
|
+
name: controllerName,
|
|
46
|
+
state: { ...defaultState, ...state }
|
|
47
|
+
});
|
|
48
|
+
/**
|
|
49
|
+
* Constructor helper for registering this controller's messaging system
|
|
50
|
+
* actions.
|
|
51
|
+
*/
|
|
52
|
+
__privateAdd(this, _registerMessageHandlers);
|
|
53
|
+
__privateAdd(this, _assertLoggedIn);
|
|
54
|
+
__privateAdd(this, _performAuthenticationFlow);
|
|
55
|
+
__privateAdd(this, _hasValidSession);
|
|
56
|
+
/**
|
|
57
|
+
* Returns the auth snap public key.
|
|
58
|
+
*
|
|
59
|
+
* @returns The snap public key.
|
|
60
|
+
*/
|
|
61
|
+
__privateAdd(this, _snapGetPublicKey);
|
|
62
|
+
/**
|
|
63
|
+
* Signs a specific message using an underlying auth snap.
|
|
64
|
+
*
|
|
65
|
+
* @param message - A specific tagged message to sign.
|
|
66
|
+
* @returns A Signature created by the snap.
|
|
67
|
+
*/
|
|
68
|
+
__privateAdd(this, _snapSignMessage);
|
|
69
|
+
__privateAdd(this, _metametrics, void 0);
|
|
70
|
+
__privateSet(this, _metametrics, metametrics);
|
|
71
|
+
__privateMethod(this, _registerMessageHandlers, registerMessageHandlers_fn).call(this);
|
|
72
|
+
}
|
|
73
|
+
async performSignIn() {
|
|
74
|
+
const { accessToken } = await __privateMethod(this, _performAuthenticationFlow, performAuthenticationFlow_fn).call(this);
|
|
75
|
+
return accessToken;
|
|
76
|
+
}
|
|
77
|
+
performSignOut() {
|
|
78
|
+
__privateMethod(this, _assertLoggedIn, assertLoggedIn_fn).call(this);
|
|
79
|
+
this.update((state) => {
|
|
80
|
+
state.isSignedIn = false;
|
|
81
|
+
state.sessionData = void 0;
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async getBearerToken() {
|
|
85
|
+
__privateMethod(this, _assertLoggedIn, assertLoggedIn_fn).call(this);
|
|
86
|
+
if (__privateMethod(this, _hasValidSession, hasValidSession_fn).call(this, this.state.sessionData)) {
|
|
87
|
+
return this.state.sessionData.accessToken;
|
|
88
|
+
}
|
|
89
|
+
const { accessToken } = await __privateMethod(this, _performAuthenticationFlow, performAuthenticationFlow_fn).call(this);
|
|
90
|
+
return accessToken;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Will return a session profile.
|
|
94
|
+
* Throws if a user is not logged in.
|
|
95
|
+
*
|
|
96
|
+
* @returns profile for the session.
|
|
97
|
+
*/
|
|
98
|
+
async getSessionProfile() {
|
|
99
|
+
__privateMethod(this, _assertLoggedIn, assertLoggedIn_fn).call(this);
|
|
100
|
+
if (__privateMethod(this, _hasValidSession, hasValidSession_fn).call(this, this.state.sessionData)) {
|
|
101
|
+
return this.state.sessionData.profile;
|
|
102
|
+
}
|
|
103
|
+
const { profile } = await __privateMethod(this, _performAuthenticationFlow, performAuthenticationFlow_fn).call(this);
|
|
104
|
+
return profile;
|
|
105
|
+
}
|
|
106
|
+
isSignedIn() {
|
|
107
|
+
return this.state.isSignedIn;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
_metametrics = new WeakMap();
|
|
111
|
+
_registerMessageHandlers = new WeakSet();
|
|
112
|
+
registerMessageHandlers_fn = function() {
|
|
113
|
+
this.messagingSystem.registerActionHandler(
|
|
114
|
+
"AuthenticationController:getBearerToken",
|
|
115
|
+
this.getBearerToken.bind(this)
|
|
116
|
+
);
|
|
117
|
+
this.messagingSystem.registerActionHandler(
|
|
118
|
+
"AuthenticationController:getSessionProfile",
|
|
119
|
+
this.getSessionProfile.bind(this)
|
|
120
|
+
);
|
|
121
|
+
this.messagingSystem.registerActionHandler(
|
|
122
|
+
"AuthenticationController:isSignedIn",
|
|
123
|
+
this.isSignedIn.bind(this)
|
|
124
|
+
);
|
|
125
|
+
this.messagingSystem.registerActionHandler(
|
|
126
|
+
"AuthenticationController:performSignIn",
|
|
127
|
+
this.performSignIn.bind(this)
|
|
128
|
+
);
|
|
129
|
+
this.messagingSystem.registerActionHandler(
|
|
130
|
+
"AuthenticationController:performSignOut",
|
|
131
|
+
this.performSignOut.bind(this)
|
|
132
|
+
);
|
|
133
|
+
};
|
|
134
|
+
_assertLoggedIn = new WeakSet();
|
|
135
|
+
assertLoggedIn_fn = function() {
|
|
136
|
+
if (!this.state.isSignedIn) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`${controllerName}: Unable to call method, user is not authenticated`
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
_performAuthenticationFlow = new WeakSet();
|
|
143
|
+
performAuthenticationFlow_fn = async function() {
|
|
144
|
+
try {
|
|
145
|
+
const publicKey = await __privateMethod(this, _snapGetPublicKey, snapGetPublicKey_fn).call(this);
|
|
146
|
+
const nonce = await getNonce(publicKey);
|
|
147
|
+
if (!nonce) {
|
|
148
|
+
throw new Error(`Unable to get nonce`);
|
|
149
|
+
}
|
|
150
|
+
const rawMessage = createLoginRawMessage(nonce, publicKey);
|
|
151
|
+
const signature = await __privateMethod(this, _snapSignMessage, snapSignMessage_fn).call(this, rawMessage);
|
|
152
|
+
const loginResponse = await login(rawMessage, signature, {
|
|
153
|
+
metametricsId: __privateGet(this, _metametrics).getMetaMetricsId(),
|
|
154
|
+
agent: __privateGet(this, _metametrics).agent
|
|
155
|
+
});
|
|
156
|
+
if (!loginResponse?.token) {
|
|
157
|
+
throw new Error(`Unable to login`);
|
|
158
|
+
}
|
|
159
|
+
const profile = {
|
|
160
|
+
identifierId: loginResponse.profile.identifier_id,
|
|
161
|
+
profileId: loginResponse.profile.profile_id
|
|
162
|
+
};
|
|
163
|
+
const accessToken = await getAccessToken(loginResponse.token);
|
|
164
|
+
if (!accessToken) {
|
|
165
|
+
throw new Error(`Unable to get Access Token`);
|
|
166
|
+
}
|
|
167
|
+
this.update((state) => {
|
|
168
|
+
state.isSignedIn = true;
|
|
169
|
+
const expiresIn = /* @__PURE__ */ new Date();
|
|
170
|
+
expiresIn.setTime(expiresIn.getTime() + THIRTY_MIN_MS);
|
|
171
|
+
state.sessionData = {
|
|
172
|
+
profile,
|
|
173
|
+
accessToken,
|
|
174
|
+
expiresIn: expiresIn.toString()
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
return {
|
|
178
|
+
profile,
|
|
179
|
+
accessToken
|
|
180
|
+
};
|
|
181
|
+
} catch (e) {
|
|
182
|
+
console.error("Failed to authenticate", e);
|
|
183
|
+
await this.messagingSystem.call(
|
|
184
|
+
"UserStorageController:disableProfileSyncing"
|
|
185
|
+
);
|
|
186
|
+
const errorMessage = e instanceof Error ? e.message : JSON.stringify(e ?? "");
|
|
187
|
+
throw new Error(
|
|
188
|
+
`${controllerName}: Failed to authenticate - ${errorMessage}`
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
_hasValidSession = new WeakSet();
|
|
193
|
+
hasValidSession_fn = function(sessionData) {
|
|
194
|
+
if (!sessionData) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
const prevDate = Date.parse(sessionData.expiresIn);
|
|
198
|
+
if (isNaN(prevDate)) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
const currentDate = /* @__PURE__ */ new Date();
|
|
202
|
+
const diffMs = Math.abs(currentDate.getTime() - prevDate);
|
|
203
|
+
return THIRTY_MIN_MS > diffMs;
|
|
204
|
+
};
|
|
205
|
+
_snapGetPublicKey = new WeakSet();
|
|
206
|
+
snapGetPublicKey_fn = function() {
|
|
207
|
+
return this.messagingSystem.call(
|
|
208
|
+
"SnapController:handleRequest",
|
|
209
|
+
createSnapPublicKeyRequest()
|
|
210
|
+
);
|
|
211
|
+
};
|
|
212
|
+
_snapSignMessage = new WeakSet();
|
|
213
|
+
snapSignMessage_fn = function(message) {
|
|
214
|
+
return this.messagingSystem.call(
|
|
215
|
+
"SnapController:handleRequest",
|
|
216
|
+
createSnapSignMessageRequest(message)
|
|
217
|
+
);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export {
|
|
221
|
+
defaultState,
|
|
222
|
+
AuthenticationController
|
|
223
|
+
};
|
|
224
|
+
//# sourceMappingURL=chunk-32HAX3MW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/authentication/AuthenticationController.ts"],"sourcesContent":["import type {\n RestrictedControllerMessenger,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type { HandleSnapRequest } from '@metamask/snaps-controllers';\n\nimport type { UserStorageControllerDisableProfileSyncing } from '../user-storage/UserStorageController';\nimport {\n createSnapPublicKeyRequest,\n createSnapSignMessageRequest,\n} from './auth-snap-requests';\nimport {\n createLoginRawMessage,\n getAccessToken,\n getNonce,\n login,\n} from './services';\n\nconst THIRTY_MIN_MS = 1000 * 60 * 30;\n\nconst controllerName = 'AuthenticationController';\n\n// State\ntype SessionProfile = {\n identifierId: string;\n profileId: string;\n};\n\ntype SessionData = {\n /** profile - anonymous profile data for the given logged in user */\n profile: SessionProfile;\n /** accessToken - used to make requests authorized endpoints */\n accessToken: string;\n /** expiresIn - string date to determine if new access token is required */\n expiresIn: string;\n};\n\ntype MetaMetricsAuth = {\n getMetaMetricsId: () => string;\n agent: 'extension' | 'mobile';\n};\n\nexport type AuthenticationControllerState = {\n /**\n * Global isSignedIn state.\n * Can be used to determine if \"Profile Syncing\" is enabled.\n */\n isSignedIn: boolean;\n sessionData?: SessionData;\n};\nexport const defaultState: AuthenticationControllerState = {\n isSignedIn: false,\n};\nconst metadata: StateMetadata<AuthenticationControllerState> = {\n isSignedIn: {\n persist: true,\n anonymous: true,\n },\n sessionData: {\n persist: true,\n anonymous: false,\n },\n};\n\n// Messenger Actions\ntype CreateActionsObj<Controller extends keyof AuthenticationController> = {\n [K in Controller]: {\n type: `${typeof controllerName}:${K}`;\n handler: AuthenticationController[K];\n };\n};\ntype ActionsObj = CreateActionsObj<\n | 'performSignIn'\n | 'performSignOut'\n | 'getBearerToken'\n | 'getSessionProfile'\n | 'isSignedIn'\n>;\nexport type Actions = ActionsObj[keyof ActionsObj];\nexport type AuthenticationControllerPerformSignIn = ActionsObj['performSignIn'];\nexport type AuthenticationControllerPerformSignOut =\n ActionsObj['performSignOut'];\nexport type AuthenticationControllerGetBearerToken =\n ActionsObj['getBearerToken'];\nexport type AuthenticationControllerGetSessionProfile =\n ActionsObj['getSessionProfile'];\nexport type AuthenticationControllerIsSignedIn = ActionsObj['isSignedIn'];\n\n// Allowed Actions\nexport type AllowedActions =\n | HandleSnapRequest\n | UserStorageControllerDisableProfileSyncing;\n\n// Messenger\nexport type AuthenticationControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n Actions | AllowedActions,\n never,\n AllowedActions['type'],\n never\n>;\n\n/**\n * Controller that enables authentication for restricted endpoints.\n * Used for Global Profile Syncing and Notifications\n */\nexport default class AuthenticationController extends BaseController<\n typeof controllerName,\n AuthenticationControllerState,\n AuthenticationControllerMessenger\n> {\n #metametrics: MetaMetricsAuth;\n\n constructor({\n messenger,\n state,\n metametrics,\n }: {\n messenger: AuthenticationControllerMessenger;\n state?: AuthenticationControllerState;\n /**\n * Not using the Messaging System as we\n * do not want to tie this strictly to extension\n */\n metametrics: MetaMetricsAuth;\n }) {\n super({\n messenger,\n metadata,\n name: controllerName,\n state: { ...defaultState, ...state },\n });\n\n this.#metametrics = metametrics;\n\n this.#registerMessageHandlers();\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n 'AuthenticationController:getBearerToken',\n this.getBearerToken.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'AuthenticationController:getSessionProfile',\n this.getSessionProfile.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'AuthenticationController:isSignedIn',\n this.isSignedIn.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'AuthenticationController:performSignIn',\n this.performSignIn.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n 'AuthenticationController:performSignOut',\n this.performSignOut.bind(this),\n );\n }\n\n public async performSignIn(): Promise<string> {\n const { accessToken } = await this.#performAuthenticationFlow();\n return accessToken;\n }\n\n public performSignOut(): void {\n this.#assertLoggedIn();\n\n this.update((state) => {\n state.isSignedIn = false;\n state.sessionData = undefined;\n });\n }\n\n public async getBearerToken(): Promise<string> {\n this.#assertLoggedIn();\n\n if (this.#hasValidSession(this.state.sessionData)) {\n return this.state.sessionData.accessToken;\n }\n\n const { accessToken } = await this.#performAuthenticationFlow();\n return accessToken;\n }\n\n /**\n * Will return a session profile.\n * Throws if a user is not logged in.\n *\n * @returns profile for the session.\n */\n public async getSessionProfile(): Promise<SessionProfile> {\n this.#assertLoggedIn();\n\n if (this.#hasValidSession(this.state.sessionData)) {\n return this.state.sessionData.profile;\n }\n\n const { profile } = await this.#performAuthenticationFlow();\n return profile;\n }\n\n public isSignedIn(): boolean {\n return this.state.isSignedIn;\n }\n\n #assertLoggedIn(): void {\n if (!this.state.isSignedIn) {\n throw new Error(\n `${controllerName}: Unable to call method, user is not authenticated`,\n );\n }\n }\n\n async #performAuthenticationFlow(): Promise<{\n profile: SessionProfile;\n accessToken: string;\n }> {\n try {\n // 1. Nonce\n const publicKey = await this.#snapGetPublicKey();\n const nonce = await getNonce(publicKey);\n if (!nonce) {\n throw new Error(`Unable to get nonce`);\n }\n\n // 2. Login\n const rawMessage = createLoginRawMessage(nonce, publicKey);\n const signature = await this.#snapSignMessage(rawMessage);\n const loginResponse = await login(rawMessage, signature, {\n metametricsId: this.#metametrics.getMetaMetricsId(),\n agent: this.#metametrics.agent,\n });\n if (!loginResponse?.token) {\n throw new Error(`Unable to login`);\n }\n\n const profile: SessionProfile = {\n identifierId: loginResponse.profile.identifier_id,\n profileId: loginResponse.profile.profile_id,\n };\n\n // 3. Trade for Access Token\n const accessToken = await getAccessToken(loginResponse.token);\n if (!accessToken) {\n throw new Error(`Unable to get Access Token`);\n }\n\n // Update Internal State\n this.update((state) => {\n state.isSignedIn = true;\n const expiresIn = new Date();\n expiresIn.setTime(expiresIn.getTime() + THIRTY_MIN_MS);\n state.sessionData = {\n profile,\n accessToken,\n expiresIn: expiresIn.toString(),\n };\n });\n\n return {\n profile,\n accessToken,\n };\n } catch (e) {\n console.error('Failed to authenticate', e);\n // Disable Profile Syncing\n await this.messagingSystem.call(\n 'UserStorageController:disableProfileSyncing',\n );\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new Error(\n `${controllerName}: Failed to authenticate - ${errorMessage}`,\n );\n }\n }\n\n #hasValidSession(\n sessionData: SessionData | undefined,\n ): sessionData is SessionData {\n if (!sessionData) {\n return false;\n }\n\n const prevDate = Date.parse(sessionData.expiresIn);\n if (isNaN(prevDate)) {\n return false;\n }\n\n const currentDate = new Date();\n const diffMs = Math.abs(currentDate.getTime() - prevDate);\n\n return THIRTY_MIN_MS > diffMs;\n }\n\n /**\n * Returns the auth snap public key.\n *\n * @returns The snap public key.\n */\n #snapGetPublicKey(): Promise<string> {\n return this.messagingSystem.call(\n 'SnapController:handleRequest',\n createSnapPublicKeyRequest(),\n ) as Promise<string>;\n }\n\n /**\n * Signs a specific message using an underlying auth snap.\n *\n * @param message - A specific tagged message to sign.\n * @returns A Signature created by the snap.\n */\n #snapSignMessage(message: `metamask:${string}`): Promise<string> {\n return this.messagingSystem.call(\n 'SnapController:handleRequest',\n createSnapSignMessageRequest(message),\n ) as Promise<string>;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
|
+
|
|
3
|
+
var _chunkB6CSNLGEjs = require('./chunk-B6CSNLGE.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkAK7OTIWAjs = require('./chunk-AK7OTIWA.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkSMKTWM6Ijs = require('./chunk-SMKTWM6I.js');
|
|
10
|
+
|
|
11
|
+
// src/controllers/user-storage/services.ts
|
|
12
|
+
var _loglevel = require('loglevel'); var _loglevel2 = _interopRequireDefault(_loglevel);
|
|
13
|
+
var ENV_URLS = _chunkSMKTWM6Ijs.getEnvUrls.call(void 0, "prd" /* PRD */);
|
|
14
|
+
var USER_STORAGE_API = ENV_URLS.userStorageApiUrl;
|
|
15
|
+
var USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;
|
|
16
|
+
async function getUserStorage(opts) {
|
|
17
|
+
try {
|
|
18
|
+
const path = _chunkB6CSNLGEjs.createEntryPath.call(void 0, opts.entryKey, opts.storageKey);
|
|
19
|
+
const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
|
|
20
|
+
const userStorageResponse = await fetch(url.toString(), {
|
|
21
|
+
headers: {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
Authorization: `Bearer ${opts.bearerToken}`
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
if (userStorageResponse.status === 404) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (userStorageResponse.status !== 200) {
|
|
30
|
+
throw new Error("Unable to get User Storage");
|
|
31
|
+
}
|
|
32
|
+
const userStorage = await userStorageResponse.json();
|
|
33
|
+
const encryptedData = userStorage?.Data ?? null;
|
|
34
|
+
if (!encryptedData) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const decryptedData = _chunkAK7OTIWAjs.encryption_default.decryptString(
|
|
38
|
+
encryptedData,
|
|
39
|
+
opts.storageKey
|
|
40
|
+
);
|
|
41
|
+
return decryptedData;
|
|
42
|
+
} catch (e) {
|
|
43
|
+
_loglevel2.default.error("Failed to get user storage", e);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function upsertUserStorage(data, opts) {
|
|
48
|
+
const encryptedData = _chunkAK7OTIWAjs.encryption_default.encryptString(data, opts.storageKey);
|
|
49
|
+
const path = _chunkB6CSNLGEjs.createEntryPath.call(void 0, opts.entryKey, opts.storageKey);
|
|
50
|
+
const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
|
|
51
|
+
const res = await fetch(url.toString(), {
|
|
52
|
+
method: "PUT",
|
|
53
|
+
headers: {
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
Authorization: `Bearer ${opts.bearerToken}`
|
|
56
|
+
},
|
|
57
|
+
body: JSON.stringify({ data: encryptedData })
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
throw new Error("user-storage - unable to upsert data");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
exports.USER_STORAGE_API = USER_STORAGE_API; exports.USER_STORAGE_ENDPOINT = USER_STORAGE_ENDPOINT; exports.getUserStorage = getUserStorage; exports.upsertUserStorage = upsertUserStorage;
|
|
70
|
+
//# sourceMappingURL=chunk-5SXXO4MV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/services.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,SAAS;AAOhB,IAAM,WAAW,0BAAkB;AAE5B,IAAM,mBAA2B,SAAS;AAC1C,IAAM,wBAAwB,GAAG,gBAAgB;AAwBxD,eAAsB,eACpB,MACwB;AACxB,MAAI;AACF,UAAM,OAAO,gBAAgB,KAAK,UAAU,KAAK,UAAU;AAC3D,UAAM,MAAM,IAAI,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAAE;AAErD,UAAM,sBAAsB,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtD,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,WAAW;AAAA,MAC3C;AAAA,IACF,CAAC;AAGD,QAAI,oBAAoB,WAAW,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,WAAW,KAAK;AACtC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,UAAM,cACJ,MAAM,oBAAoB,KAAK;AACjC,UAAM,gBAAgB,aAAa,QAAQ;AAE3C,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,mBAAW;AAAA,MAC/B;AAAA,MACA,KAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,QAAI,MAAM,8BAA8B,CAAC;AACzC,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,kBACpB,MACA,MACe;AACf,QAAM,gBAAgB,mBAAW,cAAc,MAAM,KAAK,UAAU;AACpE,QAAM,OAAO,gBAAgB,KAAK,UAAU,KAAK,UAAU;AAC3D,QAAM,MAAM,IAAI,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAAE;AAErD,QAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,IACtC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK,WAAW;AAAA,IAC3C;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAAA,EAC9C,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACF","sourcesContent":["import log from 'loglevel';\n\nimport { Env, getEnvUrls } from '../../sdk';\nimport encryption from './encryption';\nimport type { UserStorageEntryKeys } from './schema';\nimport { createEntryPath } from './schema';\n\nconst ENV_URLS = getEnvUrls(Env.PRD);\n\nexport const USER_STORAGE_API: string = ENV_URLS.userStorageApiUrl;\nexport const USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;\n\n/**\n * This is the Server Response shape\n */\nexport type GetUserStorageResponse = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HashedKey: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Data: string;\n};\n\nexport type UserStorageOptions = {\n bearerToken: string;\n entryKey: UserStorageEntryKeys;\n storageKey: string;\n};\n\n/**\n * User Storage Service - Get Storage Entry.\n *\n * @param opts - User Storage Options\n * @returns The storage entry, or null if fails to find entry\n */\nexport async function getUserStorage(\n opts: UserStorageOptions,\n): Promise<string | null> {\n try {\n const path = createEntryPath(opts.entryKey, opts.storageKey);\n const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);\n\n const userStorageResponse = await fetch(url.toString(), {\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.bearerToken}`,\n },\n });\n\n // Acceptable error - since indicates entry does not exist.\n if (userStorageResponse.status === 404) {\n return null;\n }\n\n if (userStorageResponse.status !== 200) {\n throw new Error('Unable to get User Storage');\n }\n\n const userStorage: GetUserStorageResponse | null =\n await userStorageResponse.json();\n const encryptedData = userStorage?.Data ?? null;\n\n if (!encryptedData) {\n return null;\n }\n\n const decryptedData = encryption.decryptString(\n encryptedData,\n opts.storageKey,\n );\n\n return decryptedData;\n } catch (e) {\n log.error('Failed to get user storage', e);\n return null;\n }\n}\n\n/**\n * User Storage Service - Set Storage Entry.\n *\n * @param data - data to store\n * @param opts - storage options\n */\nexport async function upsertUserStorage(\n data: string,\n opts: UserStorageOptions,\n): Promise<void> {\n const encryptedData = encryption.encryptString(data, opts.storageKey);\n const path = createEntryPath(opts.entryKey, opts.storageKey);\n const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);\n\n const res = await fetch(url.toString(), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.bearerToken}`,\n },\n body: JSON.stringify({ data: encryptedData }),\n });\n\n if (!res.ok) {\n throw new Error('user-storage - unable to upsert data');\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
encryption_default
|
|
3
|
+
} from "./chunk-K5UKU454.mjs";
|
|
4
|
+
|
|
5
|
+
// src/controllers/user-storage/encryption/index.ts
|
|
6
|
+
var encryption_default2 = encryption_default;
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
encryption_default2 as encryption_default
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=chunk-5TOWF6UW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/encryption/index.ts"],"sourcesContent":["import Encryption from './encryption';\n\nexport { Encryption };\nexport * from './encryption';\nexport default Encryption;\n"],"mappings":";;;;;AAIA,IAAOA,sBAAQ;","names":["encryption_default"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// src/controllers/authentication/auth-snap-requests.ts
|
|
2
|
+
import { HandlerType } from "@metamask/snaps-utils";
|
|
3
|
+
var snapId = "npm:@metamask/message-signing-snap";
|
|
4
|
+
function createSnapPublicKeyRequest() {
|
|
5
|
+
return {
|
|
6
|
+
snapId,
|
|
7
|
+
origin: "",
|
|
8
|
+
handler: HandlerType.OnRpcRequest,
|
|
9
|
+
request: {
|
|
10
|
+
method: "getPublicKey"
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function createSnapSignMessageRequest(message) {
|
|
15
|
+
return {
|
|
16
|
+
snapId,
|
|
17
|
+
origin: "",
|
|
18
|
+
handler: HandlerType.OnRpcRequest,
|
|
19
|
+
request: {
|
|
20
|
+
method: "signMessage",
|
|
21
|
+
params: { message }
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
createSnapPublicKeyRequest,
|
|
28
|
+
createSnapSignMessageRequest
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=chunk-6P6CUKKI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/authentication/auth-snap-requests.ts"],"sourcesContent":["import type { HandleSnapRequest } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { HandlerType } from '@metamask/snaps-utils';\n\ntype SnapRPCRequest = Parameters<HandleSnapRequest['handler']>[0];\n\nconst snapId = 'npm:@metamask/message-signing-snap' as SnapId;\n\n/**\n * Constructs Request to Message Signing Snap to get Public Key\n *\n * @returns Snap Public Key Request\n */\nexport function createSnapPublicKeyRequest(): SnapRPCRequest {\n return {\n snapId,\n origin: '',\n handler: HandlerType.OnRpcRequest,\n request: {\n method: 'getPublicKey',\n },\n };\n}\n\n/**\n * Constructs Request to get Message Signing Snap to sign a message.\n *\n * @param message - message to sign\n * @returns Snap Sign Message Request\n */\nexport function createSnapSignMessageRequest(\n message: `metamask:${string}`,\n): SnapRPCRequest {\n return {\n snapId,\n origin: '',\n handler: HandlerType.OnRpcRequest,\n request: {\n method: 'signMessage',\n params: { message },\n },\n };\n}\n"],"mappings":";AAEA,SAAS,mBAAmB;AAI5B,IAAM,SAAS;AAOR,SAAS,6BAA6C;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,SAAS,YAAY;AAAA,IACrB,SAAS;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAQO,SAAS,6BACd,SACgB;AAChB,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,SAAS,YAAY;AAAA,IACrB,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ,EAAE,QAAQ;AAAA,IACpB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/controllers/user-storage/encryption/utils.ts
|
|
2
|
+
var byteArrayToBase64 = (byteArray) => {
|
|
3
|
+
return Buffer.from(byteArray).toString("base64");
|
|
4
|
+
};
|
|
5
|
+
var base64ToByteArray = (base64) => {
|
|
6
|
+
return new Uint8Array(Buffer.from(base64, "base64"));
|
|
7
|
+
};
|
|
8
|
+
var bytesToUtf8 = (byteArray) => {
|
|
9
|
+
const decoder = new TextDecoder("utf-8");
|
|
10
|
+
return decoder.decode(byteArray);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
byteArrayToBase64,
|
|
15
|
+
base64ToByteArray,
|
|
16
|
+
bytesToUtf8
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=chunk-76VRE4BI.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/encryption/utils.ts"],"sourcesContent":["export const byteArrayToBase64 = (byteArray: Uint8Array) => {\n return Buffer.from(byteArray).toString('base64');\n};\n\nexport const base64ToByteArray = (base64: string) => {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n};\n\nexport const bytesToUtf8 = (byteArray: Uint8Array) => {\n const decoder = new TextDecoder('utf-8');\n return decoder.decode(byteArray);\n};\n"],"mappings":";AAAO,IAAM,oBAAoB,CAAC,cAA0B;AAC1D,SAAO,OAAO,KAAK,SAAS,EAAE,SAAS,QAAQ;AACjD;AAEO,IAAM,oBAAoB,CAAC,WAAmB;AACnD,SAAO,IAAI,WAAW,OAAO,KAAK,QAAQ,QAAQ,CAAC;AACrD;AAEO,IAAM,cAAc,CAAC,cAA0B;AACpD,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,SAAO,QAAQ,OAAO,SAAS;AACjC;","names":[]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuthenticationController,
|
|
3
|
+
defaultState
|
|
4
|
+
} from "./chunk-32HAX3MW.mjs";
|
|
5
|
+
import {
|
|
6
|
+
AUTH_LOGIN_ENDPOINT,
|
|
7
|
+
AUTH_NONCE_ENDPOINT,
|
|
8
|
+
OIDC_TOKENS_ENDPOINT
|
|
9
|
+
} from "./chunk-KBCXN3YW.mjs";
|
|
10
|
+
import {
|
|
11
|
+
__export
|
|
12
|
+
} from "./chunk-U5UIDVOO.mjs";
|
|
13
|
+
|
|
14
|
+
// src/controllers/authentication/index.ts
|
|
15
|
+
var authentication_exports = {};
|
|
16
|
+
__export(authentication_exports, {
|
|
17
|
+
Controller: () => AuthenticationController,
|
|
18
|
+
Mocks: () => fixtures_exports,
|
|
19
|
+
defaultState: () => defaultState
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// src/controllers/authentication/__fixtures__/index.ts
|
|
23
|
+
var fixtures_exports = {};
|
|
24
|
+
__export(fixtures_exports, {
|
|
25
|
+
MOCK_ACCESS_TOKEN: () => MOCK_ACCESS_TOKEN,
|
|
26
|
+
MOCK_JWT: () => MOCK_JWT,
|
|
27
|
+
MOCK_LOGIN_RESPONSE: () => MOCK_LOGIN_RESPONSE,
|
|
28
|
+
MOCK_NONCE: () => MOCK_NONCE,
|
|
29
|
+
MOCK_NONCE_RESPONSE: () => MOCK_NONCE_RESPONSE,
|
|
30
|
+
MOCK_OATH_TOKEN_RESPONSE: () => MOCK_OATH_TOKEN_RESPONSE,
|
|
31
|
+
getMockAuthAccessTokenResponse: () => getMockAuthAccessTokenResponse,
|
|
32
|
+
getMockAuthLoginResponse: () => getMockAuthLoginResponse,
|
|
33
|
+
getMockAuthNonceResponse: () => getMockAuthNonceResponse
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// src/controllers/authentication/__fixtures__/mockResponses.ts
|
|
37
|
+
var MOCK_NONCE = "4cbfqzoQpcNxVImGv";
|
|
38
|
+
var MOCK_NONCE_RESPONSE = {
|
|
39
|
+
nonce: MOCK_NONCE
|
|
40
|
+
};
|
|
41
|
+
var getMockAuthNonceResponse = () => {
|
|
42
|
+
return {
|
|
43
|
+
url: AUTH_NONCE_ENDPOINT,
|
|
44
|
+
requestMethod: "GET",
|
|
45
|
+
response: MOCK_NONCE_RESPONSE
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
var MOCK_JWT = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c";
|
|
49
|
+
var MOCK_LOGIN_RESPONSE = {
|
|
50
|
+
token: MOCK_JWT,
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
52
|
+
expires_in: (/* @__PURE__ */ new Date()).toString(),
|
|
53
|
+
profile: {
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
55
|
+
identifier_id: "MOCK_IDENTIFIER",
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
57
|
+
profile_id: "MOCK_PROFILE_ID"
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var getMockAuthLoginResponse = () => {
|
|
61
|
+
return {
|
|
62
|
+
url: AUTH_LOGIN_ENDPOINT,
|
|
63
|
+
requestMethod: "POST",
|
|
64
|
+
response: MOCK_LOGIN_RESPONSE
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
var MOCK_ACCESS_TOKEN = `MOCK_ACCESS_TOKEN-${MOCK_JWT}`;
|
|
68
|
+
var MOCK_OATH_TOKEN_RESPONSE = {
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
70
|
+
access_token: MOCK_ACCESS_TOKEN,
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
72
|
+
expires_in: (/* @__PURE__ */ new Date()).getTime()
|
|
73
|
+
};
|
|
74
|
+
var getMockAuthAccessTokenResponse = () => {
|
|
75
|
+
return {
|
|
76
|
+
url: OIDC_TOKENS_ENDPOINT,
|
|
77
|
+
requestMethod: "POST",
|
|
78
|
+
response: MOCK_OATH_TOKEN_RESPONSE
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
fixtures_exports,
|
|
84
|
+
authentication_exports
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=chunk-AARMY5TW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/authentication/index.ts","../src/controllers/authentication/__fixtures__/index.ts","../src/controllers/authentication/__fixtures__/mockResponses.ts"],"sourcesContent":["import Controller from './AuthenticationController';\n\nexport { Controller };\nexport * from './AuthenticationController';\nexport * as Mocks from './__fixtures__';\n","export * from './mockResponses';\n","import type {\n LoginResponse,\n NonceResponse,\n OAuthTokenResponse,\n} from '../services';\nimport {\n AUTH_LOGIN_ENDPOINT,\n AUTH_NONCE_ENDPOINT,\n OIDC_TOKENS_ENDPOINT,\n} from '../services';\n\ntype MockResponse = {\n url: string;\n requestMethod: 'GET' | 'POST' | 'PUT';\n response: unknown;\n};\n\nexport const MOCK_NONCE = '4cbfqzoQpcNxVImGv';\nexport const MOCK_NONCE_RESPONSE: NonceResponse = {\n nonce: MOCK_NONCE,\n};\n\nexport const getMockAuthNonceResponse = () => {\n return {\n url: AUTH_NONCE_ENDPOINT,\n requestMethod: 'GET',\n response: MOCK_NONCE_RESPONSE,\n } satisfies MockResponse;\n};\n\nexport const MOCK_JWT =\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';\nexport const MOCK_LOGIN_RESPONSE: LoginResponse = {\n token: MOCK_JWT,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n expires_in: new Date().toString(),\n profile: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n identifier_id: 'MOCK_IDENTIFIER',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n profile_id: 'MOCK_PROFILE_ID',\n },\n};\n\nexport const getMockAuthLoginResponse = () => {\n return {\n url: AUTH_LOGIN_ENDPOINT,\n requestMethod: 'POST',\n response: MOCK_LOGIN_RESPONSE,\n } satisfies MockResponse;\n};\n\nexport const MOCK_ACCESS_TOKEN = `MOCK_ACCESS_TOKEN-${MOCK_JWT}`;\nexport const MOCK_OATH_TOKEN_RESPONSE: OAuthTokenResponse = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n access_token: MOCK_ACCESS_TOKEN,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n expires_in: new Date().getTime(),\n};\n\nexport const getMockAuthAccessTokenResponse = () => {\n return {\n url: OIDC_TOKENS_ENDPOINT,\n requestMethod: 'POST',\n response: MOCK_OATH_TOKEN_RESPONSE,\n } satisfies MockResponse;\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACiBO,IAAM,aAAa;AACnB,IAAM,sBAAqC;AAAA,EAChD,OAAO;AACT;AAEO,IAAM,2BAA2B,MAAM;AAC5C,SAAO;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;AAEO,IAAM,WACX;AACK,IAAM,sBAAqC;AAAA,EAChD,OAAO;AAAA;AAAA,EAEP,aAAY,oBAAI,KAAK,GAAE,SAAS;AAAA,EAChC,SAAS;AAAA;AAAA,IAEP,eAAe;AAAA;AAAA,IAEf,YAAY;AAAA,EACd;AACF;AAEO,IAAM,2BAA2B,MAAM;AAC5C,SAAO;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;AAEO,IAAM,oBAAoB,qBAAqB,QAAQ;AACvD,IAAM,2BAA+C;AAAA;AAAA,EAE1D,cAAc;AAAA;AAAA,EAEd,aAAY,oBAAI,KAAK,GAAE,QAAQ;AACjC;AAEO,IAAM,iCAAiC,MAAM;AAClD,SAAO;AAAA,IACL,KAAK;AAAA,IACL,eAAe;AAAA,IACf,UAAU;AAAA,EACZ;AACF;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
var _chunkT3FNDVE3js = require('./chunk-T3FNDVE3.js');
|
|
4
|
+
|
|
5
|
+
// src/controllers/user-storage/encryption/index.ts
|
|
6
|
+
var encryption_default2 = _chunkT3FNDVE3js.encryption_default;
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
exports.encryption_default = encryption_default2;
|
|
11
|
+
//# sourceMappingURL=chunk-AK7OTIWA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/encryption/index.ts"],"names":["encryption_default"],"mappings":";;;;;AAIA,IAAOA,sBAAQ","sourcesContent":["import Encryption from './encryption';\n\nexport { Encryption };\nexport * from './encryption';\nexport default Encryption;\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createSHA256Hash
|
|
3
|
+
} from "./chunk-K5UKU454.mjs";
|
|
4
|
+
|
|
5
|
+
// src/controllers/user-storage/schema.ts
|
|
6
|
+
var USER_STORAGE_ENTRIES = {
|
|
7
|
+
notificationSettings: {
|
|
8
|
+
path: "notifications",
|
|
9
|
+
entryName: "notificationSettings"
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
function createEntryPath(entryKey, storageKey) {
|
|
13
|
+
const entry = USER_STORAGE_ENTRIES[entryKey];
|
|
14
|
+
if (!entry) {
|
|
15
|
+
throw new Error(`user-storage - invalid entry provided: ${entryKey}`);
|
|
16
|
+
}
|
|
17
|
+
const hashedKey = createSHA256Hash(entry.entryName + storageKey);
|
|
18
|
+
return `/${entry.path}/${hashedKey}`;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export {
|
|
22
|
+
USER_STORAGE_ENTRIES,
|
|
23
|
+
createEntryPath
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=chunk-AUFUOKJW.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/schema.ts"],"sourcesContent":["import { createSHA256Hash } from './encryption';\n\ntype UserStorageEntry = { path: string; entryName: string };\n\n/**\n * The User Storage Endpoint requires a path and an entry name.\n * Developers can provide additional paths by extending this variable below\n */\nexport const USER_STORAGE_ENTRIES = {\n notificationSettings: {\n path: 'notifications',\n entryName: 'notificationSettings',\n },\n} satisfies Record<string, UserStorageEntry>;\n\nexport type UserStorageEntryKeys = keyof typeof USER_STORAGE_ENTRIES;\n\n/**\n * Constructs a unique entry path for a user.\n * This can be done due to the uniqueness of the storage key (no users will share the same storage key).\n * The users entry is a unique hash that cannot be reversed.\n *\n * @param entryKey - storage schema entry key\n * @param storageKey - users storage key\n * @returns path to store entry\n */\nexport function createEntryPath(\n entryKey: UserStorageEntryKeys,\n storageKey: string,\n): string {\n const entry = USER_STORAGE_ENTRIES[entryKey];\n if (!entry) {\n throw new Error(`user-storage - invalid entry provided: ${entryKey}`);\n }\n\n const hashedKey = createSHA256Hash(entry.entryName + storageKey);\n return `/${entry.path}/${hashedKey}`;\n}\n"],"mappings":";;;;;AAQO,IAAM,uBAAuB;AAAA,EAClC,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,WAAW;AAAA,EACb;AACF;AAaO,SAAS,gBACd,UACA,YACQ;AACR,QAAM,QAAQ,qBAAqB,QAAQ;AAC3C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,0CAA0C,QAAQ,EAAE;AAAA,EACtE;AAEA,QAAM,YAAY,iBAAiB,MAAM,YAAY,UAAU;AAC/D,SAAO,IAAI,MAAM,IAAI,IAAI,SAAS;AACpC;","names":[]}
|