@cubist-labs/cubesigner-sdk 0.3.23 → 0.3.26

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.
Files changed (89) hide show
  1. package/dist/cjs/package.json +1 -1
  2. package/dist/cjs/src/api.d.ts +4 -4
  3. package/dist/cjs/src/api.js +5 -4
  4. package/dist/cjs/src/client.d.ts +4 -4
  5. package/dist/cjs/src/client.js +2 -2
  6. package/dist/cjs/src/env.js +9 -29
  7. package/dist/cjs/src/index.d.ts +0 -2
  8. package/dist/cjs/src/index.js +1 -3
  9. package/dist/cjs/src/org.d.ts +22 -1
  10. package/dist/cjs/src/org.js +1 -1
  11. package/dist/cjs/src/role.d.ts +2 -1
  12. package/dist/cjs/src/role.js +1 -1
  13. package/dist/cjs/src/schema.d.ts +29 -29
  14. package/dist/cjs/src/schema.js +1 -1
  15. package/dist/cjs/src/schema_types.d.ts +3 -1
  16. package/dist/cjs/src/schema_types.js +1 -1
  17. package/dist/esm/package.json +1 -1
  18. package/dist/esm/src/api.d.ts +4 -4
  19. package/dist/esm/src/api.js +5 -4
  20. package/dist/esm/src/client.d.ts +4 -4
  21. package/dist/esm/src/client.js +2 -2
  22. package/dist/esm/src/env.js +4 -4
  23. package/dist/esm/src/index.d.ts +0 -2
  24. package/dist/esm/src/index.js +1 -3
  25. package/dist/esm/src/org.d.ts +22 -1
  26. package/dist/esm/src/org.js +1 -1
  27. package/dist/esm/src/role.d.ts +2 -1
  28. package/dist/esm/src/role.js +1 -1
  29. package/dist/esm/src/schema.d.ts +29 -29
  30. package/dist/esm/src/schema.js +1 -1
  31. package/dist/esm/src/schema_types.d.ts +3 -1
  32. package/dist/esm/src/schema_types.js +1 -1
  33. package/package.json +1 -1
  34. package/src/api.ts +7 -6
  35. package/src/client.ts +3 -3
  36. package/src/env.ts +3 -3
  37. package/src/index.ts +0 -2
  38. package/src/org.ts +23 -1
  39. package/src/role.ts +4 -3
  40. package/src/schema.ts +29 -29
  41. package/src/schema_types.ts +3 -1
  42. package/tsconfig.json +1 -0
  43. package/dist/cjs/src/org_event_processor.d.ts +0 -57
  44. package/dist/cjs/src/org_event_processor.js +0 -137
  45. package/dist/esm/src/org_event_processor.d.ts +0 -57
  46. package/dist/esm/src/org_event_processor.js +0 -133
  47. package/dist/package.json +0 -36
  48. package/dist/spec/env/beta.json +0 -9
  49. package/dist/spec/env/gamma.json +0 -9
  50. package/dist/spec/env/prod.json +0 -9
  51. package/dist/src/api.d.ts +0 -634
  52. package/dist/src/api.js +0 -1309
  53. package/dist/src/client.d.ts +0 -575
  54. package/dist/src/client.js +0 -381
  55. package/dist/src/env.d.ts +0 -15
  56. package/dist/src/env.js +0 -35
  57. package/dist/src/error.d.ts +0 -29
  58. package/dist/src/error.js +0 -36
  59. package/dist/src/events.d.ts +0 -84
  60. package/dist/src/events.js +0 -195
  61. package/dist/src/index.d.ts +0 -207
  62. package/dist/src/index.js +0 -308
  63. package/dist/src/key.d.ts +0 -152
  64. package/dist/src/key.js +0 -242
  65. package/dist/src/mfa.d.ts +0 -94
  66. package/dist/src/mfa.js +0 -169
  67. package/dist/src/org.d.ts +0 -99
  68. package/dist/src/org.js +0 -95
  69. package/dist/src/paginator.d.ts +0 -76
  70. package/dist/src/paginator.js +0 -99
  71. package/dist/src/response.d.ts +0 -101
  72. package/dist/src/response.js +0 -164
  73. package/dist/src/role.d.ts +0 -283
  74. package/dist/src/role.js +0 -253
  75. package/dist/src/schema.d.ts +0 -6209
  76. package/dist/src/schema.js +0 -7
  77. package/dist/src/schema_types.d.ts +0 -113
  78. package/dist/src/schema_types.js +0 -3
  79. package/dist/src/session/session_storage.d.ts +0 -47
  80. package/dist/src/session/session_storage.js +0 -76
  81. package/dist/src/session/signer_session_manager.d.ts +0 -125
  82. package/dist/src/session/signer_session_manager.js +0 -239
  83. package/dist/src/signer_session.d.ts +0 -41
  84. package/dist/src/signer_session.js +0 -77
  85. package/dist/src/user_export.d.ts +0 -52
  86. package/dist/src/user_export.js +0 -129
  87. package/dist/src/util.d.ts +0 -61
  88. package/dist/src/util.js +0 -97
  89. package/src/org_event_processor.ts +0 -173
