@ledgerhq/vault-cli 1.14.2 → 1.16.0

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 (32) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/CHANGELOG.md +18 -0
  3. package/__mocks__/@ledgerhq/vault-common.ts +2 -0
  4. package/bin/__tests__/backupCompartment.test.d.ts +2 -0
  5. package/bin/__tests__/backupCompartment.test.d.ts.map +1 -0
  6. package/bin/__tests__/backupCompartment.test.js +84 -0
  7. package/bin/__tests__/backupCompartment.test.js.map +1 -0
  8. package/bin/__tests__/restoreCompartment.test.d.ts +2 -0
  9. package/bin/__tests__/restoreCompartment.test.d.ts.map +1 -0
  10. package/bin/__tests__/restoreCompartment.test.js +92 -0
  11. package/bin/__tests__/restoreCompartment.test.js.map +1 -0
  12. package/bin/__tests__/revoke.test.d.ts +2 -0
  13. package/bin/__tests__/revoke.test.d.ts.map +1 -0
  14. package/bin/__tests__/revoke.test.js +61 -0
  15. package/bin/__tests__/revoke.test.js.map +1 -0
  16. package/bin/commands/backupCompartment.d.ts +31 -0
  17. package/bin/commands/backupCompartment.d.ts.map +1 -0
  18. package/bin/commands/backupCompartment.js +76 -0
  19. package/bin/commands/backupCompartment.js.map +1 -0
  20. package/bin/commands/index.d.ts +58 -0
  21. package/bin/commands/index.d.ts.map +1 -1
  22. package/bin/commands/index.js +6 -0
  23. package/bin/commands/index.js.map +1 -1
  24. package/bin/commands/restoreCompartment.d.ts +39 -0
  25. package/bin/commands/restoreCompartment.d.ts.map +1 -0
  26. package/bin/commands/restoreCompartment.js +85 -0
  27. package/bin/commands/restoreCompartment.js.map +1 -0
  28. package/bin/commands/revoke.d.ts +40 -0
  29. package/bin/commands/revoke.d.ts.map +1 -0
  30. package/bin/commands/revoke.js +80 -0
  31. package/bin/commands/revoke.js.map +1 -0
  32. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
- @ledgerhq/vault-cli:build: cache hit, replaying output 6f6ef23db1700fb7
1
+ @ledgerhq/vault-cli:build: cache hit, replaying output 70779db42119c28e
2
2
  @ledgerhq/vault-cli:build:
3
- @ledgerhq/vault-cli:build: > @ledgerhq/vault-cli@1.14.2 build /home/runner/work/vault-ts/vault-ts/apps/cli
3
+ @ledgerhq/vault-cli:build: > @ledgerhq/vault-cli@1.16.0 build /home/runner/work/vault-ts/vault-ts/apps/cli
4
4
  @ledgerhq/vault-cli:build: > tsc && chmod +x bin/index.js
5
5
  @ledgerhq/vault-cli:build:
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @ledgerhq/vault-cli
2
2
 
3
+ ## 1.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6be93c3: Add revoke command
8
+
9
+ ## 1.15.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 41de09a: Add ability to backup & restore HSM compartment
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [17b3731]
18
+ - Updated dependencies [41de09a]
19
+ - @ledgerhq/vault-common@1.17.0
20
+
3
21
  ## 1.14.2
4
22
 
5
23
  ### Patch Changes
@@ -133,12 +133,14 @@ export const createDevicesPool = jest.fn().mockReturnValue({
133
133
  connectSocket: jest.fn(),
134
134
  onEvent: jest.fn(),
135
135
  rejectRequest: jest.fn(),
136
+ post: jest.fn(),
136
137
  }),
137
138
  getUserID: jest.fn().mockReturnValue("userID"),
138
139
  getOnboardingAdminDevices: jest.fn().mockReturnValue([
139
140
  ["Admin 1", 4],
140
141
  ["Admin 2", 5],
141
142
  ]),
143
+ runWithQuorum: jest.fn(),
142
144
  });
143
145
  export const genSeed = jest.fn();
