@cubist-labs/cubesigner-sdk 0.1.23
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/LICENSE-APACHE +177 -0
- package/LICENSE-MIT +25 -0
- package/NOTICE +13 -0
- package/README.md +470 -0
- package/dist/examples/ethers.d.ts +1 -0
- package/dist/examples/ethers.js +142 -0
- package/dist/spec/env/beta.json +9 -0
- package/dist/spec/env/gamma.json +9 -0
- package/dist/spec/env/prod.json +9 -0
- package/dist/src/client.d.ts +10 -0
- package/dist/src/client.js +21 -0
- package/dist/src/env.d.ts +15 -0
- package/dist/src/env.js +35 -0
- package/dist/src/ethers/index.d.ts +50 -0
- package/dist/src/ethers/index.js +122 -0
- package/dist/src/index.d.ts +114 -0
- package/dist/src/index.js +205 -0
- package/dist/src/key.d.ts +114 -0
- package/dist/src/key.js +201 -0
- package/dist/src/mfa.d.ts +23 -0
- package/dist/src/mfa.js +63 -0
- package/dist/src/org.d.ts +161 -0
- package/dist/src/org.js +264 -0
- package/dist/src/role.d.ts +224 -0
- package/dist/src/role.js +256 -0
- package/dist/src/schema.d.ts +3049 -0
- package/dist/src/schema.js +7 -0
- package/dist/src/session/generic.d.ts +47 -0
- package/dist/src/session/generic.js +3 -0
- package/dist/src/session/management_session_manager.d.ts +59 -0
- package/dist/src/session/management_session_manager.js +111 -0
- package/dist/src/session/oidc_session_manager.d.ts +78 -0
- package/dist/src/session/oidc_session_manager.js +142 -0
- package/dist/src/session/session_manager.d.ts +74 -0
- package/dist/src/session/session_manager.js +79 -0
- package/dist/src/session/session_storage.d.ts +47 -0
- package/dist/src/session/session_storage.js +76 -0
- package/dist/src/session/signer_session_manager.d.ts +88 -0
- package/dist/src/session/signer_session_manager.js +159 -0
- package/dist/src/sign.d.ts +114 -0
- package/dist/src/sign.js +248 -0
- package/dist/src/signer_session.d.ts +180 -0
- package/dist/src/signer_session.js +369 -0
- package/dist/src/util.d.ts +35 -0
- package/dist/src/util.js +75 -0
- package/dist/test/sessions.d.ts +35 -0
- package/dist/test/sessions.js +56 -0
- package/package.json +61 -0
- package/src/client.ts +12 -0
- package/src/env.ts +25 -0
- package/src/ethers/index.ts +131 -0
- package/src/index.ts +220 -0
- package/src/key.ts +249 -0
- package/src/org.ts +333 -0
- package/src/role.ts +385 -0
- package/src/schema.ts +3054 -0
- package/src/session/management_session_manager.ts +136 -0
- package/src/session/oidc_session_manager.ts +193 -0
- package/src/session/session_manager.ts +114 -0
- package/src/session/session_storage.ts +73 -0
- package/src/session/signer_session_manager.ts +211 -0
- package/src/signer_session.ts +464 -0
- package/src/util.ts +58 -0
- package/tsconfig.json +32 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
|
+
};
|
|
28
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
29
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
30
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
31
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
32
|
+
};
|
|
33
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
34
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
35
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
36
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
37
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
38
|
+
};
|
|
39
|
+
var _CubeSigner_env;
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.ethers = exports.CubeSigner = void 0;
|
|
42
|
+
const env_1 = require("./env");
|
|
43
|
+
const org_1 = require("./org");
|
|
44
|
+
const session_storage_1 = require("./session/session_storage");
|
|
45
|
+
const signer_session_1 = require("./signer_session");
|
|
46
|
+
const management_session_manager_1 = require("./session/management_session_manager");
|
|
47
|
+
const oidc_session_manager_1 = require("./session/oidc_session_manager");
|
|
48
|
+
const util_1 = require("./util");
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
/** CubeSigner client */
|
|
51
|
+
class CubeSigner {
|
|
52
|
+
/** @return {EnvInterface} The CubeSigner environment of this client */
|
|
53
|
+
get env() {
|
|
54
|
+
return __classPrivateFieldGet(this, _CubeSigner_env, "f");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Loads an existing management session and creates a CubeSigner instance.
|
|
58
|
+
* @param {ManagementSessionStorage} storage Optional session storage to load
|
|
59
|
+
* the session from. If not specified, the management session from the config
|
|
60
|
+
* directory will be loaded.
|
|
61
|
+
* @return {Promise<CubeSigner>} New CubeSigner instance
|
|
62
|
+
*/
|
|
63
|
+
static async loadManagementSession(storage) {
|
|
64
|
+
const defaultFilePath = path.join((0, util_1.configDir)(), "management-session.json");
|
|
65
|
+
const sessionMgr = await management_session_manager_1.ManagementSessionManager.loadFromStorage(storage ?? new session_storage_1.JsonFileSessionStorage(defaultFilePath));
|
|
66
|
+
return new CubeSigner({
|
|
67
|
+
sessionMgr,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Loads a signer session from a session storage (e.g., session file).
|
|
72
|
+
* @param {SignerSessionStorage} storage Optional session storage to load
|
|
73
|
+
* the session from. If not specified, the signer session from the config
|
|
74
|
+
* directory will be loaded.
|
|
75
|
+
* @return {Promise<SignerSession>} New signer session
|
|
76
|
+
*/
|
|
77
|
+
static async loadSignerSession(storage) {
|
|
78
|
+
const defaultFilePath = path.join((0, util_1.configDir)(), "signer-session.json");
|
|
79
|
+
const sss = storage ?? new session_storage_1.JsonFileSessionStorage(defaultFilePath);
|
|
80
|
+
const env = (await sss.retrieve()).env["Dev-CubeSignerStack"];
|
|
81
|
+
return await signer_session_1.SignerSession.loadSignerSession(new CubeSigner({ env }), sss);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Loads a signer session from OIDC storage
|
|
85
|
+
* @param {OidcSessionStorage} storage The storage to load from
|
|
86
|
+
* @return {Promise<SignerSession>} New signer session
|
|
87
|
+
*/
|
|
88
|
+
static async loadOidcSession(storage) {
|
|
89
|
+
const env = (await storage.retrieve()).env;
|
|
90
|
+
return await signer_session_1.SignerSession.loadOidcSession(new CubeSigner({ env }), storage);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a new CubeSigner instance.
|
|
94
|
+
* @param {CubeSignerOptions} options The options for the CubeSigner instance.
|
|
95
|
+
*/
|
|
96
|
+
constructor(options) {
|
|
97
|
+
_CubeSigner_env.set(this, void 0);
|
|
98
|
+
let env = options.env;
|
|
99
|
+
if (options.sessionMgr) {
|
|
100
|
+
this.sessionMgr = options.sessionMgr;
|
|
101
|
+
env = env ?? this.sessionMgr.env;
|
|
102
|
+
}
|
|
103
|
+
__classPrivateFieldSet(this, _CubeSigner_env, env ?? env_1.envs["gamma"], "f");
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Authenticate an OIDC user and create a new OIDC session manager for them.
|
|
107
|
+
* @param {string} oidcToken The OIDC token
|
|
108
|
+
* @param {string} orgId The id of the organization that the user is in
|
|
109
|
+
* @param {List<string>} scopes The scopes of the resulting session
|
|
110
|
+
* @param {OidcSessionStorage} storage The signer session storage
|
|
111
|
+
* @return {Promise<OidcSessionManager>} The OIDC session manager
|
|
112
|
+
*/
|
|
113
|
+
async createOidcManager(oidcToken, orgId, scopes, storage) {
|
|
114
|
+
return await oidc_session_manager_1.OidcSessionManager.create(this.env, storage || new session_storage_1.MemorySessionStorage(), oidcToken, orgId, scopes);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Authenticate an OIDC user and create a new session for them.
|
|
118
|
+
* @param {string} oidcToken The OIDC token
|
|
119
|
+
* @param {string} orgId The id of the organization that the user is in
|
|
120
|
+
* @param {List<string>} scopes The scopes of the resulting session
|
|
121
|
+
* @param {OidcSessionStorage} storage The signer session storage
|
|
122
|
+
* @return {Promise<SignerSession>} The signer session
|
|
123
|
+
*/
|
|
124
|
+
async createOidcSession(oidcToken, orgId, scopes, storage) {
|
|
125
|
+
const mgr = await this.createOidcManager(oidcToken, orgId, scopes, storage);
|
|
126
|
+
return await CubeSigner.loadOidcSession(mgr.storage);
|
|
127
|
+
}
|
|
128
|
+
/** Retrieves information about the current user. */
|
|
129
|
+
async aboutMe() {
|
|
130
|
+
const resp = await (await this.management()).get("/v0/about_me", {
|
|
131
|
+
parseAs: "json",
|
|
132
|
+
});
|
|
133
|
+
const data = (0, util_1.assertOk)(resp);
|
|
134
|
+
return data;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Creates and sets a new TOTP configuration for the logged-in user,
|
|
138
|
+
* overriding the existing one (if any).
|
|
139
|
+
*/
|
|
140
|
+
async resetTotp() {
|
|
141
|
+
const resp = await (await this.management()).patch("/v0/totp", {
|
|
142
|
+
parseAs: "json",
|
|
143
|
+
});
|
|
144
|
+
return (0, util_1.assertOk)(resp);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Verifies a given TOTP code against the current user's TOTP configuration.
|
|
148
|
+
* Throws an error if the verification fails.
|
|
149
|
+
* @param {string} code Current TOTP code
|
|
150
|
+
*/
|
|
151
|
+
async verifyTotp(code) {
|
|
152
|
+
const resp = await (await this.management()).get("/v0/totp/verify/{code}", {
|
|
153
|
+
params: { path: { code } },
|
|
154
|
+
parseAs: "json",
|
|
155
|
+
});
|
|
156
|
+
(0, util_1.assertOk)(resp);
|
|
157
|
+
}
|
|
158
|
+
/** Retrieves information about an organization.
|
|
159
|
+
* @param {string} orgId The ID or name of the organization.
|
|
160
|
+
* @return {Org} The organization.
|
|
161
|
+
* */
|
|
162
|
+
async getOrg(orgId) {
|
|
163
|
+
const resp = await (await this.management()).get("/v0/org/{org_id}", {
|
|
164
|
+
params: { path: { org_id: orgId } },
|
|
165
|
+
parseAs: "json",
|
|
166
|
+
});
|
|
167
|
+
const data = (0, util_1.assertOk)(resp);
|
|
168
|
+
return new org_1.Org(this, data);
|
|
169
|
+
}
|
|
170
|
+
/** Get the management client.
|
|
171
|
+
* @return {Client} The client.
|
|
172
|
+
* @internal
|
|
173
|
+
* */
|
|
174
|
+
async management() {
|
|
175
|
+
if (!this.sessionMgr) {
|
|
176
|
+
throw new Error("No management session loaded");
|
|
177
|
+
}
|
|
178
|
+
return await this.sessionMgr.client();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.CubeSigner = CubeSigner;
|
|
182
|
+
_CubeSigner_env = new WeakMap();
|
|
183
|
+
/** Organizations */
|
|
184
|
+
__exportStar(require("./org"), exports);
|
|
185
|
+
/** Keys */
|
|
186
|
+
__exportStar(require("./key"), exports);
|
|
187
|
+
/** Roles */
|
|
188
|
+
__exportStar(require("./role"), exports);
|
|
189
|
+
/** Env */
|
|
190
|
+
__exportStar(require("./env"), exports);
|
|
191
|
+
/** Sessions */
|
|
192
|
+
__exportStar(require("./signer_session"), exports);
|
|
193
|
+
/** Session storage */
|
|
194
|
+
__exportStar(require("./session/session_storage"), exports);
|
|
195
|
+
/** Session manager */
|
|
196
|
+
__exportStar(require("./session/session_manager"), exports);
|
|
197
|
+
/** Management session manager */
|
|
198
|
+
__exportStar(require("./session/management_session_manager"), exports);
|
|
199
|
+
/** OIDC session manager */
|
|
200
|
+
__exportStar(require("./session/oidc_session_manager"), exports);
|
|
201
|
+
/** Signer session manager */
|
|
202
|
+
__exportStar(require("./session/signer_session_manager"), exports);
|
|
203
|
+
/** Export ethers.js Signer */
|
|
204
|
+
exports.ethers = __importStar(require("./ethers"));
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBMkM7QUFFM0MsK0JBQTRCO0FBQzVCLCtEQUF5RjtBQUV6RixxREFBaUQ7QUFDakQscUZBRzhDO0FBQzlDLHlFQUF3RjtBQUN4RixpQ0FBNkM7QUFDN0MsMkNBQTZCO0FBYzdCLHdCQUF3QjtBQUN4QixNQUFhLFVBQVU7SUFJckIsdUVBQXVFO0lBQ3ZFLElBQUksR0FBRztRQUNMLE9BQU8sdUJBQUEsSUFBSSx1QkFBSyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQWtDO1FBQ25FLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBQSxnQkFBUyxHQUFFLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUMxRSxNQUFNLFVBQVUsR0FBRyxNQUFNLHFEQUF3QixDQUFDLGVBQWUsQ0FDL0QsT0FBTyxJQUFJLElBQUksd0NBQXNCLENBQUMsZUFBZSxDQUFDLENBQ3ZELENBQUM7UUFDRixPQUFPLElBQUksVUFBVSxDQUFvQjtZQUN2QyxVQUFVO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBOEI7UUFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFBLGdCQUFTLEdBQUUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLE9BQU8sSUFBSSxJQUFJLHdDQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMs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ZSB9IGZyb20gXCIuL2VudlwiO1xuaW1wb3J0IHsgY29tcG9uZW50cywgQ2xpZW50IH0gZnJvbSBcIi4vY2xpZW50XCI7XG5pbXBvcnQgeyBPcmcgfSBmcm9tIFwiLi9vcmdcIjtcbmltcG9ydCB7IEpzb25GaWxlU2Vzc2lvblN0b3JhZ2UsIE1lbW9yeVNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4vc2Vzc2lvbi9zZXNzaW9uX3N0b3JhZ2VcIjtcbmltcG9ydCB7IFNpZ25lclNlc3Npb25TdG9yYWdlIH0gZnJvbSBcIi4vc2Vzc2lvbi9zaWduZXJfc2Vzc2lvbl9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBTaWduZXJTZXNzaW9uIH0gZnJvbSBcIi4vc2lnbmVyX3Nlc3Npb25cIjtcbmltcG9ydCB7XG4gIE1hbmFnZW1lbnRTZXNzaW9uTWFuYWdlcixcbiAgTWFuYWdlbWVudFNlc3Npb25TdG9yYWdlLFxufSBmcm9tIFwiLi9zZXNzaW9uL21hbmFnZW1lbnRfc2Vzc2lvbl9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBPaWRjU2Vzc2lvbk1hbmFnZXIsIE9pZGNTZXNzaW9uU3RvcmFnZSB9IGZyb20gXCIuL3Nlc3Npb24vb2lkY19zZXNzaW9uX21hbmFnZXJcIjtcbmltcG9ydCB7IGFzc2VydE9rLCBjb25maWdEaXIgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbi8qKiBDdWJlU2lnbmVyIGNvbnN0cnVjdG9yIG9wdGlvbnMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3ViZVNpZ25lck9wdGlvbnMge1xuICAvKiogVGhlIGVudmlyb25tZW50IHRvIHVzZSAqL1xuICBlbnY/OiBFbnZJbnRlcmZhY2U7XG4gIC8qKiBUaGUgbWFuYWdlbWVudCBhdXRob3JpemF0aW9uIHRva2VuICovXG4gIHNlc3Npb25NZ3I/OiBNYW5hZ2VtZW50U2Vzc2lvbk1hbmFnZXIgfCBPaWRjU2Vzc2lvbk1hbmFnZXI7XG59XG5cbmV4cG9ydCB0eXBlIFVzZXJJbmZvID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJVc2VySW5mb1wiXTtcbmV4cG9ydCB0eXBlIFRvdHBJbmZvID0gY29tcG9uZW50c1tcInJlc3BvbnNlc1wiXVtcIlRvdHBJbmZvXCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG5leHBvcnQgdHlwZSBDb25maWd1cmVkTWZhID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJDb25maWd1cmVkTWZhXCJdO1xuXG4vKiogQ3ViZVNpZ25lciBjbGllbnQgKi9cbmV4cG9ydCBjbGFzcyBDdWJlU2lnbmVyIHtcbiAgcmVhZG9ubHkgI2VudjogRW52SW50ZXJmYWNlO1xuICByZWFkb25seSBzZXNzaW9uTWdyPzogTWFuYWdlbWVudFNlc3Npb25NYW5hZ2VyIHwgT2lkY1Nlc3Npb25NYW5hZ2VyO1xuXG4gIC8qKiBAcmV0dXJuIHtFbnZJbnRlcmZhY2V9IFRoZSBDdWJlU2lnbmVyIGVudmlyb25tZW50IG9mIHRoaXMgY2xpZW50ICovXG4gIGdldCBlbnYoKTogRW52SW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcy4jZW52O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuIGV4aXN0aW5nIG1hbmFnZW1lbnQgc2Vzc2lvbiBhbmQgY3JlYXRlcyBhIEN1YmVTaWduZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TWFuYWdlbWVudFNlc3Npb25TdG9yYWdlfSBzdG9yYWdlIE9wdGlvbmFsIHNlc3Npb24gc3RvcmFnZSB0byBsb2FkXG4gICAqIHRoZSBzZXNzaW9uIGZyb20uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBtYW5hZ2VtZW50IHNlc3Npb24gZnJvbSB0aGUgY29uZmlnXG4gICAqIGRpcmVjdG9yeSB3aWxsIGJlIGxvYWRlZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDdWJlU2lnbmVyPn0gTmV3IEN1YmVTaWduZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkTWFuYWdlbWVudFNlc3Npb24oc3RvcmFnZT86IE1hbmFnZW1lbnRTZXNzaW9uU3RvcmFnZSk6IFByb21pc2U8Q3ViZVNpZ25lcj4ge1xuICAgIGNvbnN0IGRlZmF1bHRGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIoKSwgXCJtYW5hZ2VtZW50LXNlc3Npb24uanNvblwiKTtcbiAgICBjb25zdCBzZXNzaW9uTWdyID0gYXdhaXQgTWFuYWdlbWVudFNlc3Npb25NYW5hZ2VyLmxvYWRGcm9tU3RvcmFnZShcbiAgICAgIHN0b3JhZ2UgPz8gbmV3IEpzb25GaWxlU2Vzc2lvblN0b3JhZ2UoZGVmYXVsdEZpbGVQYXRoKSxcbiAgICApO1xuICAgIHJldHVybiBuZXcgQ3ViZVNpZ25lcig8Q3ViZVNpZ25lck9wdGlvbnM+e1xuICAgICAgc2Vzc2lvbk1ncixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIHNpZ25lciBzZXNzaW9uIGZyb20gYSBzZXNzaW9uIHN0b3JhZ2UgKGUuZy4sIHNlc3Npb24gZmlsZSkuXG4gICAqIEBwYXJhbSB7U2lnbmVyU2Vzc2lvblN0b3JhZ2V9IHN0b3JhZ2UgT3B0aW9uYWwgc2Vzc2lvbiBzdG9yYWdlIHRvIGxvYWRcbiAgICogdGhlIHNlc3Npb24gZnJvbS4gSWYgbm90IHNwZWNpZmllZCwgdGhlIHNpZ25lciBzZXNzaW9uIGZyb20gdGhlIGNvbmZpZ1xuICAgKiBkaXJlY3Rvcnkgd2lsbCBiZSBsb2FkZWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2lnbmVyU2Vzc2lvbj59IE5ldyBzaWduZXIgc2Vzc2lvblxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxvYWRTaWduZXJTZXNzaW9uKHN0b3JhZ2U/OiBTaWduZXJTZXNzaW9uU3RvcmFnZSk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbj4ge1xuICAgIGNvbnN0IGRlZmF1bHRGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIoKSwgXCJzaWduZXItc2Vzc2lvbi5qc29uXCIpO1xuICAgIGNvbnN0IHNzcyA9IHN0b3JhZ2UgPz8gbmV3IEpzb25GaWxlU2Vzc2lvblN0b3JhZ2UoZGVmYXVsdEZpbGVQYXRoKTtcbiAgICBjb25zdCBlbnYgPSAoYXdhaXQgc3NzLnJldHJpZXZlKCkpLmVudltcIkRldi1DdWJlU2lnbmVyU3RhY2tcIl07XG4gICAgcmV0dXJuIGF3YWl0IFNpZ25lclNlc3Npb24ubG9hZFNpZ25lclNlc3Npb24obmV3IEN1YmVTaWduZXIoeyBlbnYgfSksIHNzcyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBzaWduZXIgc2Vzc2lvbiBmcm9tIE9JREMgc3RvcmFnZVxuICAgKiBAcGFyYW0ge09pZGNTZXNzaW9uU3RvcmFnZX0gc3RvcmFnZSBUaGUgc3RvcmFnZSB0byBsb2FkIGZyb21cbiAgICogQHJldHVybiB7UHJvbWlzZTxTaWduZXJTZXNzaW9uPn0gTmV3IHNpZ25lciBzZXNzaW9uXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZE9pZGNTZXNzaW9uKHN0b3JhZ2U6IE9pZGNTZXNzaW9uU3RvcmFnZSk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbj4ge1xuICAgIGNvbnN0IGVudiA9IChhd2FpdCBzdG9yYWdlLnJldHJpZXZlKCkpLmVudjtcbiAgICByZXR1cm4gYXdhaXQgU2lnbmVyU2Vzc2lvbi5sb2FkT2lkY1Nlc3Npb24obmV3IEN1YmVTaWduZXIoeyBlbnYgfSksIHN0b3JhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBDdWJlU2lnbmVyIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge0N1YmVTaWduZXJPcHRpb25zfSBvcHRpb25zIFRoZSBvcHRpb25zIGZvciB0aGUgQ3ViZVNpZ25lciBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEN1YmVTaWduZXJPcHRpb25zKSB7XG4gICAgbGV0IGVudiA9IG9wdGlvbnMuZW52O1xuICAgIGlmIChvcHRpb25zLnNlc3Npb25NZ3IpIHtcbiAgICAgIHRoaXMuc2Vzc2lvbk1nciA9IG9wdGlvbnMuc2Vzc2lvbk1ncjtcbiAgICAgIGVudiA9IGVudiA/PyB0aGlzLnNlc3Npb25NZ3IuZW52O1xuICAgIH1cbiAgICB0aGlzLiNlbnYgPSBlbnYgPz8gZW52c1tcImdhbW1hXCJdO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZSBhbiBPSURDIHVzZXIgYW5kIGNyZWF0ZSBhIG5ldyBPSURDIHNlc3Npb24gbWFuYWdlciBmb3IgdGhlbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9pZGNUb2tlbiBUaGUgT0lEQyB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgVGhlIGlkIG9mIHRoZSBvcmdhbml6YXRpb24gdGhhdCB0aGUgdXNlciBpcyBpblxuICAgKiBAcGFyYW0ge0xpc3Q8c3RyaW5nPn0gc2NvcGVzIFRoZSBzY29wZXMgb2YgdGhlIHJlc3VsdGluZyBzZXNzaW9uXG4gICAqIEBwYXJhbSB7T2lkY1Nlc3Npb25TdG9yYWdlfSBzdG9yYWdlIFRoZSBzaWduZXIgc2Vzc2lvbiBzdG9yYWdlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8T2lkY1Nlc3Npb25NYW5hZ2VyPn0gVGhlIE9JREMgc2Vzc2lvbiBtYW5hZ2VyXG4gICAqL1xuICBhc3luYyBjcmVhdGVPaWRjTWFuYWdlcihcbiAgICBvaWRjVG9rZW46IHN0cmluZyxcbiAgICBvcmdJZDogc3RyaW5nLFxuICAgIHNjb3BlczogQXJyYXk8c3RyaW5nPixcbiAgICBzdG9yYWdlPzogT2lkY1Nlc3Npb25TdG9yYWdlLFxuICApOiBQcm9taXNlPE9pZGNTZXNzaW9uTWFuYWdlcj4ge1xuICAgIHJldHVybiBhd2FpdCBPaWRjU2Vzc2lvbk1hbmFnZXIuY3JlYXRlKFxuICAgICAgdGhpcy5lbnYsXG4gICAgICBzdG9yYWdlIHx8IG5ldyBNZW1vcnlTZXNzaW9uU3RvcmFnZSgpLFxuICAgICAgb2lkY1Rva2VuLFxuICAgICAgb3JnSWQsXG4gICAgICBzY29wZXMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGUgYW4gT0lEQyB1c2VyIGFuZCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBmb3IgdGhlbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9pZGNUb2tlbiBUaGUgT0lEQyB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgVGhlIGlkIG9mIHRoZSBvcmdhbml6YXRpb24gdGhhdCB0aGUgdXNlciBpcyBpblxuICAgKiBAcGFyYW0ge0xpc3Q8c3RyaW5nPn0gc2NvcGVzIFRoZSBzY29wZXMgb2YgdGhlIHJlc3VsdGluZyBzZXNzaW9uXG4gICAqIEBwYXJhbSB7T2lkY1Nlc3Npb25TdG9yYWdlfSBzdG9yYWdlIFRoZSBzaWduZXIgc2Vzc2lvbiBzdG9yYWdlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8U2lnbmVyU2Vzc2lvbj59IFRoZSBzaWduZXIgc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgY3JlYXRlT2lkY1Nlc3Npb24oXG4gICAgb2lkY1Rva2VuOiBzdHJpbmcsXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBzY29wZXM6IEFycmF5PHN0cmluZz4sXG4gICAgc3RvcmFnZT86IE9pZGNTZXNzaW9uU3RvcmFnZSxcbiAgKTogUHJvbWlzZTxTaWduZXJTZXNzaW9uPiB7XG4gICAgY29uc3QgbWdyID0gYXdhaXQgdGhpcy5jcmVhdGVPaWRjTWFuYWdlcihvaWRjVG9rZW4sIG9yZ0lkLCBzY29wZXMsIHN0b3JhZ2UpO1xuICAgIHJldHVybiBhd2FpdCBDdWJlU2lnbmVyLmxvYWRPaWRjU2Vzc2lvbihtZ3Iuc3RvcmFnZSk7XG4gIH1cblxuICAvKiogUmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHVzZXIuICovXG4gIGFzeW5jIGFib3V0TWUoKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL2Fib3V0X21lXCIsIHtcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBzZXRzIGEgbmV3IFRPVFAgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvZ2dlZC1pbiB1c2VyLFxuICAgKiBvdmVycmlkaW5nIHRoZSBleGlzdGluZyBvbmUgKGlmIGFueSkuXG4gICAqL1xuICBhc3luYyByZXNldFRvdHAoKTogUHJvbWlzZTxUb3RwSW5mbz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLm1hbmFnZW1lbnQoKVxuICAgICkucGF0Y2goXCIvdjAvdG90cFwiLCB7XG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICByZXR1cm4gYXNzZXJ0T2socmVzcCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBnaXZlbiBUT1RQIGNvZGUgYWdhaW5zdCB0aGUgY3VycmVudCB1c2VyJ3MgVE9UUCBjb25maWd1cmF0aW9uLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHZlcmlmaWNhdGlvbiBmYWlscy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGUgQ3VycmVudCBUT1RQIGNvZGVcbiAgICovXG4gIGFzeW5jIHZlcmlmeVRvdHAoY29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMubWFuYWdlbWVudCgpXG4gICAgKS5nZXQoXCIvdjAvdG90cC92ZXJpZnkve2NvZGV9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IGNvZGUgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgYXNzZXJ0T2socmVzcCk7XG4gIH1cblxuICAvKiogUmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGFuIG9yZ2FuaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9yZ0lkIFRoZSBJRCBvciBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24uXG4gICAqIEByZXR1cm4ge09yZ30gVGhlIG9yZ2FuaXphdGlvbi5cbiAgICogKi9cbiAgYXN5bmMgZ2V0T3JnKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPE9yZz4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IG9yZ0lkIH0gfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YSA9IGFzc2VydE9rKHJlc3ApO1xuICAgIHJldHVybiBuZXcgT3JnKHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgbWFuYWdlbWVudCBjbGllbnQuXG4gICAqIEByZXR1cm4ge0NsaWVudH0gVGhlIGNsaWVudC5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIGFzeW5jIG1hbmFnZW1lbnQoKTogUHJvbWlzZTxDbGllbnQ+IHtcbiAgICBpZiAoIXRoaXMuc2Vzc2lvbk1ncikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbWFuYWdlbWVudCBzZXNzaW9uIGxvYWRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2Vzc2lvbk1nci5jbGllbnQoKTtcbiAgfVxufVxuXG4vKiogT3JnYW5pemF0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSBcIi4vb3JnXCI7XG4vKiogS2V5cyAqL1xuZXhwb3J0ICogZnJvbSBcIi4va2V5XCI7XG4vKiogUm9sZXMgKi9cbmV4cG9ydCAqIGZyb20gXCIuL3JvbGVcIjtcbi8qKiBFbnYgKi9cbmV4cG9ydCAqIGZyb20gXCIuL2VudlwiO1xuLyoqIFNlc3Npb25zICovXG5leHBvcnQgKiBmcm9tIFwiLi9zaWduZXJfc2Vzc2lvblwiO1xuLyoqIFNlc3Npb24gc3RvcmFnZSAqL1xuZXhwb3J0ICogZnJvbSBcIi4vc2Vzc2lvbi9zZXNzaW9uX3N0b3JhZ2VcIjtcbi8qKiBTZXNzaW9uIG1hbmFnZXIgKi9cbmV4cG9ydCAqIGZyb20gXCIuL3Nlc3Npb24vc2Vzc2lvbl9tYW5hZ2VyXCI7XG4vKiogTWFuYWdlbWVudCBzZXNzaW9uIG1hbmFnZXIgKi9cbmV4cG9ydCAqIGZyb20gXCIuL3Nlc3Npb24vbWFuYWdlbWVudF9zZXNzaW9uX21hbmFnZXJcIjtcbi8qKiBPSURDIHNlc3Npb24gbWFuYWdlciAqL1xuZXhwb3J0ICogZnJvbSBcIi4vc2Vzc2lvbi9vaWRjX3Nlc3Npb25fbWFuYWdlclwiO1xuLyoqIFNpZ25lciBzZXNzaW9uIG1hbmFnZXIgKi9cbmV4cG9ydCAqIGZyb20gXCIuL3Nlc3Npb24vc2lnbmVyX3Nlc3Npb25fbWFuYWdlclwiO1xuLyoqIEV4cG9ydCBldGhlcnMuanMgU2lnbmVyICovXG5leHBvcnQgKiBhcyBldGhlcnMgZnJvbSBcIi4vZXRoZXJzXCI7XG4iXX0=
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { CubeSigner, KeyPolicy } from ".";
|
|
2
|
+
import { components } from "./client";
|
|
3
|
+
/** Secp256k1 key type */
|
|
4
|
+
export declare enum Secp256k1 {
|
|
5
|
+
Evm = "SecpEthAddr",
|
|
6
|
+
Btc = "SecpBtc",
|
|
7
|
+
BtcTest = "SecpBtcTest"
|
|
8
|
+
}
|
|
9
|
+
/** BLS key type */
|
|
10
|
+
export declare enum BLS {
|
|
11
|
+
Eth2Deposited = "BlsPub",
|
|
12
|
+
Eth2Inactive = "BlsInactive"
|
|
13
|
+
}
|
|
14
|
+
/** Ed25519 key type */
|
|
15
|
+
export declare enum Ed25519 {
|
|
16
|
+
Solana = "Ed25519SolanaAddr",
|
|
17
|
+
Sui = "Ed25519SuiAddr",
|
|
18
|
+
Aptos = "Ed25519AptosAddr"
|
|
19
|
+
}
|
|
20
|
+
/** Key type */
|
|
21
|
+
export type KeyType = Secp256k1 | BLS | Ed25519;
|
|
22
|
+
type KeyInfo = components["schemas"]["KeyInfo"];
|
|
23
|
+
/** Signing keys. */
|
|
24
|
+
export declare class Key {
|
|
25
|
+
#private;
|
|
26
|
+
/** The organization that this key is in */
|
|
27
|
+
readonly orgId: string;
|
|
28
|
+
/**
|
|
29
|
+
* The id of the key: "Key#" followed by a unique identifier specific to
|
|
30
|
+
* the type of key (such as a public key for BLS or an ethereum address for Secp)
|
|
31
|
+
* @example Key#0x8e3484687e66cdd26cf04c3647633ab4f3570148
|
|
32
|
+
* */
|
|
33
|
+
readonly id: string;
|
|
34
|
+
/** The type of key. */
|
|
35
|
+
readonly type: KeyType;
|
|
36
|
+
/**
|
|
37
|
+
* A unique identifier specific to the type of key, such as a public key or an ethereum address
|
|
38
|
+
* @example 0x8e3484687e66cdd26cf04c3647633ab4f3570148
|
|
39
|
+
* */
|
|
40
|
+
readonly materialId: string;
|
|
41
|
+
/**
|
|
42
|
+
* @description Hex-encoded, serialized public key. The format used depends on the key type:
|
|
43
|
+
* - secp256k1 keys use 65-byte uncompressed SECG format
|
|
44
|
+
* - BLS keys use 48-byte compressed BLS12-381 (ZCash) format
|
|
45
|
+
* @example 0x04d2688b6bc2ce7f9879b9e745f3c4dc177908c5cef0c1b64cff19ae7ff27dee623c64fe9d9c325c7fbbc748bbd5f607ce14dd83e28ebbbb7d3e7f2ffb70a79431
|
|
46
|
+
* */
|
|
47
|
+
readonly publicKey: string;
|
|
48
|
+
/** Is the key enabled? */
|
|
49
|
+
enabled(): Promise<boolean>;
|
|
50
|
+
/** Enable the key. */
|
|
51
|
+
enable(): Promise<void>;
|
|
52
|
+
/** Disable the key. */
|
|
53
|
+
disable(): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Set new policy (overwriting any policies previously set for this key)
|
|
56
|
+
* @param {KeyPolicy} policy The new policy to set
|
|
57
|
+
*/
|
|
58
|
+
setPolicy(policy: KeyPolicy): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Append to existing key policy. This append is not atomic -- it uses {@link policy} to fetch the current policy and then {@link setPolicy} to set the policy -- and should not be used in across concurrent sessions.
|
|
61
|
+
* @param {KeyPolicy} policy The policy to append to the existing one.
|
|
62
|
+
*/
|
|
63
|
+
appendPolicy(policy: KeyPolicy): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the policy for the org.
|
|
66
|
+
* @return {Promise<KeyPolicy>} The policy for the org.
|
|
67
|
+
*/
|
|
68
|
+
policy(): Promise<KeyPolicy>;
|
|
69
|
+
/**
|
|
70
|
+
* @description Owner of the key
|
|
71
|
+
* @example User#c3b9379c-4e8c-4216-bd0a-65ace53cf98f
|
|
72
|
+
* */
|
|
73
|
+
owner(): Promise<string>;
|
|
74
|
+
/** Set the owner of the key. Only the key (or org) owner can change the owner of the key.
|
|
75
|
+
* @param {string} owner The user-id of the new owner of the key.
|
|
76
|
+
* */
|
|
77
|
+
setOwner(owner: string): Promise<void>;
|
|
78
|
+
/** Create a new key.
|
|
79
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
80
|
+
* @param {string} orgId The id of the organization to which the key belongs.
|
|
81
|
+
* @param {KeyInfo} data The JSON response from the API server.
|
|
82
|
+
* @internal
|
|
83
|
+
* */
|
|
84
|
+
constructor(cs: CubeSigner, orgId: string, data: KeyInfo);
|
|
85
|
+
/** Update the key.
|
|
86
|
+
* @param {UpdateKeyRequest} request The JSON request to send to the API server.
|
|
87
|
+
* @return {KeyInfo} The JSON response from the API server.
|
|
88
|
+
* */
|
|
89
|
+
private update;
|
|
90
|
+
/** Create new signing keys.
|
|
91
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
92
|
+
* @param {string} orgId The id of the organization to which the key belongs.
|
|
93
|
+
* @param {KeyType} keyType The type of key to create.
|
|
94
|
+
* @param {number} count The number of keys to create.
|
|
95
|
+
* @param {string?} ownerId The owner of the keys. Defaults to the session's user.
|
|
96
|
+
* @return {Key[]} The new keys.
|
|
97
|
+
* @internal
|
|
98
|
+
* */
|
|
99
|
+
static createKeys(cs: CubeSigner, orgId: string, keyType: KeyType, count: number, ownerId?: string): Promise<Key[]>;
|
|
100
|
+
/** Get a key by id.
|
|
101
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
102
|
+
* @param {string} orgId The id of the organization to which the key belongs.
|
|
103
|
+
* @param {string} keyId The id of the key to get.
|
|
104
|
+
* @return {Key} The key.
|
|
105
|
+
* @internal
|
|
106
|
+
* */
|
|
107
|
+
static getKey(cs: CubeSigner, orgId: string, keyId: string): Promise<Key>;
|
|
108
|
+
/** Fetches the key information.
|
|
109
|
+
* @return {KeyInfo} The key information.
|
|
110
|
+
* @internal
|
|
111
|
+
* */
|
|
112
|
+
private fetch;
|
|
113
|
+
}
|
|
114
|
+
export {};
|
package/dist/src/key.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _Key_cs;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Key = exports.Ed25519 = exports.BLS = exports.Secp256k1 = void 0;
|
|
16
|
+
const util_1 = require("./util");
|
|
17
|
+
/** Secp256k1 key type */
|
|
18
|
+
var Secp256k1;
|
|
19
|
+
(function (Secp256k1) {
|
|
20
|
+
Secp256k1["Evm"] = "SecpEthAddr";
|
|
21
|
+
Secp256k1["Btc"] = "SecpBtc";
|
|
22
|
+
Secp256k1["BtcTest"] = "SecpBtcTest";
|
|
23
|
+
})(Secp256k1 || (exports.Secp256k1 = Secp256k1 = {}));
|
|
24
|
+
/** BLS key type */
|
|
25
|
+
var BLS;
|
|
26
|
+
(function (BLS) {
|
|
27
|
+
BLS["Eth2Deposited"] = "BlsPub";
|
|
28
|
+
BLS["Eth2Inactive"] = "BlsInactive";
|
|
29
|
+
})(BLS || (exports.BLS = BLS = {}));
|
|
30
|
+
/** Ed25519 key type */
|
|
31
|
+
var Ed25519;
|
|
32
|
+
(function (Ed25519) {
|
|
33
|
+
Ed25519["Solana"] = "Ed25519SolanaAddr";
|
|
34
|
+
Ed25519["Sui"] = "Ed25519SuiAddr";
|
|
35
|
+
Ed25519["Aptos"] = "Ed25519AptosAddr";
|
|
36
|
+
})(Ed25519 || (exports.Ed25519 = Ed25519 = {}));
|
|
37
|
+
/** Signing keys. */
|
|
38
|
+
class Key {
|
|
39
|
+
/** Is the key enabled? */
|
|
40
|
+
async enabled() {
|
|
41
|
+
const data = await this.fetch();
|
|
42
|
+
return data.enabled;
|
|
43
|
+
}
|
|
44
|
+
/** Enable the key. */
|
|
45
|
+
async enable() {
|
|
46
|
+
await this.update({ enabled: true });
|
|
47
|
+
}
|
|
48
|
+
/** Disable the key. */
|
|
49
|
+
async disable() {
|
|
50
|
+
await this.update({ enabled: false });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Set new policy (overwriting any policies previously set for this key)
|
|
54
|
+
* @param {KeyPolicy} policy The new policy to set
|
|
55
|
+
*/
|
|
56
|
+
async setPolicy(policy) {
|
|
57
|
+
await this.update({ policy: policy });
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Append to existing key policy. This append is not atomic -- it uses {@link policy} to fetch the current policy and then {@link setPolicy} to set the policy -- and should not be used in across concurrent sessions.
|
|
61
|
+
* @param {KeyPolicy} policy The policy to append to the existing one.
|
|
62
|
+
*/
|
|
63
|
+
async appendPolicy(policy) {
|
|
64
|
+
const existing = await this.policy();
|
|
65
|
+
await this.setPolicy([...existing, ...policy]);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the policy for the org.
|
|
69
|
+
* @return {Promise<KeyPolicy>} The policy for the org.
|
|
70
|
+
*/
|
|
71
|
+
async policy() {
|
|
72
|
+
const data = await this.fetch();
|
|
73
|
+
return (data.policy ?? []);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* @description Owner of the key
|
|
77
|
+
* @example User#c3b9379c-4e8c-4216-bd0a-65ace53cf98f
|
|
78
|
+
* */
|
|
79
|
+
async owner() {
|
|
80
|
+
const data = await this.fetch();
|
|
81
|
+
return data.owner;
|
|
82
|
+
}
|
|
83
|
+
/** Set the owner of the key. Only the key (or org) owner can change the owner of the key.
|
|
84
|
+
* @param {string} owner The user-id of the new owner of the key.
|
|
85
|
+
* */
|
|
86
|
+
async setOwner(owner) {
|
|
87
|
+
await this.update({ owner });
|
|
88
|
+
}
|
|
89
|
+
// --------------------------------------------------------------------------
|
|
90
|
+
// -- INTERNAL --------------------------------------------------------------
|
|
91
|
+
// --------------------------------------------------------------------------
|
|
92
|
+
/** Create a new key.
|
|
93
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
94
|
+
* @param {string} orgId The id of the organization to which the key belongs.
|
|
95
|
+
* @param {KeyInfo} data The JSON response from the API server.
|
|
96
|
+
* @internal
|
|
97
|
+
* */
|
|
98
|
+
constructor(cs, orgId, data) {
|
|
99
|
+
/** The CubeSigner instance that this key is associated with */
|
|
100
|
+
_Key_cs.set(this, void 0);
|
|
101
|
+
__classPrivateFieldSet(this, _Key_cs, cs, "f");
|
|
102
|
+
this.orgId = orgId;
|
|
103
|
+
this.id = data.key_id;
|
|
104
|
+
this.type = fromSchemaKeyType(data.key_type);
|
|
105
|
+
this.materialId = data.material_id;
|
|
106
|
+
this.publicKey = data.public_key;
|
|
107
|
+
}
|
|
108
|
+
/** Update the key.
|
|
109
|
+
* @param {UpdateKeyRequest} request The JSON request to send to the API server.
|
|
110
|
+
* @return {KeyInfo} The JSON response from the API server.
|
|
111
|
+
* */
|
|
112
|
+
async update(request) {
|
|
113
|
+
const resp = await (await __classPrivateFieldGet(this, _Key_cs, "f").management()).patch("/v0/org/{org_id}/keys/{key_id}", {
|
|
114
|
+
params: { path: { org_id: this.orgId, key_id: this.id } },
|
|
115
|
+
body: request,
|
|
116
|
+
parseAs: "json",
|
|
117
|
+
});
|
|
118
|
+
return (0, util_1.assertOk)(resp);
|
|
119
|
+
}
|
|
120
|
+
/** Create new signing keys.
|
|
121
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
122
|
+
* @param {string} orgId The id of the organization to which the key belongs.
|
|
123
|
+
* @param {KeyType} keyType The type of key to create.
|
|
124
|
+
* @param {number} count The number of keys to create.
|
|
125
|
+
* @param {string?} ownerId The owner of the keys. Defaults to the session's user.
|
|
126
|
+
* @return {Key[]} The new keys.
|
|
127
|
+
* @internal
|
|
128
|
+
* */
|
|
129
|
+
static async createKeys(cs, orgId, keyType, count, ownerId) {
|
|
130
|
+
const chain_id = 0; // not used anymore
|
|
131
|
+
const resp = await (await cs.management()).post("/v0/org/{org_id}/keys", {
|
|
132
|
+
params: { path: { org_id: orgId } },
|
|
133
|
+
body: {
|
|
134
|
+
count,
|
|
135
|
+
chain_id,
|
|
136
|
+
key_type: keyType,
|
|
137
|
+
owner: ownerId || null,
|
|
138
|
+
},
|
|
139
|
+
parseAs: "json",
|
|
140
|
+
});
|
|
141
|
+
const data = (0, util_1.assertOk)(resp);
|
|
142
|
+
return data.keys.map((k) => new Key(cs, orgId, k));
|
|
143
|
+
}
|
|
144
|
+
/** Get a key by id.
|
|
145
|
+
* @param {CubeSigner} cs The CubeSigner instance to use for signing.
|
|
146
|
+
* @param {string} orgId The id of the organization to which the key belongs.
|
|
147
|
+
* @param {string} keyId The id of the key to get.
|
|
148
|
+
* @return {Key} The key.
|
|
149
|
+
* @internal
|
|
150
|
+
* */
|
|
151
|
+
static async getKey(cs, orgId, keyId) {
|
|
152
|
+
const resp = await (await cs.management()).get("/v0/org/{org_id}/keys/{key_id}", {
|
|
153
|
+
params: { path: { org_id: orgId, key_id: keyId } },
|
|
154
|
+
parseAs: "json",
|
|
155
|
+
});
|
|
156
|
+
const data = (0, util_1.assertOk)(resp);
|
|
157
|
+
return new Key(cs, orgId, data);
|
|
158
|
+
}
|
|
159
|
+
/** Fetches the key information.
|
|
160
|
+
* @return {KeyInfo} The key information.
|
|
161
|
+
* @internal
|
|
162
|
+
* */
|
|
163
|
+
async fetch() {
|
|
164
|
+
const resp = await (await __classPrivateFieldGet(this, _Key_cs, "f").management()).get("/v0/org/{org_id}/keys/{key_id}", {
|
|
165
|
+
params: { path: { org_id: this.orgId, key_id: this.id } },
|
|
166
|
+
parseAs: "json",
|
|
167
|
+
});
|
|
168
|
+
const data = (0, util_1.assertOk)(resp);
|
|
169
|
+
return data;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.Key = Key;
|
|
173
|
+
_Key_cs = new WeakMap();
|
|
174
|
+
/** Convert a schema key type to a key type.
|
|
175
|
+
* @param {SchemaKeyType} ty The schema key type.
|
|
176
|
+
* @return {KeyType} The key type.
|
|
177
|
+
* @internal
|
|
178
|
+
* */
|
|
179
|
+
function fromSchemaKeyType(ty) {
|
|
180
|
+
switch (ty) {
|
|
181
|
+
case "SecpEthAddr":
|
|
182
|
+
return Secp256k1.Evm;
|
|
183
|
+
case "SecpBtc":
|
|
184
|
+
return Secp256k1.Btc;
|
|
185
|
+
case "SecpBtcTest":
|
|
186
|
+
return Secp256k1.BtcTest;
|
|
187
|
+
case "BlsPub":
|
|
188
|
+
return BLS.Eth2Deposited;
|
|
189
|
+
case "BlsInactive":
|
|
190
|
+
return BLS.Eth2Inactive;
|
|
191
|
+
case "Ed25519SolanaAddr":
|
|
192
|
+
return Ed25519.Solana;
|
|
193
|
+
case "Ed25519SuiAddr":
|
|
194
|
+
return Ed25519.Sui;
|
|
195
|
+
case "Ed25519AptosAddr":
|
|
196
|
+
return Ed25519.Aptos;
|
|
197
|
+
default:
|
|
198
|
+
throw new Error(`Unknown key type: ${ty}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2tleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFFQSxpQ0FBa0M7QUFFbEMseUJBQXlCO0FBQ3pCLElBQVksU0FJWDtBQUpELFdBQVksU0FBUztJQUNuQixnQ0FBbUIsQ0FBQTtJQUNuQiw0QkFBZSxDQUFBO0lBQ2Ysb0NBQXVCLENBQUE7QUFDekIsQ0FBQyxFQUpXLFNBQVMseUJBQVQsU0FBUyxRQUlwQjtBQUVELG1CQUFtQjtBQUNuQixJQUFZLEdBR1g7QUFIRCxXQUFZLEdBQUc7SUFDYiwrQkFBd0IsQ0FBQTtJQUN4QixtQ0FBNEIsQ0FBQTtBQUM5QixDQUFDLEVBSFcsR0FBRyxtQkFBSCxHQUFHLFFBR2Q7QUFFRCx1QkFBdUI7QUFDdkIsSUFBWSxPQUlYO0FBSkQsV0FBWSxPQUFPO0lBQ2pCLHVDQUE0QixDQUFBO0lBQzVCLGlDQUFzQixDQUFBO0lBQ3RCLHFDQUEwQixDQUFBO0FBQzVCLENBQUMsRUFKVyxPQUFPLHVCQUFQLE9BQU8sUUFJbEI7QUFXRCxvQkFBb0I7QUFDcEIsTUFBYSxHQUFHO0lBNkJkLDBCQUEwQjtJQUMxQixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxL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UUFDSCxNQUFNLElBQUksR0FBRyxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTFMRCxrQkEwTEM7O0FBRUQ7Ozs7S0FJSztBQUNMLFNBQVMsaUJBQWlCLENBQUMsRUFBaUI7SUFDMUMsUUFBUSxFQUFFLEVBQUU7UUFDVixLQUFLLGFBQWE7WUFDaEIsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLEtBQUssU0FBUztZQUNaLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztRQUN2QixLQUFLLGFBQWE7WUFDaEIsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQzNCLEtBQUssUUFBUTtZQUNYLE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUMzQixLQUFLLGFBQWE7WUFDaEIsT0FBTyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBQzFCLEtBQUssbUJBQW1CO1lBQ3RCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN4QixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDckIsS0FBSyxrQkFBa0I7WUFDckIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3ZCO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5QztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdWJlU2lnbmVyLCBLZXlQb2xpY3kgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgY29tcG9uZW50cyB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgYXNzZXJ0T2sgfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKiBTZWNwMjU2azEga2V5IHR5cGUgKi9cbmV4cG9ydCBlbnVtIFNlY3AyNTZrMSB7XG4gIEV2bSA9IFwiU2VjcEV0aEFkZHJcIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBCdGMgPSBcIlNlY3BCdGNcIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBCdGNUZXN0ID0gXCJTZWNwQnRjVGVzdFwiLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG59XG5cbi8qKiBCTFMga2V5IHR5cGUgKi9cbmV4cG9ydCBlbnVtIEJMUyB7XG4gIEV0aDJEZXBvc2l0ZWQgPSBcIkJsc1B1YlwiLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIEV0aDJJbmFjdGl2ZSA9IFwiQmxzSW5hY3RpdmVcIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xufVxuXG4vKiogRWQyNTUxOSBrZXkgdHlwZSAqL1xuZXhwb3J0IGVudW0gRWQyNTUxOSB7XG4gIFNvbGFuYSA9IFwiRWQyNTUxOVNvbGFuYUFkZHJcIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBTdWkgPSBcIkVkMjU1MTlTdWlBZGRyXCIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgQXB0b3MgPSBcIkVkMjU1MTlBcHRvc0FkZHJcIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xufVxuXG4vKiogS2V5IHR5cGUgKi9cbmV4cG9ydCB0eXBlIEtleVR5cGUgPSBTZWNwMjU2azEgfCBCTFMgfCBFZDI1NTE5O1xuXG4vKiogU2NoZW1hIGtleSB0eXBlIChpLmUuLCBrZXkgdHlwZSBhdCB0aGUgQVBJIGxldmVsKSAqL1xudHlwZSBTY2hlbWFLZXlUeXBlID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJLZXlUeXBlXCJdO1xuXG50eXBlIFVwZGF0ZUtleVJlcXVlc3QgPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIlVwZGF0ZUtleVJlcXVlc3RcIl07XG50eXBlIEtleUluZm8gPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIktleUluZm9cIl07XG5cbi8qKiBTaWduaW5nIGtleXMuICovXG5leHBvcnQgY2xhc3MgS2V5IHtcbiAgLyoqIFRoZSBDdWJlU2lnbmVyIGluc3RhbmNlIHRoYXQgdGhpcyBrZXkgaXMgYXNzb2NpYXRlZCB3aXRoICovXG4gIHJlYWRvbmx5ICNjczogQ3ViZVNpZ25lcjtcbiAgLyoqIFRoZSBvcmdhbml6YXRpb24gdGhhdCB0aGlzIGtleSBpcyBpbiAqL1xuICByZWFkb25seSBvcmdJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBrZXk6IFwiS2V5I1wiIGZvbGxvd2VkIGJ5IGEgdW5pcXVlIGlkZW50aWZpZXIgc3BlY2lmaWMgdG9cbiAgICogdGhlIHR5cGUgb2Yga2V5IChzdWNoIGFzIGEgcHVibGljIGtleSBmb3IgQkxTIG9yIGFuIGV0aGVyZXVtIGFkZHJlc3MgZm9yIFNlY3ApXG4gICAqIEBleGFtcGxlIEtleSMweDhlMzQ4NDY4N2U2NmNkZDI2Y2YwNGMzNjQ3NjMzYWI0ZjM1NzAxNDhcbiAgICogKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogVGhlIHR5cGUgb2Yga2V5LiAqL1xuICByZWFkb25seSB0eXBlOiBLZXlUeXBlO1xuXG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGtleSwgc3VjaCBhcyBhIHB1YmxpYyBrZXkgb3IgYW4gZXRoZXJldW0gYWRkcmVzc1xuICAgKiBAZXhhbXBsZSAweDhlMzQ4NDY4N2U2NmNkZDI2Y2YwNGMzNjQ3NjMzYWI0ZjM1NzAxNDhcbiAgICogKi9cbiAgcmVhZG9ubHkgbWF0ZXJpYWxJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGV4LWVuY29kZWQsIHNlcmlhbGl6ZWQgcHVibGljIGtleS4gVGhlIGZvcm1hdCB1c2VkIGRlcGVuZHMgb24gdGhlIGtleSB0eXBlOlxuICAgKiAtIHNlY3AyNTZrMSBrZXlzIHVzZSA2NS1ieXRlIHVuY29tcHJlc3NlZCBTRUNHIGZvcm1hdFxuICAgKiAtIEJMUyBrZXlzIHVzZSA0OC1ieXRlIGNvbXByZXNzZWQgQkxTMTItMzgxIChaQ2FzaCkgZm9ybWF0XG4gICAqIEBleGFtcGxlIDB4MDRkMjY4OGI2YmMyY2U3Zjk4NzliOWU3NDVmM2M0ZGMxNzc5MDhjNWNlZjBjMWI2NGNmZjE5YWU3ZmYyN2RlZTYyM2M2NGZlOWQ5YzMyNWM3ZmJiYzc0OGJiZDVmNjA3Y2UxNGRkODNlMjhlYmJiYjdkM2U3ZjJmZmI3MGE3OTQzMVxuICAgKiAqL1xuICByZWFkb25seSBwdWJsaWNLZXk6IHN0cmluZztcblxuICAvKiogSXMgdGhlIGtleSBlbmFibGVkPyAqL1xuICBhc3luYyBlbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoKCk7XG4gICAgcmV0dXJuIGRhdGEuZW5hYmxlZDtcbiAgfVxuXG4gIC8qKiBFbmFibGUgdGhlIGtleS4gKi9cbiAgYXN5bmMgZW5hYmxlKCkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgZW5hYmxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNhYmxlIHRoZSBrZXkuICovXG4gIGFzeW5jIGRpc2FibGUoKSB7XG4gICAgYXdhaXQgdGhpcy51cGRhdGUoeyBlbmFibGVkOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbmV3IHBvbGljeSAob3ZlcndyaXRpbmcgYW55IHBvbGljaWVzIHByZXZpb3VzbHkgc2V0IGZvciB0aGlzIGtleSlcbiAgICogQHBhcmFtIHtLZXlQb2xpY3l9IHBvbGljeSBUaGUgbmV3IHBvbGljeSB0byBzZXRcbiAgICovXG4gIGFzeW5jIHNldFBvbGljeShwb2xpY3k6IEtleVBvbGljeSkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgcG9saWN5OiBwb2xpY3kgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5bXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgdG8gZXhpc3Rpbmcga2V5IHBvbGljeS4gVGhpcyBhcHBlbmQgaXMgbm90IGF0b21pYyAtLSBpdCB1c2VzIHtAbGluayBwb2xpY3l9IHRvIGZldGNoIHRoZSBjdXJyZW50IHBvbGljeSBhbmQgdGhlbiB7QGxpbmsgc2V0UG9saWN5fSB0byBzZXQgdGhlIHBvbGljeSAtLSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGFjcm9zcyBjb25jdXJyZW50IHNlc3Npb25zLlxuICAgKiBAcGFyYW0ge0tleVBvbGljeX0gcG9saWN5IFRoZSBwb2xpY3kgdG8gYXBwZW5kIHRvIHRoZSBleGlzdGluZyBvbmUuXG4gICAqL1xuICBhc3luYyBhcHBlbmRQb2xpY3kocG9saWN5OiBLZXlQb2xpY3kpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMucG9saWN5KCk7XG4gICAgYXdhaXQgdGhpcy5zZXRQb2xpY3koWy4uLmV4aXN0aW5nLCAuLi5wb2xpY3ldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHBvbGljeSBmb3IgdGhlIG9yZy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxLZXlQb2xpY3k+fSBUaGUgcG9saWN5IGZvciB0aGUgb3JnLlxuICAgKi9cbiAgYXN5bmMgcG9saWN5KCk6IFByb21pc2U8S2V5UG9saWN5PiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2goKTtcbiAgICByZXR1cm4gKGRhdGEucG9saWN5ID8/IFtdKSBhcyB1bmtub3duIGFzIEtleVBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gT3duZXIgb2YgdGhlIGtleVxuICAgKiBAZXhhbXBsZSBVc2VyI2MzYjkzNzljLTRlOGMtNDIxNi1iZDBhLTY1YWNlNTNjZjk4ZlxuICAgKiAqL1xuICBhc3luYyBvd25lcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoKCk7XG4gICAgcmV0dXJuIGRhdGEub3duZXI7XG4gIH1cblxuICAvKiogU2V0IHRoZSBvd25lciBvZiB0aGUga2V5LiBPbmx5IHRoZSBrZXkgKG9yIG9yZykgb3duZXIgY2FuIGNoYW5nZSB0aGUgb3duZXIgb2YgdGhlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG93bmVyIFRoZSB1c2VyLWlkIG9mIHRoZSBuZXcgb3duZXIgb2YgdGhlIGtleS5cbiAgICogKi9cbiAgYXN5bmMgc2V0T3duZXIob3duZXI6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgb3duZXIgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLSBJTlRFUk5BTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcga2V5LlxuICAgKiBAcGFyYW0ge0N1YmVTaWduZXJ9IGNzIFRoZSBDdWJlU2lnbmVyIGluc3RhbmNlIHRvIHVzZSBmb3Igc2lnbmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9yZ0lkIFRoZSBpZCBvZiB0aGUgb3JnYW5pemF0aW9uIHRvIHdoaWNoIHRoZSBrZXkgYmVsb25ncy5cbiAgICogQHBhcmFtIHtLZXlJbmZvfSBkYXRhIFRoZSBKU09OIHJlc3BvbnNlIGZyb20gdGhlIEFQSSBzZXJ2ZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKiAqL1xuICBjb25zdHJ1Y3RvcihjczogQ3ViZVNpZ25lciwgb3JnSWQ6IHN0cmluZywgZGF0YTogS2V5SW5mbykge1xuICAgIHRoaXMuI2NzID0gY3M7XG4gICAgdGhpcy5vcmdJZCA9IG9yZ0lkO1xuICAgIHRoaXMuaWQgPSBkYXRhLmtleV9pZDtcbiAgICB0aGlzLnR5cGUgPSBmcm9tU2NoZW1hS2V5VHlwZShkYXRhLmtleV90eXBlKTtcbiAgICB0aGlzLm1hdGVyaWFsSWQgPSBkYXRhLm1hdGVyaWFsX2lkO1xuICAgIHRoaXMucHVibGljS2V5ID0gZGF0YS5wdWJsaWNfa2V5O1xuICB9XG5cbiAgLyoqIFVwZGF0ZSB0aGUga2V5LlxuICAgKiBAcGFyYW0ge1VwZGF0ZUtleVJlcXVlc3R9IHJlcXVlc3QgVGhlIEpTT04gcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBBUEkgc2VydmVyLlxuICAgKiBAcmV0dXJuIHtLZXlJbmZvfSBUaGUgSlNPTiByZXNwb25zZSBmcm9tIHRoZSBBUEkgc2VydmVyLlxuICAgKiAqL1xuICBwcml2YXRlIGFzeW5jIHVwZGF0ZShyZXF1ZXN0OiBVcGRhdGVLZXlSZXF1ZXN0KTogUHJvbWlzZTxLZXlJbmZvPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkucGF0Y2goXCIvdjAvb3JnL3tvcmdfaWR9L2tleXMve2tleV9pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLm9yZ0lkLCBrZXlfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgYm9keTogcmVxdWVzdCxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIHJldHVybiBhc3NlcnRPayhyZXNwKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgbmV3IHNpZ25pbmcga2V5cy5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUga2V5IGJlbG9uZ3MuXG4gICAqIEBwYXJhbSB7S2V5VHlwZX0ga2V5VHlwZSBUaGUgdHlwZSBvZiBrZXkgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY291bnQgVGhlIG51bWJlciBvZiBrZXlzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmc/fSBvd25lcklkIFRoZSBvd25lciBvZiB0aGUga2V5cy4gRGVmYXVsdHMgdG8gdGhlIHNlc3Npb24ncyB1c2VyLlxuICAgKiBAcmV0dXJuIHtLZXlbXX0gVGhlIG5ldyBrZXlzLlxuICAgKiBAaW50ZXJuYWxcbiAgICogKi9cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUtleXMoXG4gICAgY3M6IEN1YmVTaWduZXIsXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBrZXlUeXBlOiBLZXlUeXBlLFxuICAgIGNvdW50OiBudW1iZXIsXG4gICAgb3duZXJJZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTxLZXlbXT4ge1xuICAgIGNvbnN0IGNoYWluX2lkID0gMDsgLy8gbm90IHVzZWQgYW55bW9yZVxuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCBjcy5tYW5hZ2VtZW50KClcbiAgICApLnBvc3QoXCIvdjAvb3JnL3tvcmdfaWR9L2tleXNcIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiBvcmdJZCB9IH0sXG4gICAgICBib2R5OiB7XG4gICAgICAgIGNvdW50LFxuICAgICAgICBjaGFpbl9pZCxcbiAgICAgICAga2V5X3R5cGU6IGtleVR5cGUsXG4gICAgICAgIG93bmVyOiBvd25lcklkIHx8IG51bGwsXG4gICAgICB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGFzc2VydE9rKHJlc3ApO1xuICAgIHJldHVybiBkYXRhLmtleXMubWFwKChrOiBLZXlJbmZvKSA9PiBuZXcgS2V5KGNzLCBvcmdJZCwgaykpO1xuICB9XG5cbiAgLyoqIEdldCBhIGtleSBieSBpZC5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUga2V5IGJlbG9uZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlJZCBUaGUgaWQgb2YgdGhlIGtleSB0byBnZXQuXG4gICAqIEByZXR1cm4ge0tleX0gVGhlIGtleS5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIHN0YXRpYyBhc3luYyBnZXRLZXkoY3M6IEN1YmVTaWduZXIsIG9yZ0lkOiBzdHJpbmcsIGtleUlkOiBzdHJpbmcpOiBQcm9taXNlPEtleT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCBjcy5tYW5hZ2VtZW50KClcbiAgICApLmdldChcIi92MC9vcmcve29yZ19pZH0va2V5cy97a2V5X2lkfVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IG9yZ0lkLCBrZXlfaWQ6IGtleUlkIH0gfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gbmV3IEtleShjcywgb3JnSWQsIGRhdGEpO1xuICB9XG5cbiAgLyoqIEZldGNoZXMgdGhlIGtleSBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybiB7S2V5SW5mb30gVGhlIGtleSBpbmZvcm1hdGlvbi5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2goKTogUHJvbWlzZTxLZXlJbmZvPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfS9rZXlzL3trZXlfaWR9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy5vcmdJZCwga2V5X2lkOiB0aGlzLmlkIH0gfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxufVxuXG4vKiogQ29udmVydCBhIHNjaGVtYSBrZXkgdHlwZSB0byBhIGtleSB0eXBlLlxuICogQHBhcmFtIHtTY2hlbWFLZXlUeXBlfSB0eSBUaGUgc2NoZW1hIGtleSB0eXBlLlxuICogQHJldHVybiB7S2V5VHlwZX0gVGhlIGtleSB0eXBlLlxuICogQGludGVybmFsXG4gKiAqL1xuZnVuY3Rpb24gZnJvbVNjaGVtYUtleVR5cGUodHk6IFNjaGVtYUtleVR5cGUpOiBLZXlUeXBlIHtcbiAgc3dpdGNoICh0eSkge1xuICAgIGNhc2UgXCJTZWNwRXRoQWRkclwiOlxuICAgICAgcmV0dXJuIFNlY3AyNTZrMS5Fdm07XG4gICAgY2FzZSBcIlNlY3BCdGNcIjpcbiAgICAgIHJldHVybiBTZWNwMjU2azEuQnRjO1xuICAgIGNhc2UgXCJTZWNwQnRjVGVzdFwiOlxuICAgICAgcmV0dXJuIFNlY3AyNTZrMS5CdGNUZXN0O1xuICAgIGNhc2UgXCJCbHNQdWJcIjpcbiAgICAgIHJldHVybiBCTFMuRXRoMkRlcG9zaXRlZDtcbiAgICBjYXNlIFwiQmxzSW5hY3RpdmVcIjpcbiAgICAgIHJldHVybiBCTFMuRXRoMkluYWN0aXZlO1xuICAgIGNhc2UgXCJFZDI1NTE5U29sYW5hQWRkclwiOlxuICAgICAgcmV0dXJuIEVkMjU1MTkuU29sYW5hO1xuICAgIGNhc2UgXCJFZDI1NTE5U3VpQWRkclwiOlxuICAgICAgcmV0dXJuIEVkMjU1MTkuU3VpO1xuICAgIGNhc2UgXCJFZDI1NTE5QXB0b3NBZGRyXCI6XG4gICAgICByZXR1cm4gRWQyNTUxOS5BcHRvcztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGtleSB0eXBlOiAke3R5fWApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Sign, SignResponse, Role } from ".";
|
|
2
|
+
/**
|
|
3
|
+
* Wrapper around @type {Sign} and @type {Role} that adds a **single-approval**
|
|
4
|
+
* multi-factor authorization on top of all sign operations.
|
|
5
|
+
*/
|
|
6
|
+
export declare class Mfa {
|
|
7
|
+
#private;
|
|
8
|
+
/**
|
|
9
|
+
* Auto approve a sign operation that requires MFA.
|
|
10
|
+
*
|
|
11
|
+
* @param signFn The sign operation to call
|
|
12
|
+
* @param {T} args Arguments to the sign operation
|
|
13
|
+
* @return {Promise<U>} The result of the sign operation.
|
|
14
|
+
*/
|
|
15
|
+
autoApprove<T extends Array<any>, U>(// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
16
|
+
signFn: (...args: T) => Promise<SignResponse<U>>, ...args: T): Promise<U>;
|
|
17
|
+
/**
|
|
18
|
+
* Constructor.
|
|
19
|
+
* @param {Sign} sign Sign instance to use for signing
|
|
20
|
+
* @param {Role} role Role instance to use for MFA approval
|
|
21
|
+
*/
|
|
22
|
+
constructor(sign: Sign, role: Role);
|
|
23
|
+
}
|