From 2f33fd85361ede18cba2bd0c546665237b51968e Mon Sep 17 00:00:00 2001 From: addievo Date: Wed, 25 Oct 2023 14:41:03 +1100 Subject: [PATCH] feat: updating identities claim to be in-line with identities discover and identities --- package-lock.json | 8 +-- package.json | 2 +- src/identities/CommandClaim.ts | 113 ++++++++++++++++----------------- src/utils/parsers.ts | 17 +++++ tests/identities/claim.test.ts | 13 ++-- 5 files changed, 86 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d8d25ab..53705b5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "nexpect": "^0.6.0", "node-gyp-build": "^4.4.0", "nodemon": "^3.0.1", - "polykey": "^1.2.1-alpha.17", + "polykey": "^1.2.1-alpha.19", "prettier": "^3.0.0", "shelljs": "^0.8.5", "shx": "^0.3.4", @@ -7429,9 +7429,9 @@ } }, "node_modules/polykey": { - "version": "1.2.1-alpha.17", - "resolved": "https://registry.npmjs.org/polykey/-/polykey-1.2.1-alpha.17.tgz", - "integrity": "sha512-oj9+ZPKeq//nRg4FZGY0yBIBfliGycJqV66gneFqk6fYOpD4hp/ltlvpgR73CHzHrvARbEQFDU7rHnw5HUY/fQ==", + "version": "1.2.1-alpha.19", + "resolved": "https://registry.npmjs.org/polykey/-/polykey-1.2.1-alpha.19.tgz", + "integrity": "sha512-V2NrX+juze5aAKZ5s43pVBmBr4qZmRPUSIPUa4kpW1xME8Snl+QMTOTn6j0UXovnZ0xxXsvl65ZDmSTIa4iKog==", "dev": true, "dependencies": { "@matrixai/async-cancellable": "^1.1.1", diff --git a/package.json b/package.json index b6c30767..7385db88 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "@matrixai/errors": "^1.2.0", "@matrixai/logger": "^3.1.0", "commander": "^8.3.0", - "polykey": "^1.2.1-alpha.17", + "polykey": "^1.2.1-alpha.19", "threads": "^1.6.5", "@swc/core": "1.3.82", "@swc/jest": "^0.2.29", diff --git a/src/identities/CommandClaim.ts b/src/identities/CommandClaim.ts index 4bfb81a3..0c70f0ca 100644 --- a/src/identities/CommandClaim.ts +++ b/src/identities/CommandClaim.ts @@ -1,4 +1,5 @@ import type PolykeyClient from 'polykey/dist/PolykeyClient'; +import type { ProviderIdentityId } from 'polykey/dist/ids'; import CommandPolykey from '../CommandPolykey'; import * as binUtils from '../utils'; import * as binOptions from '../utils/options'; @@ -11,71 +12,69 @@ class CommandClaim extends CommandPolykey { this.name('claim'); this.description('Claim a Digital Identity for this Keynode'); this.argument( - '', + '', 'Name of the digital identity provider', - binParsers.parseProviderId, - ); - this.argument( - '', - 'Digital identity to claim', - binParsers.parseIdentityId, + binParsers.parseGestaltIdentityId, ); this.addOption(binOptions.nodeId); this.addOption(binOptions.clientHost); this.addOption(binOptions.clientPort); - this.action(async (providerId, identityId, options) => { - const { default: PolykeyClient } = await import( - 'polykey/dist/PolykeyClient' - ); - const clientOptions = await binProcessors.processClientOptions( - options.nodePath, - options.nodeId, - options.clientHost, - options.clientPort, - this.fs, - this.logger.getChild(binProcessors.processClientOptions.name), - ); - const auth = await binProcessors.processAuthentication( - options.passwordFile, - this.fs, - ); - let pkClient: PolykeyClient; - this.exitHandlers.handlers.push(async () => { - if (pkClient != null) await pkClient.stop(); - }); - try { - pkClient = await PolykeyClient.createPolykeyClient({ - nodeId: clientOptions.nodeId, - host: clientOptions.clientHost, - port: clientOptions.clientPort, - options: { - nodePath: options.nodePath, - }, - logger: this.logger.getChild(PolykeyClient.name), + this.action( + async (providerIdentityId: ['identity', ProviderIdentityId], options) => { + const { default: PolykeyClient } = await import( + 'polykey/dist/PolykeyClient' + ); + const clientOptions = await binProcessors.processClientOptions( + options.nodePath, + options.nodeId, + options.clientHost, + options.clientPort, + this.fs, + this.logger.getChild(binProcessors.processClientOptions.name), + ); + const auth = await binProcessors.processAuthentication( + options.passwordFile, + this.fs, + ); + let pkClient: PolykeyClient; + this.exitHandlers.handlers.push(async () => { + if (pkClient != null) await pkClient.stop(); }); - const claimMessage = await binUtils.retryAuthentication( - (auth) => - pkClient.rpcClient.methods.identitiesClaim({ - metadata: auth, - providerId: providerId, - identityId: identityId, + try { + pkClient = await PolykeyClient.createPolykeyClient({ + nodeId: clientOptions.nodeId, + host: clientOptions.clientHost, + port: clientOptions.clientPort, + options: { + nodePath: options.nodePath, + }, + logger: this.logger.getChild(PolykeyClient.name), + }); + const [providerId, identityId] = providerIdentityId[1]; + const claimMessage = await binUtils.retryAuthentication( + (auth) => + pkClient.rpcClient.methods.identitiesClaim({ + metadata: auth, + providerId: providerId, + identityId: identityId, + }), + auth, + ); + const output = [`Claim Id: ${claimMessage.claimId}`]; + if (claimMessage.url) { + output.push(`Url: ${claimMessage.url}`); + } + process.stdout.write( + binUtils.outputFormatter({ + type: options.format === 'json' ? 'json' : 'list', + data: output, }), - auth, - ); - const output = [`Claim Id: ${claimMessage.claimId}`]; - if (claimMessage.url) { - output.push(`Url: ${claimMessage.url}`); + ); + } finally { + if (pkClient! != null) await pkClient.stop(); } - process.stdout.write( - binUtils.outputFormatter({ - type: options.format === 'json' ? 'json' : 'list', - data: output, - }), - ); - } finally { - if (pkClient! != null) await pkClient.stop(); - } - }); + }, + ); } } diff --git a/src/utils/parsers.ts b/src/utils/parsers.ts index 7afe1951..73e98348 100644 --- a/src/utils/parsers.ts +++ b/src/utils/parsers.ts @@ -78,36 +78,52 @@ function parseSecretPath(secretPath: string): [string, string, string?] { const parseInteger: (data: string) => number = validateParserToArgParser( validationUtils.parseInteger, ); + const parseNumber: (data: string) => number = validateParserToArgParser( validationUtils.parseNumber, ); + const parseNodeId: (data: string) => ids.NodeId = validateParserToArgParser( ids.parseNodeId, ); + const parseGestaltId: (data: string) => ids.GestaltId = validateParserToArgParser(ids.parseGestaltId); + +const parseGestaltIdentityId: (data: string) => ids.GestaltId = + validateParserToArgParser(ids.parseGestaltIdentityId); + const parseProviderId: (data: string) => ids.ProviderId = validateParserToArgParser(ids.parseProviderId); + const parseIdentityId: (data: string) => ids.IdentityId = validateParserToArgParser(ids.parseIdentityId); + const parseProviderIdList: (data: string) => ids.ProviderId[] = validateParserToArgListParser(ids.parseProviderId); + const parseGestaltAction: (data: string) => 'notify' | 'scan' | 'claim' = validateParserToArgParser(gestaltsUtils.parseGestaltAction); + const parseHost: (data: string) => Host = validateParserToArgParser( networkUtils.parseHost, ); + const parseHostname: (data: string) => Hostname = validateParserToArgParser( networkUtils.parseHostname, ); + const parseHostOrHostname: (data: string) => Host | Hostname = validateParserToArgParser(networkUtils.parseHostOrHostname); + const parsePort: (data: string) => Port = validateParserToArgParser( networkUtils.parsePort, ); + const parseNetwork: (data: string) => SeedNodes = validateParserToArgParser( nodesUtils.parseNetwork, ); + const parseSeedNodes: (data: string) => [SeedNodes, boolean] = validateParserToArgParser(nodesUtils.parseSeedNodes); @@ -120,6 +136,7 @@ export { parseNumber, parseNodeId, parseGestaltId, + parseGestaltIdentityId, parseGestaltAction, parseHost, parseHostname, diff --git a/tests/identities/claim.test.ts b/tests/identities/claim.test.ts index bd627fba..91ff4a22 100644 --- a/tests/identities/claim.test.ts +++ b/tests/identities/claim.test.ts @@ -81,8 +81,7 @@ describe('claim', () => { [ 'identities', 'claim', - testToken.providerId, - testToken.identityId, + `${testToken.providerId}:${testToken.identityId}`, '--format', 'json', ], @@ -110,7 +109,11 @@ describe('claim', () => { 'cannot claim unauthenticated identities', async () => { const { exitCode } = await testUtils.pkStdio( - ['identities', 'claim', testToken.providerId, testToken.identityId], + [ + 'identities', + 'claim', + `${testToken.providerId}:${testToken.identityId}`, + ], { env: { PK_NODE_PATH: nodePath, @@ -128,7 +131,7 @@ describe('claim', () => { let exitCode; // Invalid provider ({ exitCode } = await testUtils.pkStdio( - ['identities', 'claim', '', testToken.identityId], + ['identities', 'claim', `:${testToken.identityId}`], { env: { PK_NODE_PATH: nodePath, @@ -140,7 +143,7 @@ describe('claim', () => { expect(exitCode).toBe(sysexits.USAGE); // Invalid identity ({ exitCode } = await testUtils.pkStdio( - ['identities', 'claim', testToken.providerId, ''], + ['identities', 'claim', `${testToken.providerId}:`], { env: { PK_NODE_PATH: nodePath,