@@ -1,61 +0,0 @@
1
- /** JSON map type */
2
- export interface JsonMap {
3
- [member: string]: string | number | boolean | null | JsonArray | JsonMap;
4
- }
5
- /** JSON array type */
6
- export type JsonArray = Array<string | number | boolean | null | JsonArray | JsonMap>;
7
- /**
8
- * Path join
9
- * @param {string} dir Parent directory
10
- * @param {string} file Pathname
11
- * @return {string} New pathname
12
- */
13
- export declare function pathJoin(dir: string, file: string): string;
14
- /**
15
- * Directory where CubeSigner stores config files.
16
- * @return {string} Config dir
17
- */
18
- export declare function configDir(): string;
19
- /**
20
- * Browser-friendly helper for decoding a 'base64'-encoded string into a byte array.
21
- *
22
- * @param {string} b64 The 'base64'-encoded string to decode
23
- * @return {Uint8Array} Decoded byte array
24
- */
25
- export declare function decodeBase64(b64: string): Uint8Array;
26
- /**
27
- * Browser-friendly helper for decoding a 'base64url'-encoded string into a byte array.
28
- *
29
- * @param {string} b64url The 'base64url'-encoded string to decode
30
- * @return {Uint8Array} Decoded byte array
31
- */
32
- export declare function decodeBase64Url(b64url: string): Uint8Array;
33
- /**
34
- *
35
- * Browser-friendly helper for encoding a byte array into a padded `base64`-encoded string.
36
- *
37
- * @param {Iterable<number>} buffer The byte array to encode
38
- * @return {string} The 'base64' encoding of the byte array.
39
- */
40
- export declare function encodeToBase64(buffer: Iterable<number>): string;
41
- /**
42
- * Browser-friendly helper for encoding a byte array into a 'base64url`-encoded string.
43
- *
44
- * @param {Iterable<number>} buffer The byte array to encode
45
- * @return {string} The 'base64url' encoding of the byte array.
46
- */
47
- export declare function encodeToBase64Url(buffer: Iterable<number>): string;
48
- /**
49
- * Sleeps for `ms` milliseconds.
50
- *
51
- * @param {number} ms Milliseconds to sleep
52
- * @return {Promise<void>} A promise that is resolved after `ms` milliseconds.
53
- */
54
- export declare function delay(ms: number): Promise<void>;
55
- /**
56
- * Converts a string or a uint8 array into a hex string. Strings are encoded in UTF-8 before
57
- * being converted to hex.
58
- * @param {string | Uint8Array} message The input
59
- * @return {string} Hex string prefixed with "0x"
60
- */
61
- export declare function encodeToHex(message: string | Uint8Array): string;
package/dist/src/util.js DELETED
@@ -1,97 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.encodeToHex = exports.delay = exports.encodeToBase64Url = exports.encodeToBase64 = exports.decodeBase64Url = exports.decodeBase64 = exports.configDir = exports.pathJoin = void 0;
4
- /**
5
- * Path join
6
- * @param {string} dir Parent directory
7
- * @param {string} file Pathname
8
- * @return {string} New pathname
9
- */
10
- function pathJoin(dir, file) {
11
- const sep = globalThis?.process?.platform === "win32" ? "\\" : "/";
12
- return `${dir}${sep}${file}`;
13
- }
14
- exports.pathJoin = pathJoin;
15
- /**
16
- * Directory where CubeSigner stores config files.
17
- * @return {string} Config dir
18
- */
19
- function configDir() {
20
- const configDir = process.platform === "darwin"
21
- ? `${process.env.HOME}/Library/Application Support`
22
- : `${process.env.HOME}/.config`;
23
- return pathJoin(configDir, "cubesigner");
24
- }
25
- exports.configDir = configDir;
26
- /**
27
- * Browser-friendly helper for decoding a 'base64'-encoded string into a byte array.
28
- *
29
- * @param {string} b64 The 'base64'-encoded string to decode
30
- * @return {Uint8Array} Decoded byte array
31
- */
32
- function decodeBase64(b64) {
33
- return typeof Buffer === "function"
34
- ? Buffer.from(b64, "base64")
35
- : Uint8Array.from(atob(b64), (c) => c.charCodeAt(0));
36
- }
37
- exports.decodeBase64 = decodeBase64;
38
- /**
39
- * Browser-friendly helper for decoding a 'base64url'-encoded string into a byte array.
40
- *
41
- * @param {string} b64url The 'base64url'-encoded string to decode
42
- * @return {Uint8Array} Decoded byte array
43
- */
44
- function decodeBase64Url(b64url) {
45
- // NOTE: there is no "base64url" encoding in the "buffer" module for the browser (unlike in node.js)
46
- const b64 = b64url.replace(/-/g, "+").replace(/_/g, "/").replace(/=*$/g, "");
47
- return decodeBase64(b64);
48
- }
49
- exports.decodeBase64Url = decodeBase64Url;
50
- /**
51
- *
52
- * Browser-friendly helper for encoding a byte array into a padded `base64`-encoded string.
53
- *
54
- * @param {Iterable<number>} buffer The byte array to encode
55
- * @return {string} The 'base64' encoding of the byte array.
56
- */
57
- function encodeToBase64(buffer) {
58
- const bytes = new Uint8Array(buffer);
59
- const b64 = typeof Buffer === "function"
60
- ? Buffer.from(bytes).toString("base64")
61
- : btoa(bytes.reduce((s, b) => s + String.fromCharCode(b), ""));
62
- return b64;
63
- }
64
- exports.encodeToBase64 = encodeToBase64;
65
- /**
66
- * Browser-friendly helper for encoding a byte array into a 'base64url`-encoded string.
67
- *
68
- * @param {Iterable<number>} buffer The byte array to encode
69
- * @return {string} The 'base64url' encoding of the byte array.
70
- */
71
- function encodeToBase64Url(buffer) {
72
- const b64 = encodeToBase64(buffer);
73
- // NOTE: there is no "base64url" encoding in the "buffer" module for the browser (unlike in node.js)
74
- return b64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=*$/g, "");
75
- }
76
- exports.encodeToBase64Url = encodeToBase64Url;
77
- /**
78
- * Sleeps for `ms` milliseconds.
79
- *
80
- * @param {number} ms Milliseconds to sleep
81
- * @return {Promise<void>} A promise that is resolved after `ms` milliseconds.
82
- */
83
- function delay(ms) {
84
- return new Promise((resolve) => setTimeout(resolve, ms));
85
- }
86
- exports.delay = delay;
87
- /**
88
- * Converts a string or a uint8 array into a hex string. Strings are encoded in UTF-8 before
89
- * being converted to hex.
90
- * @param {string | Uint8Array} message The input
91
- * @return {string} Hex string prefixed with "0x"
92
- */
93
- function encodeToHex(message) {
94
- return ("0x" + (typeof message === "string" ? Buffer.from(message, "utf8") : message).toString("hex"));
95
- }
96
- exports.encodeToHex = encodeToHex;
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVFBOzs7OztHQUtHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLEdBQVcsRUFBRSxJQUFZO0lBQ2hELE1BQU0sR0FBRyxHQUFHLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDbkUsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7QUFDL0IsQ0FBQztBQUhELDRCQUdDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUztJQUN2QixNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVE7UUFDM0IsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLDhCQUE4QjtRQUNuRCxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDO0lBQ3BDLE9BQU8sUUFBUSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBTkQsOEJBTUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sT0FBTyxNQUFNLEtBQUssVUFBVTtRQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFKRCxvQ0FJQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLE1BQWM7SUFDNUMsb0dBQW9HO0lBQ3BHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RSxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBSkQsMENBSUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixjQUFjLENBQUMsTUFBd0I7SUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQ1AsT0FBTyxNQUFNLEtBQUssVUFBVTtRQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBUEQsd0NBT0M7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLE1BQXdCO0lBQ3hELE1BQU0sR0FBRyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxvR0FBb0c7SUFDcEcsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUpELDhDQUlDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixLQUFLLENBQUMsRUFBVTtJQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUZELHNCQUVDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQUMsT0FBNEI7SUFDdEQsT0FBTyxDQUNMLElBQUksR0FBRyxDQUFDLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDOUYsQ0FBQztBQUNKLENBQUM7QUFKRCxrQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBKU09OIG1hcCB0eXBlICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25NYXAge1xuICBbbWVtYmVyOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IEpzb25BcnJheSB8IEpzb25NYXA7XG59XG5cbi8qKiBKU09OIGFycmF5IHR5cGUgKi9cbmV4cG9ydCB0eXBlIEpzb25BcnJheSA9IEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgSnNvbkFycmF5IHwgSnNvbk1hcD47XG5cbi8qKlxuICogUGF0aCBqb2luXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyIFBhcmVudCBkaXJlY3RvcnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlIFBhdGhuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5ldyBwYXRobmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aEpvaW4oZGlyOiBzdHJpbmcsIGZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNlcCA9IGdsb2JhbFRoaXM/LnByb2Nlc3M/LnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcIlxcXFxcIiA6IFwiL1wiO1xuICByZXR1cm4gYCR7ZGlyfSR7c2VwfSR7ZmlsZX1gO1xufVxuXG4vKipcbiAqIERpcmVjdG9yeSB3aGVyZSBDdWJlU2lnbmVyIHN0b3JlcyBjb25maWcgZmlsZXMuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IENvbmZpZyBkaXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ0RpcigpOiBzdHJpbmcge1xuICBjb25zdCBjb25maWdEaXIgPVxuICAgIHByb2Nlc3MucGxhdGZvcm0gPT09IFwiZGFyd2luXCJcbiAgICAgID8gYCR7cHJvY2Vzcy5lbnYuSE9NRX0vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0YFxuICAgICAgOiBgJHtwcm9jZXNzLmVudi5IT01FfS8uY29uZmlnYDtcbiAgcmV0dXJuIHBhdGhKb2luKGNvbmZpZ0RpciwgXCJjdWJlc2lnbmVyXCIpO1xufVxuXG4vKipcbiAqIEJyb3dzZXItZnJpZW5kbHkgaGVscGVyIGZvciBkZWNvZGluZyBhICdiYXNlNjQnLWVuY29kZWQgc3RyaW5nIGludG8gYSBieXRlIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiNjQgVGhlICdiYXNlNjQnLWVuY29kZWQgc3RyaW5nIHRvIGRlY29kZVxuICogQHJldHVybiB7VWludDhBcnJheX0gRGVjb2RlZCBieXRlIGFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVCYXNlNjQoYjY0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIHR5cGVvZiBCdWZmZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gQnVmZmVyLmZyb20oYjY0LCBcImJhc2U2NFwiKVxuICAgIDogVWludDhBcnJheS5mcm9tKGF0b2IoYjY0KSwgKGMpID0+IGMuY2hhckNvZGVBdCgwKSk7XG59XG5cbi8qKlxuICogQnJvd3Nlci1mcmllbmRseSBoZWxwZXIgZm9yIGRlY29kaW5nIGEgJ2Jhc2U2NHVybCctZW5jb2RlZCBzdHJpbmcgaW50byBhIGJ5dGUgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGI2NHVybCBUaGUgJ2Jhc2U2NHVybCctZW5jb2RlZCBzdHJpbmcgdG8gZGVjb2RlXG4gKiBAcmV0dXJuIHtVaW50OEFycmF5fSBEZWNvZGVkIGJ5dGUgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NFVybChiNjR1cmw6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAvLyBOT1RFOiB0aGVyZSBpcyBubyBcImJhc2U2NHVybFwiIGVuY29kaW5nIGluIHRoZSBcImJ1ZmZlclwiIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgKHVubGlrZSBpbiBub2RlLmpzKVxuICBjb25zdCBiNjQgPSBiNjR1cmwucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIikucmVwbGFjZSgvPSokL2csIFwiXCIpO1xuICByZXR1cm4gZGVjb2RlQmFzZTY0KGI2NCk7XG59XG5cbi8qKlxuICpcbiAqIEJyb3dzZXItZnJpZW5kbHkgaGVscGVyIGZvciBlbmNvZGluZyBhIGJ5dGUgYXJyYXkgaW50byBhIHBhZGRlZCBgYmFzZTY0YC1lbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPG51bWJlcj59IGJ1ZmZlciBUaGUgYnl0ZSBhcnJheSB0byBlbmNvZGVcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlICdiYXNlNjQnIGVuY29kaW5nIG9mIHRoZSBieXRlIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVG9CYXNlNjQoYnVmZmVyOiBJdGVyYWJsZTxudW1iZXI+KTogc3RyaW5nIHtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBjb25zdCBiNjQgPVxuICAgIHR5cGVvZiBCdWZmZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBCdWZmZXIuZnJvbShieXRlcykudG9TdHJpbmcoXCJiYXNlNjRcIilcbiAgICAgIDogYnRvYShieXRlcy5yZWR1Y2UoKHMsIGIpID0+IHMgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpLCBcIlwiKSk7XG4gIHJldHVybiBiNjQ7XG59XG5cbi8qKlxuICogQnJvd3Nlci1mcmllbmRseSBoZWxwZXIgZm9yIGVuY29kaW5nIGEgYnl0ZSBhcnJheSBpbnRvIGEgJ2Jhc2U2NHVybGAtZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxudW1iZXI+fSBidWZmZXIgVGhlIGJ5dGUgYXJyYXkgdG8gZW5jb2RlXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSAnYmFzZTY0dXJsJyBlbmNvZGluZyBvZiB0aGUgYnl0ZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVRvQmFzZTY0VXJsKGJ1ZmZlcjogSXRlcmFibGU8bnVtYmVyPik6IHN0cmluZyB7XG4gIGNvbnN0IGI2NCA9IGVuY29kZVRvQmFzZTY0KGJ1ZmZlcik7XG4gIC8vIE5PVEU6IHRoZXJlIGlzIG5vIFwiYmFzZTY0dXJsXCIgZW5jb2RpbmcgaW4gdGhlIFwiYnVmZmVyXCIgbW9kdWxlIGZvciB0aGUgYnJvd3NlciAodW5saWtlIGluIG5vZGUuanMpXG4gIHJldHVybiBiNjQucmVwbGFjZSgvXFwrL2csIFwiLVwiKS5yZXBsYWNlKC9cXC8vZywgXCJfXCIpLnJlcGxhY2UoLz0qJC9nLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBTbGVlcHMgZm9yIGBtc2AgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtcyBNaWxsaXNlY29uZHMgdG8gc2xlZXBcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIGFmdGVyIGBtc2AgbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyBvciBhIHVpbnQ4IGFycmF5IGludG8gYSBoZXggc3RyaW5nLiBTdHJpbmdzIGFyZSBlbmNvZGVkIGluIFVURi04IGJlZm9yZVxuICogYmVpbmcgY29udmVydGVkIHRvIGhleC5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgVWludDhBcnJheX0gbWVzc2FnZSBUaGUgaW5wdXRcbiAqIEByZXR1cm4ge3N0cmluZ30gSGV4IHN0cmluZyBwcmVmaXhlZCB3aXRoIFwiMHhcIlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVG9IZXgobWVzc2FnZTogc3RyaW5nIHwgVWludDhBcnJheSk6IHN0cmluZyB7XG4gIHJldHVybiAoXG4gICAgXCIweFwiICsgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gQnVmZmVyLmZyb20obWVzc2FnZSwgXCJ1dGY4XCIpIDogbWVzc2FnZSkudG9TdHJpbmcoXCJoZXhcIilcbiAgKTtcbn1cbiJdfQ==
@@ -1,173 +0,0 @@
1
- import { X509Certificate, createVerify } from "crypto";
2
- import { Environment, envs } from ".";
3
-
4
- // URLs that are safe to retrieve certificates from
5
- const SNS_CERTIFICATE_URL_HOSTS = ["sns.us-east-1.amazonaws.com"];
6
-
7
- const SNS_CERTIFICATE_HOST = "sns.amazonaws.com";
8
-
9
- /** The common fields of SNS messages */
10
- export interface SnsMessage {
11
- Type: string;
12
- MessageId: string;
13
- TopicArn: string;
14
- Message: string;
15
- Timestamp: string;
16
- SignatureVersion: string;
17
- Signature: string;
18
- SigningCertURL: string;
19
- }
20
-
21
- /** The format of a subscription confirmation sent by SNS */
22
- export interface SubscriptionConfirmationMessage extends SnsMessage {
23
- Token: string;
24
- SubscribeURL: string;
25
- }
26
-
27
- /** Common fields for an org event */
28
- export interface OrgEventBase {
29
- org: string;
30
- utc_timestamp: number;
31
- org_event: string;
32
- }
33
-
34
- /** The format of an event message sent by SNS */
35
- export interface OrgEventMessage extends SnsMessage {
36
- Subject?: string;
37
- UnsubscribeURL: string;
38
- }
39
-
40
- /** Options for the processor */
41
- export interface OrgEventProcessorOptions {
42
- env: Environment;
43
- }
44
-
45
- /** A utility for processing org event messages */
46
- export class OrgEventProcessor {
47
- readonly #topicArn: string;
48
- readonly #orgId: string;
49
- #cachedCertificates: Map<URL, X509Certificate>;
50
-
51
- /**
52
- * Constructor.
53
- * @param {string} orgId The org id
54
- * @param {OrgEventProcessorOptions} options Additional options for the processor
55
- */
56
- constructor(orgId: string, options?: OrgEventProcessorOptions) {
57
- this.#topicArn = envs[options?.env ?? "prod"].OrgEventsTopicArn;
58
- this.#orgId = orgId;
59
- this.#cachedCertificates = new Map();
60
- }
61
-
62
- /**
63
- * Checks an SNS message and its signature. Throws an error if the message
64
- * invalid or the signature is invalid.
65
- *
66
- * @param {SnsMessage} message The SNS message to check
67
- */
68
- async checkMessage(message: SnsMessage) {
69
- // Check the topic ARN
70
- if (message.TopicArn !== this.#topicArn) {
71
- throw new Error(`Expected topic ARN '${this.#topicArn}', found '${message.TopicArn}'`);
72
- }
73
-
74
- // Both subscription confirmations and org event messages should have no subject
75
- if ("Subject" in message) {
76
- throw new Error("Expected a message without a subject");
77
- }
78
-
79
- // The org events topic uses signature version 2 (SHA256)
80
- if (message.SignatureVersion !== "2") {
81
- throw new Error("Expected signature version 2");
82
- }
83
-
84
- // Retrieve the certificate and sanity check it
85
- const certificate = await this.#fetchAndValidateCertificate(new URL(message.SigningCertURL));
86
-
87
- // Extract fields specific to subscription confirmations
88
- const subscribeUrl = (message as SubscriptionConfirmationMessage).SubscribeURL;
89
- const token = (message as SubscriptionConfirmationMessage).Token;
90
-
91
- // Check the signature
92
- const fields = ["Message", message.Message, "MessageId", message.MessageId]
93
- .concat(subscribeUrl !== undefined ? ["SubscribeURL", subscribeUrl] : [])
94
- .concat(["Timestamp", message.Timestamp])
95
- .concat(token !== undefined ? ["Token", token] : [])
96
- .concat(["TopicArn", message.TopicArn, "Type", message.Type]);
97
- const verify = createVerify("RSA-SHA256");
98
- verify.update(fields.join("\n") + "\n");
99
- const isValid = verify.verify(certificate.publicKey, message.Signature, "base64");
100
- if (!isValid) {
101
- throw new Error("The org event has an invalid signature");
102
- }
103
- }
104
-
105
- /**
106
- * Parse an org event and check its signature. Throws an error if the
107
- * message is not a valid org event or the signature is invalid.
108
- *
109
- * @param {OrgEventMessage} message The org event message to check
110
- * @return {OrgEventBase} The org event
111
- */
112
- async parse(message: OrgEventMessage): Promise<OrgEventBase> {
113
- await this.checkMessage(message);
114
-
115
- // Check that the event is for the expected org
116
- const orgEvent: OrgEventBase = JSON.parse(message.Message);
117
- if (orgEvent.org !== this.#orgId) {
118
- throw new Error(`Expected org to be '${this.#orgId}', found '${orgEvent.org}'`);
119
- }
120
-
121
- return orgEvent;
122
- }
123
-
124
- /**
125
- * Fetches a certificate from a given URL or from the certificate cache.
126
- * Throws an error if the URL does not correspond to an SNS certificate URL.
127
- *
128
- * Note: Ideally, this method would verify the certificate chain, but there
129
- * is no obvious chain. Instead, this method only fetches certificates from
130
- * a small set of allowlisted URLs.
131
- *
132
- * @param {URL} url The URL of the certificate
133
- * @return {X509Certificate} The certificate
134
- */
135
- async #fetchAndValidateCertificate(url: URL): Promise<X509Certificate> {
136
- const currTime = new Date().getTime();
137
- const cachedCertificate = this.#cachedCertificates.get(url);
138
- if (cachedCertificate && currTime < new Date(cachedCertificate.validTo).getTime()) {
139
- return cachedCertificate;
140
- }
141
-
142
- // Only fetch certificates from HTTPS URLs
143
- if (url.protocol !== "https:") {
144
- throw new Error("Expected signing certificate URL to use HTTPS");
145
- }
146
-
147
- // Only fetch certificate URLs for SNS
148
- if (SNS_CERTIFICATE_URL_HOSTS.indexOf(url.host) === -1) {
149
- throw new Error("Expected signing certificate URL for SNS in us-east-1");
150
- }
151
-
152
- const response = await fetch(url);
153
- if (!response.ok) {
154
- throw new Error(`Unable to download certificate. Status: ${response.status}`);
155
- }
156
- const blob = await response.blob();
157
- const certificate = new X509Certificate(await blob.text());
158
- if (!certificate.checkHost(SNS_CERTIFICATE_HOST)) {
159
- throw new Error(`Expected certificate to be for '${SNS_CERTIFICATE_HOST}'`);
160
- }
161
-
162
- // Check validity times
163
- if (currTime < new Date(certificate.validFrom).getTime()) {
164
- throw new Error("Certificate not valid yet");
165
- }
166
- if (new Date(certificate.validTo).getTime() < currTime) {
167
- throw new Error("Certificate expired");
168
- }
169
-
170
- this.#cachedCertificates.set(url, certificate);
171
- return certificate;
172
- }
173
- }