144
146
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backupCompartment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupCompartment.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/backupCompartment.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const createHSMBridge = __importStar(require("@ledgerhq/vault-common/lib/createHSMBridge"));
39
+ const fs_1 = __importDefault(require("fs"));
40
+ const backupCompartment_1 = __importDefault(require("../commands/backupCompartment"));
41
+ describe("backupCompartment", () => {
42
+ beforeEach(() => {
43
+ jest.spyOn(console, "log").mockImplementation();
44
+ jest.spyOn(fs_1.default, "readFileSync").mockReturnValue("<cert>");
45
+ });
46
+ afterEach(() => {
47
+ jest.restoreAllMocks();
48
+ });
49
+ it("should throw if no HSM cert given", () => __awaiter(void 0, void 0, void 0, function* () {
50
+ let err;
51
+ try {
52
+ yield backupCompartment_1.default.run({
53
+ compartment: 1,
54
+ hsm: "<hsm>",
55
+ hsmCert: undefined,
56
+ });
57
+ }
58
+ catch (e) {
59
+ err = e;
60
+ }
61
+ expect(err).toEqual(new Error("You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag"));
62
+ }));
63
+ it("should backup a compartment", () => __awaiter(void 0, void 0, void 0, function* () {
64
+ const fakeBridge = {
65
+ backupCompartment: jest.fn(),
66
+ restoreCompartment: jest.fn(),
67
+ resetCompartment: jest.fn(),
68
+ };
69
+ const createHSMBridgeSpy = jest.spyOn(createHSMBridge, "default").mockReturnValue(fakeBridge);
70
+ yield backupCompartment_1.default.run({
71
+ compartment: 42,
72
+ hsm: "<hsm>",
73
+ hsmCert: "abcde",
74
+ hsmCertPassword: "1234",
75
+ });
76
+ expect(createHSMBridgeSpy).toHaveBeenCalledWith({
77
+ hsmCert: "<cert>",
78
+ hsmCertPassword: "1234",
79
+ hsmEndpoint: "<hsm>",
80
+ });
81
+ expect(fakeBridge.backupCompartment).toHaveBeenCalledWith(42);
82
+ }));
83
+ });
84
+ //# sourceMappingURL=backupCompartment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupCompartment.test.js","sourceRoot":"","sources":["../../src/__tests__/backupCompartment.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4FAA8E;AAC9E,4CAAoB;AAEpB,sFAA8D;AAE9D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAChD,IAAI,CAAC,KAAK,CAAC,YAAE,EAAE,cAAc,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAS,EAAE;QACjD,IAAI,GAAG,CAAC;QACR,IAAI;YACF,MAAM,2BAAiB,CAAC,GAAG,CAAC;gBAC1B,WAAW,EAAE,CAAC;gBACd,GAAG,EAAE,OAAO;gBAEZ,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;YACV,GAAG,GAAG,CAAC,CAAC;SACT;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CACjB,IAAI,KAAK,CACP,qIAAqI,CACtI,CACF,CAAC;IACJ,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAS,EAAE;QAC3C,MAAM,UAAU,GAAG;YACjB,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;YAC5B,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;YAC7B,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;SAC5B,CAAC;QACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC9F,MAAM,2BAAiB,CAAC,GAAG,CAAC;YAC1B,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,OAAO;YAChB,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC;YAC9C,OAAO,EAAE,QAAQ;YACjB,eAAe,EAAE,MAAM;YACvB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=restoreCompartment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restoreCompartment.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/restoreCompartment.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ const createHSMBridge = __importStar(require("@ledgerhq/vault-common/lib/createHSMBridge"));
39
+ const fs_1 = __importDefault(require("fs"));
40
+ const restoreCompartment_1 = __importDefault(require("../commands/restoreCompartment"));
41
+ const logger_1 = __importDefault(require("../logger"));
42
+ describe("restoreCompartment", () => {
43
+ beforeEach(() => {
44
+ jest.spyOn(console, "log").mockImplementation();
45
+ });
46
+ afterEach(() => {
47
+ jest.restoreAllMocks();
48
+ });
49
+ it("should throw if no HSM cert given", () => __awaiter(void 0, void 0, void 0, function* () {
50
+ let err;
51
+ try {
52
+ yield restoreCompartment_1.default.run({
53
+ compartment: 1,
54
+ hsm: "<hsm>",
55
+ hsmCert: undefined,
56
+ });
57
+ }
58
+ catch (e) {
59
+ err = e;
60
+ }
61
+ expect(err).toEqual(new Error("You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag"));
62
+ }));
63
+ it("should restore a compartment", () => __awaiter(void 0, void 0, void 0, function* () {
64
+ jest
65
+ .spyOn(fs_1.default, "readFileSync")
66
+ .mockReturnValueOnce("<cert>")
67
+ .mockReturnValue('{"counters":"1234","internalfs":"abcdef"}');
68
+ const fakeBridge = {
69
+ backupCompartment: jest.fn(),
70
+ restoreCompartment: jest.fn(),
71
+ resetCompartment: jest.fn(),
72
+ };
73
+ const createHSMBridgeSpy = jest.spyOn(createHSMBridge, "default").mockReturnValue(fakeBridge);
74
+ yield restoreCompartment_1.default.run({
75
+ backupFile: "/path/to/file",
76
+ compartment: 42,
77
+ hsm: "<hsm>",
78
+ hsmCert: "abcde",
79
+ hsmCertPassword: "1234",
80
+ });
81
+ expect(createHSMBridgeSpy).toHaveBeenCalledWith({
82
+ hsmCert: "<cert>",
83
+ hsmCertPassword: "1234",
84
+ hsmEndpoint: "<hsm>",
85
+ });
86
+ expect(fakeBridge.restoreCompartment).toHaveBeenCalledWith(42, {
87
+ counters: "1234",
88
+ internalfs: "abcdef",
89
+ }, { logger: logger_1.default });
90
+ }));
91
+ });
92
+ //# sourceMappingURL=restoreCompartment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restoreCompartment.test.js","sourceRoot":"","sources":["../../src/__tests__/restoreCompartment.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4FAA8E;AAC9E,4CAAoB;AAEpB,wFAAgE;AAChE,uDAA+B;AAE/B,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAS,EAAE;QACjD,IAAI,GAAG,CAAC;QACR,IAAI;YACF,MAAM,4BAAkB,CAAC,GAAG,CAAC;gBAC3B,WAAW,EAAE,CAAC;gBACd,GAAG,EAAE,OAAO;gBAEZ,OAAO,EAAE,SAAS;aACnB,CAAC,CAAC;SACJ;QAAC,OAAO,CAAC,EAAE;YACV,GAAG,GAAG,CAAC,CAAC;SACT;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CACjB,IAAI,KAAK,CACP,qIAAqI,CACtI,CACF,CAAC;IACJ,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAS,EAAE;QAC5C,IAAI;aACD,KAAK,CAAC,YAAE,EAAE,cAAc,CAAC;aACzB,mBAAmB,CAAC,QAAQ,CAAC;aAC7B,eAAe,CAAC,2CAA2C,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG;YACjB,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;YAC5B,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE;YAC7B,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;SAC5B,CAAC;QACF,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC9F,MAAM,4BAAkB,CAAC,GAAG,CAAC;YAC3B,UAAU,EAAE,eAAe;YAC3B,WAAW,EAAE,EAAE;YACf,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE,OAAO;YAChB,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC;YAC9C,OAAO,EAAE,QAAQ;YACjB,eAAe,EAAE,MAAM;YACvB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CACxD,EAAE,EACF;YACE,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,QAAQ;SACrB,EACD,EAAE,MAAM,EAAN,gBAAM,EAAE,CACX,CAAC;IACJ,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=revoke.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/revoke.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const revoke_1 = require("../commands/revoke");
13
+ const test_utils_1 = require("./test-utils");
14
+ const options = {
15
+ command: "user",
16
+ id: 10,
17
+ device: 4,
18
+ salt: "",
19
+ gate: "<gate>",
20
+ noApproval: false,
21
+ };
22
+ describe("revoke", () => {
23
+ beforeEach(() => {
24
+ jest.spyOn(console, "log").mockImplementation();
25
+ });
26
+ afterEach(() => {
27
+ jest.clearAllMocks();
28
+ });
29
+ it("should revoke user", () => __awaiter(void 0, void 0, void 0, function* () {
30
+ const pool = (0, test_utils_1.createTestDevicesPool)();
31
+ const userDevice = yield pool.login(options.device);
32
+ yield (0, revoke_1.revokeEntity)(options);
33
+ expect(userDevice.post).toHaveBeenCalledWith("/requests", {
34
+ type: "REVOKE_USER",
35
+ user_id: options.id,
36
+ });
37
+ expect(pool.runWithQuorum).toHaveBeenCalled();
38
+ }));
39
+ it("should revoke group", () => __awaiter(void 0, void 0, void 0, function* () {
40
+ const pool = (0, test_utils_1.createTestDevicesPool)();
41
+ const userDevice = yield pool.login(options.device);
42
+ const opts = Object.assign(Object.assign({}, options), { command: "group" });
43
+ yield (0, revoke_1.revokeEntity)(opts);
44
+ expect(userDevice.post).toHaveBeenCalledWith("/requests", {
45
+ type: "REVOKE_GROUP",
46
+ group_id: opts.id,
47
+ });
48
+ expect(pool.runWithQuorum).toHaveBeenCalled();
49
+ }));
50
+ it("should revoke without approvals", () => __awaiter(void 0, void 0, void 0, function* () {
51
+ const pool = (0, test_utils_1.createTestDevicesPool)();
52
+ const userDevice = yield pool.login(options.device);
53
+ yield (0, revoke_1.revokeEntity)(Object.assign(Object.assign({}, options), { noApproval: true }));
54
+ expect(userDevice.post).toHaveBeenCalledWith("/requests", {
55
+ type: "REVOKE_USER",
56
+ user_id: options.id,
57
+ });
58
+ expect(pool.runWithQuorum).not.toHaveBeenCalled();
59
+ }));
60
+ });
61
+ //# sourceMappingURL=revoke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke.test.js","sourceRoot":"","sources":["../../src/__tests__/revoke.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+CAAkD;AAElD,6CAAqD;AAErD,MAAM,OAAO,GAAkB;IAC7B,OAAO,EAAE,MAAM;IACf,EAAE,EAAE,EAAE;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,EAAE;IACR,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAS,EAAE;QAClC,MAAM,IAAI,GAAG,IAAA,kCAAqB,GAAE,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,IAAA,qBAAY,EAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE;YACxD,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,OAAO,CAAC,EAAE;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAChD,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAS,EAAE;QACnC,MAAM,IAAI,GAAG,IAAA,kCAAqB,GAAE,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,IAAI,mCAAuB,OAAO,KAAE,OAAO,EAAE,OAAO,GAAE,CAAC;QAC7D,MAAM,IAAA,qBAAY,EAAC,IAAI,CAAC,CAAC;QAEzB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE;YACxD,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,IAAI,CAAC,EAAE;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAChD,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAS,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAA,kCAAqB,GAAE,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,IAAA,qBAAY,kCAAM,OAAO,KAAE,UAAU,EAAE,IAAI,IAAG,CAAC;QAErD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE;YACxD,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,OAAO,CAAC,EAAE;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ export declare type Options = {
2
+ compartment: number;
3
+ hsm: string;
4
+ hsmCert: string;
5
+ hsmCertPassword: string;
6
+ };
7
+ declare const _default: {
8
+ command: string;
9
+ description: string;
10
+ help: {
11
+ content: string;
12
+ }[];
13
+ options: ({
14
+ name: string;
15
+ alias: string;
16
+ type: NumberConstructor;
17
+ description: string;
18
+ defaultValue: string | undefined;
19
+ required: boolean;
20
+ } | {
21
+ name: string;
22
+ type: StringConstructor;
23
+ description: string;
24
+ defaultValue: string | undefined;
25
+ required: boolean;
26
+ alias?: undefined;
27
+ })[];
28
+ run: (options: Options) => Promise<void>;
29
+ };
30
+ export default _default;
31
+ //# sourceMappingURL=backupCompartment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupCompartment.d.ts","sourceRoot":"","sources":["../../src/commands/backupCompartment.ts"],"names":[],"mappings":"AAGA,oBAAY,OAAO,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;;;;;;;;;;;;;;;;;;;;;;mBAyCqB,OAAO,KAAG,QAAQ,IAAI,CAAC;;AAvC9C,wBA+DE"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const createHSMBridge_1 = __importDefault(require("@ledgerhq/vault-common/lib/createHSMBridge"));
16
+ const fs_1 = __importDefault(require("fs"));
17
+ exports.default = {
18
+ command: "backupCompartment",
19
+ description: "Backup HSM simu compartment",
20
+ help: [
21
+ {
22
+ content: "{grey $} ledger-vault backupCompartment --cid 123",
23
+ },
24
+ ],
25
+ options: [
26
+ {
27
+ name: "compartment",
28
+ alias: "c",
29
+ type: Number,
30
+ description: "HSM compartment ID {blue $VAULT_COMPARTMENT_ID}",
31
+ defaultValue: process.env.VAULT_COMPARTMENT_ID,
32
+ required: true,
33
+ },
34
+ {
35
+ name: "hsm",
36
+ type: String,
37
+ description: "HSM endpoint {blue $VAULT_HSM_ENDPOINT}",
38
+ defaultValue: process.env.VAULT_HSM_ENDPOINT,
39
+ required: true,
40
+ },
41
+ {
42
+ name: "hsmCert",
43
+ type: String,
44
+ description: "Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}",
45
+ defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,
46
+ required: true,
47
+ },
48
+ {
49
+ name: "hsmCertPassword",
50
+ type: String,
51
+ description: "HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}",
52
+ defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,
53
+ required: true,
54
+ },
55
+ ],
56
+ run: (options) => __awaiter(void 0, void 0, void 0, function* () {
57
+ if (!options.hsmCert) {
58
+ throw new Error("You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag");
59
+ }
60
+ let hsmCert;
61
+ try {
62
+ hsmCert = fs_1.default.readFileSync(options.hsmCert);
63
+ }
64
+ catch (_a) {
65
+ throw new Error(`Invalid path for hsmCert: ${options.hsmCert}`);
66
+ }
67
+ const bridge = (0, createHSMBridge_1.default)({
68
+ hsmCert,
69
+ hsmEndpoint: options.hsm,
70
+ hsmCertPassword: options.hsmCertPassword,
71
+ });
72
+ const backup = yield bridge.backupCompartment(options.compartment);
73
+ console.log(JSON.stringify(backup));
74
+ }),
75
+ };
76
+ //# sourceMappingURL=backupCompartment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupCompartment.js","sourceRoot":"","sources":["../../src/commands/backupCompartment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,iGAAyE;AACzE,4CAAoB;AASpB,kBAAe;IACb,OAAO,EAAE,mBAAmB;IAC5B,WAAW,EAAE,6BAA6B;IAC1C,IAAI,EAAE;QACJ;YACE,OAAO,EAAE,mDAAmD;SAC7D;KACF;IACD,OAAO,EAAE;QACP;YACE,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,iDAAiD;YAC9D,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAC9C,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,yCAAyC;YACtD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC5C,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,4DAA4D;YACzE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B;YACpD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,4DAA4D;YACzE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;YACnD,QAAQ,EAAE,IAAI;SACf;KACF;IACD,GAAG,EAAE,CAAO,OAAgB,EAAiB,EAAE;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpB,MAAM,IAAI,KAAK,CACb,qIAAqI,CACtI,CAAC;SACH;QAED,IAAI,OAAe,CAAC;QACpB,IAAI;YACF,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;SAC5C;QAAC,WAAiC;YACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SACjE;QAED,MAAM,MAAM,GAAG,IAAA,yBAAe,EAAC;YAC7B,OAAO;YACP,WAAW,EAAE,OAAO,CAAC,GAAG;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAEnE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtC,CAAC,CAAA;CACF,CAAC"}
@@ -385,6 +385,35 @@ declare const _default: {
385
385
  required?: undefined;
386
386
  })[];
387
387
  run: (options: import("./faucet").FaucetOptions) => Promise<void>;
388
+ } | {
389
+ command: string;
390
+ description: string;
391
+ help: {
392
+ content: string;
393
+ }[];
394
+ options: ({
395
+ name: string;
396
+ alias: string;
397
+ type: NumberConstructor;
398
+ description: string;
399
+ defaultValue: string | undefined;
400
+ required: boolean;
401
+ } | {
402
+ name: string;
403
+ alias: string;
404
+ type: StringConstructor;
405
+ description: string;
406
+ required: boolean;
407
+ defaultValue?: undefined;
408
+ } | {
409
+ name: string;
410
+ type: StringConstructor;
411
+ description: string;
412
+ defaultValue: string | undefined;
413
+ required: boolean;
414
+ alias?: undefined;
415
+ })[];
416
+ run: (options: import("./restoreCompartment").Options) => Promise<void>;
388
417
  } | {
389
418
  command: string;
390
419
  description: string;
@@ -561,6 +590,35 @@ declare const _default: {
561
590
  type: NumberConstructor;
562
591
  })[];
563
592
  run: (options: import("./approve").ApproveOptions) => Promise<void>;
593
+ } | {
594
+ command: string;
595
+ description: string;
596
+ options: ({
597
+ name: string;
598
+ type: BooleanConstructor;
599
+ description: string;
600
+ } | {
601
+ name: string;
602
+ description: string;
603
+ type: StringConstructor;
604
+ } | {
605
+ name: string;
606
+ alias: string;
607
+ type: NumberConstructor;
608
+ description: string;
609
+ defaultValue: number;
610
+ })[];
611
+ subCommands: {
612
+ command: string;
613
+ description: string;
614
+ options: {
615
+ name: string;
616
+ type: NumberConstructor;
617
+ description: string;
618
+ required: boolean;
619
+ }[];
620
+ run: (opts: import("./revoke").RevokeOptions) => Promise<void>;
621
+ }[];
564
622
  } | {
565
623
  command: string;
566
624
  positionals: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DA,wBA+BE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,wBAkCE"}
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const apdu_1 = __importDefault(require("./apdu"));
7
7
  const approve_1 = __importDefault(require("./approve"));
8
+ const backupCompartment_1 = __importDefault(require("./backupCompartment"));
8
9
  const bake_1 = __importDefault(require("./bake"));
9
10
  const bridge_1 = __importDefault(require("./bridge"));
10
11
  const create_1 = __importDefault(require("./create"));
@@ -26,6 +27,8 @@ const receive_1 = __importDefault(require("./receive"));
26
27
  const recipe_1 = __importDefault(require("./recipe"));
27
28
  const registerMigratedUsers_1 = __importDefault(require("./registerMigratedUsers"));
28
29
  const reject_1 = __importDefault(require("./reject"));
30
+ const restoreCompartment_1 = __importDefault(require("./restoreCompartment"));
31
+ const revoke_1 = __importDefault(require("./revoke"));
29
32
  const send_1 = __importDefault(require("./send"));
30
33
  const setQuorum_1 = __importDefault(require("./setQuorum"));
31
34
  const wipe_1 = __importDefault(require("./wipe"));
@@ -75,6 +78,8 @@ exports.default = {
75
78
  faucet_1.default,
76
79
  getAuthToken_1.default,
77
80
  getUserID_1.default,
81
+ backupCompartment_1.default,
82
+ restoreCompartment_1.default,
78
83
  migrate_1.default,
79
84
  registerMigratedUsers_1.default,
80
85
  listen_1.default,
@@ -86,6 +91,7 @@ exports.default = {
86
91
  bridge_1.default,
87
92
  approve_1.default,
88
93
  reject_1.default,
94
+ revoke_1.default,
89
95
  apdu_1.default,
90
96
  getMVInstances_1.default,
91
97
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAiC;AACjC,wDAAuC;AACvC,kDAAiC;AACjC,sDAAqC;AACrC,sDAAqC;AACrC,sDAAqC;AACrC,wDAAuC;AACvC,oDAAmC;AACnC,sDAAqC;AACrC,oDAAmC;AACnC,gDAA+B;AAC/B,kEAAiD;AACjD,sEAAqD;AACrD,0DAAyC;AACzC,4DAA2C;AAC3C,sDAAqC;AACrC,wDAAuC;AACvC,wDAAuC;AACvC,oDAAmC;AACnC,wDAAuC;AACvC,sDAAqC;AACrC,oFAAmE;AACnE,sDAAqC;AACrC,kDAAiC;AACjC,4DAA2C;AAC3C,kDAAiC;AAKjC,MAAM,IAAI,GAAG;IACX;QACE,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE;YACP,uDAAuD;YACvD,EAAE;YACF,yCAAyC;SAC1C;KACF;CACF,CAAC;AAEF,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,cAAc;KAC5B;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,WAAW;KACzB;CACF,CAAC;AAEF,kBAAe;IACb,IAAI;IACJ,OAAO;IACP,WAAW,EAAE;QACX,iBAAc;QACd,cAAW;QACX,gBAAa;QACb,cAAW;QACX,gBAAa;QACb,iBAAc;QACd,gBAAa;QACb,mBAAgB;QAChB,aAAU;QACV,eAAY;QACZ,gBAAa;QACb,sBAAmB;QACnB,mBAAgB;QAChB,iBAAc;QACd,+BAA4B;QAC5B,gBAAa;QACb,kBAAe;QACf,eAAY;QACZ,cAAW;QACX,iBAAc;QACd,eAAY;QACZ,gBAAa;QACb,iBAAc;QACd,gBAAa;QACb,cAAW;QACX,wBAAqB;KACtB;CACF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":";;;;;AAAA,kDAAiC;AACjC,wDAAuC;AACvC,4EAA2D;AAC3D,kDAAiC;AACjC,sDAAqC;AACrC,sDAAqC;AACrC,sDAAqC;AACrC,wDAAuC;AACvC,oDAAmC;AACnC,sDAAqC;AACrC,oDAAmC;AACnC,gDAA+B;AAC/B,kEAAiD;AACjD,sEAAqD;AACrD,0DAAyC;AACzC,4DAA2C;AAC3C,sDAAqC;AACrC,wDAAuC;AACvC,wDAAuC;AACvC,oDAAmC;AACnC,wDAAuC;AACvC,sDAAqC;AACrC,oFAAmE;AACnE,sDAAqC;AACrC,8EAA6D;AAC7D,sDAAqC;AACrC,kDAAiC;AACjC,4DAA2C;AAC3C,kDAAiC;AAKjC,MAAM,IAAI,GAAG;IACX;QACE,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE;YACP,uDAAuD;YACvD,EAAE;YACF,yCAAyC;SAC1C;KACF;CACF,CAAC;AAEF,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,sBAAsB;KACpC;IACD;QACE,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,cAAc;KAC5B;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,WAAW;KACzB;CACF,CAAC;AAEF,kBAAe;IACb,IAAI;IACJ,OAAO;IACP,WAAW,EAAE;QACX,iBAAc;QACd,cAAW;QACX,gBAAa;QACb,cAAW;QACX,gBAAa;QACb,iBAAc;QACd,gBAAa;QACb,mBAAgB;QAChB,aAAU;QACV,eAAY;QACZ,gBAAa;QACb,sBAAmB;QACnB,mBAAgB;QAChB,2BAAwB;QACxB,4BAAyB;QACzB,iBAAc;QACd,+BAA4B;QAC5B,gBAAa;QACb,kBAAe;QACf,eAAY;QACZ,cAAW;QACX,iBAAc;QACd,eAAY;QACZ,gBAAa;QACb,iBAAc;QACd,gBAAa;QACb,gBAAa;QACb,cAAW;QACX,wBAAqB;KACtB;CACF,CAAC"}
@@ -0,0 +1,39 @@
1
+ export declare type Options = {
2
+ compartment: number;
3
+ hsm: string;
4
+ hsmCert: string;
5
+ hsmCertPassword: string;
6
+ backupFile: string;
7
+ };
8
+ declare const _default: {
9
+ command: string;
10
+ description: string;
11
+ help: {
12
+ content: string;
13
+ }[];
14
+ options: ({
15
+ name: string;
16
+ alias: string;
17
+ type: NumberConstructor;
18
+ description: string;
19
+ defaultValue: string | undefined;
20
+ required: boolean;
21
+ } | {
22
+ name: string;
23
+ alias: string;
24
+ type: StringConstructor;
25
+ description: string;
26
+ required: boolean;
27
+ defaultValue?: undefined;
28
+ } | {
29
+ name: string;
30
+ type: StringConstructor;
31
+ description: string;
32
+ defaultValue: string | undefined;
33
+ required: boolean;
34
+ alias?: undefined;
35
+ })[];
36
+ run: (options: Options) => Promise<void>;
37
+ };
38
+ export default _default;
39
+ //# sourceMappingURL=restoreCompartment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restoreCompartment.d.ts","sourceRoot":"","sources":["../../src/commands/restoreCompartment.ts"],"names":[],"mappings":"AAKA,oBAAY,OAAO,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAgDqB,OAAO,KAAG,QAAQ,IAAI,CAAC;;AA9C9C,wBAuEE"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const createHSMBridge_1 = __importDefault(require("@ledgerhq/vault-common/lib/createHSMBridge"));
16
+ const fs_1 = __importDefault(require("fs"));
17
+ const logger_1 = __importDefault(require("../logger"));
18
+ exports.default = {
19
+ command: "restoreCompartment",
20
+ description: "Restore HSM simu compartment",
21
+ help: [
22
+ {
23
+ content: "{grey $} ledger-vault restoreCompartment --cid 123 --backupFile backup.json",
24
+ },
25
+ ],
26
+ options: [
27
+ {
28
+ name: "compartment",
29
+ alias: "c",
30
+ type: Number,
31
+ description: "HSM compartment ID {blue $VAULT_COMPARTMENT_ID}",
32
+ defaultValue: process.env.VAULT_COMPARTMENT_ID,
33
+ required: true,
34
+ },
35
+ {
36
+ name: "backupFile",
37
+ alias: "b",
38
+ type: String,
39
+ description: "Location of the backup file (output of ledger-vault backupCompartment)",
40
+ required: true,
41
+ },
42
+ {
43
+ name: "hsm",
44
+ type: String,
45
+ description: "HSM endpoint {blue $VAULT_HSM_ENDPOINT}",
46
+ defaultValue: process.env.VAULT_HSM_ENDPOINT,
47
+ required: true,
48
+ },
49
+ {
50
+ name: "hsmCert",
51
+ type: String,
52
+ description: "Path to HSM certificate {blue $VAULT_HSM_CLIENT_CERT_PATH}",
53
+ defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PATH,
54
+ required: true,
55
+ },
56
+ {
57
+ name: "hsmCertPassword",
58
+ type: String,
59
+ description: "HSM certificate password {blue $VAULT_HSM_CLIENT_CERT_PWD}",
60
+ defaultValue: process.env.VAULT_HSM_CLIENT_CERT_PWD,
61
+ required: true,
62
+ },
63
+ ],
64
+ run: (options) => __awaiter(void 0, void 0, void 0, function* () {
65
+ if (!options.hsmCert) {
66
+ throw new Error("You must specify the path to your HSM certificate in your environment variable VAULT_HSM_CLIENT_CERT_PATH or use the --hsmCert flag");
67
+ }
68
+ let hsmCert;
69
+ try {
70
+ hsmCert = fs_1.default.readFileSync(options.hsmCert);
71
+ }
72
+ catch (_a) {
73
+ throw new Error(`Invalid path for hsmCert: ${options.hsmCert}`);
74
+ }
75
+ const bridge = (0, createHSMBridge_1.default)({
76
+ hsmCert,
77
+ hsmEndpoint: options.hsm,
78
+ hsmCertPassword: options.hsmCertPassword,
79
+ });
80
+ const fileContent = fs_1.default.readFileSync(options.backupFile, "utf-8");
81
+ const backup = JSON.parse(fileContent);
82
+ yield bridge.restoreCompartment(options.compartment, backup, { logger: logger_1.default });
83
+ }),
84
+ };
85
+ //# sourceMappingURL=restoreCompartment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restoreCompartment.js","sourceRoot":"","sources":["../../src/commands/restoreCompartment.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,iGAAyE;AACzE,4CAAoB;AAEpB,uDAA+B;AAU/B,kBAAe;IACb,OAAO,EAAE,oBAAoB;IAC7B,WAAW,EAAE,8BAA8B;IAC3C,IAAI,EAAE;QACJ;YACE,OAAO,EAAE,6EAA6E;SACvF;KACF;IACD,OAAO,EAAE;QACP;YACE,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,iDAAiD;YAC9D,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAC9C,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,wEAAwE;YACrF,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,yCAAyC;YACtD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;YAC5C,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,4DAA4D;YACzE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,0BAA0B;YACpD,QAAQ,EAAE,IAAI;SACf;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,4DAA4D;YACzE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;YACnD,QAAQ,EAAE,IAAI;SACf;KACF;IACD,GAAG,EAAE,CAAO,OAAgB,EAAiB,EAAE;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpB,MAAM,IAAI,KAAK,CACb,qIAAqI,CACtI,CAAC;SACH;QAED,IAAI,OAAe,CAAC;QACpB,IAAI;YACF,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;SAC5C;QAAC,WAAiC;YACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SACjE;QAED,MAAM,MAAM,GAAG,IAAA,yBAAe,EAAC;YAC7B,OAAO;YACP,WAAW,EAAE,OAAO,CAAC,GAAG;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEvC,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,MAAM,EAAN,gBAAM,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAA;CACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { GateOptions } from "../types";
2
+ export declare type RevokeOptions = GateOptions & {
3
+ command: "user" | "group";
4
+ device: number;
5
+ id: number;
6
+ noApproval: boolean;
7
+ };
8
+ export declare const revokeEntity: (opts: RevokeOptions) => Promise<void>;
9
+ declare const _default: {
10
+ command: string;
11
+ description: string;
12
+ options: ({
13
+ name: string;
14
+ type: BooleanConstructor;
15
+ description: string;
16
+ } | {
17
+ name: string;
18
+ description: string;
19
+ type: StringConstructor;
20
+ } | {
21
+ name: string;
22
+ alias: string;
23
+ type: NumberConstructor;
24
+ description: string;
25
+ defaultValue: number;
26
+ })[];
27
+ subCommands: {
28
+ command: string;
29
+ description: string;
30
+ options: {
31
+ name: string;
32
+ type: NumberConstructor;
33
+ description: string;
34
+ required: boolean;
35
+ }[];
36
+ run: (opts: RevokeOptions) => Promise<void>;
37
+ }[];
38
+ };
39
+ export default _default;
40
+ //# sourceMappingURL=revoke.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke.d.ts","sourceRoot":"","sources":["../../src/commands/revoke.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,oBAAY,aAAa,GAAG,WAAW,GAAG;IACxC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,YAAY,SAAgB,aAAa,KAAG,QAAQ,IAAI,CAsBpE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,wBAwCE"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.revokeEntity = void 0;
16
+ const vault_common_1 = require("@ledgerhq/vault-common");
17
+ const deviceOption_1 = __importDefault(require("../deviceOption"));
18
+ const gateOptions_1 = __importDefault(require("../gateOptions"));
19
+ const logger_1 = __importDefault(require("../logger"));
20
+ const revokeEntity = (opts) => __awaiter(void 0, void 0, void 0, function* () {
21
+ const pool = (0, vault_common_1.createDevicesPool)(Object.assign(Object.assign({}, opts), { deviceAPIURL: opts.deviceAPI }));
22
+ const userDevice = yield pool.login(opts.device);
23
+ let request;
24
+ if (opts.command === "user") {
25
+ logger_1.default.info(`Revoking user ${opts.id}`);
26
+ request = yield userDevice.post("/requests", { type: "REVOKE_USER", user_id: opts.id });
27
+ }
28
+ if (opts.command === "group") {
29
+ logger_1.default.info(`Revoking group ${opts.id}`);
30
+ request = yield userDevice.post("/requests", { type: "REVOKE_GROUP", group_id: opts.id });
31
+ }
32
+ if (opts.noApproval)
33
+ return;
34
+ logger_1.default.info("Approving request...");
35
+ yield pool.getOnboardingAdminDevices();
36
+ yield pool.runWithQuorum((admin) => admin.approveRequest(request));
37
+ });
38
+ exports.revokeEntity = revokeEntity;
39
+ exports.default = {
40
+ command: "revoke",
41
+ description: "Revoke user or group",
42
+ options: [
43
+ ...gateOptions_1.default,
44
+ deviceOption_1.default,
45
+ {
46
+ name: "noApproval",
47
+ type: Boolean,
48
+ description: "Create the request without approving it",
49
+ },
50
+ ],
51
+ subCommands: [
52
+ {
53
+ command: "user",
54
+ description: "Revoke user",
55
+ options: [
56
+ {
57
+ name: "id",
58
+ type: Number,
59
+ description: "User ID",
60
+ required: true,
61
+ },
62
+ ],
63
+ run: exports.revokeEntity,
64
+ },
65
+ {
66
+ command: "group",
67
+ description: "Revoke group",
68
+ options: [
69
+ {
70
+ name: "id",
71
+ type: Number,
72
+ description: "Group ID",
73
+ required: true,
74
+ },
75
+ ],
76
+ run: exports.revokeEntity,
77
+ },
78
+ ],
79
+ };
80
+ //# sourceMappingURL=revoke.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revoke.js","sourceRoot":"","sources":["../../src/commands/revoke.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yDAA2D;AAE3D,mEAA2C;AAC3C,iEAAyC;AACzC,uDAA+B;AAUxB,MAAM,YAAY,GAAG,CAAO,IAAmB,EAAiB,EAAE;IACvE,MAAM,IAAI,GAAG,IAAA,gCAAiB,kCAAM,IAAI,KAAE,YAAY,EAAE,IAAI,CAAC,SAAS,IAAG,CAAC;IAC1E,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,OAAY,CAAC;IACjB,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE;QAC3B,gBAAM,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;KACzF;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE;QAC5B,gBAAM,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;KAC3F;IAED,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO;IAE5B,gBAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAEvC,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;AACrE,CAAC,CAAA,CAAC;AAtBW,QAAA,YAAY,gBAsBvB;AAEF,kBAAe;IACb,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,sBAAsB;IACnC,OAAO,EAAE;QACP,GAAG,qBAAW;QACd,sBAAY;QACZ;YACE,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,yCAAyC;SACvD;KACF;IACD,WAAW,EAAE;QACX;YACE,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,SAAS;oBACtB,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,GAAG,EAAE,oBAAY;SAClB;QACD;YACE,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,MAAM;oBACZ,WAAW,EAAE,UAAU;oBACvB,QAAQ,EAAE,IAAI;iBACf;aACF;YACD,GAAG,EAAE,oBAAY;SAClB;KACF;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ledgerhq/vault-cli",
3
- "version": "1.14.2",
3
+ "version": "1.16.0",
4
4
  "description": "A various utility command-line for Vault development",
5
5
  "homepage": "https://github.com/LedgerHQ/vault-ts",
6
6
  "license": "BSD-2-Clause",
@@ -18,7 +18,7 @@
18
18
  "@ledgerhq/cryptoassets": "^6.28.2",
19
19
  "@ledgerhq/hw-transport-node-hid": "^6.24.1",
20
20
  "@ledgerhq/live-common-stub": "1.4.6",
21
- "@ledgerhq/vault-common": "1.16.0",
21
+ "@ledgerhq/vault-common": "1.17.0",
22
22
  "axios": "^0.21.0",
23
23
  "bignumber.js": "^9.0.1",
24
24
  "body-parser": "^1.19.0",