@twin.org/node-core 0.0.3-next.53 → 0.0.3-next.55
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/dist/es/builders/engineEnvBuilder.js +52 -10
- package/dist/es/builders/engineEnvBuilder.js.map +1 -1
- package/dist/es/builders/engineServerEnvBuilder.js +32 -32
- package/dist/es/builders/engineServerEnvBuilder.js.map +1 -1
- package/dist/es/builders/extensionsBuilder.js +3 -3
- package/dist/es/builders/extensionsBuilder.js.map +1 -1
- package/dist/es/cli.js +6 -3
- package/dist/es/cli.js.map +1 -1
- package/dist/es/commands/bootstrapLegacy.js +173 -116
- package/dist/es/commands/bootstrapLegacy.js.map +1 -1
- package/dist/es/commands/help.js +1 -0
- package/dist/es/commands/help.js.map +1 -1
- package/dist/es/commands/identityCreate.js +38 -16
- package/dist/es/commands/identityCreate.js.map +1 -1
- package/dist/es/commands/identityImports.js +1 -0
- package/dist/es/commands/identityImports.js.map +1 -1
- package/dist/es/commands/identityVerificationMethodCreate.js +13 -11
- package/dist/es/commands/identityVerificationMethodCreate.js.map +1 -1
- package/dist/es/commands/identityVerificationMethodImport.js +2 -1
- package/dist/es/commands/identityVerificationMethodImport.js.map +1 -1
- package/dist/es/commands/nodeSetIdentity.js +5 -0
- package/dist/es/commands/nodeSetIdentity.js.map +1 -1
- package/dist/es/commands/removeTenantOrgAlias.js +3 -1
- package/dist/es/commands/removeTenantOrgAlias.js.map +1 -1
- package/dist/es/commands/setNodeOrgId.js +2 -0
- package/dist/es/commands/setNodeOrgId.js.map +1 -1
- package/dist/es/commands/setTenantOrgId.js +7 -66
- package/dist/es/commands/setTenantOrgId.js.map +1 -1
- package/dist/es/commands/tenantCreate.js +1 -7
- package/dist/es/commands/tenantCreate.js.map +1 -1
- package/dist/es/commands/tenantImport.js +17 -4
- package/dist/es/commands/tenantImport.js.map +1 -1
- package/dist/es/commands/tenantUpdate.js +21 -6
- package/dist/es/commands/tenantUpdate.js.map +1 -1
- package/dist/es/commands/vaultKeyImport.js +4 -3
- package/dist/es/commands/vaultKeyImport.js.map +1 -1
- package/dist/es/defaults.js +21 -0
- package/dist/es/defaults.js.map +1 -1
- package/dist/es/models/ICliArgs.js.map +1 -1
- package/dist/es/models/ICliCommand.js.map +1 -1
- package/dist/es/models/ICliCommandDefinition.js.map +1 -1
- package/dist/es/models/ICliCommandDefinitionParam.js.map +1 -1
- package/dist/es/models/IEngineEnvironmentVariables.js.map +1 -1
- package/dist/es/models/IEngineServerEnvironmentVariables.js.map +1 -1
- package/dist/es/models/nodeExtensionInitialiseEngineMethod.js.map +1 -1
- package/dist/es/models/nodeExtensionInitialiseEngineServerMethod.js.map +1 -1
- package/dist/es/models/nodeExtensionInitialiseMethod.js.map +1 -1
- package/dist/es/models/nodeExtensionShutdownMethod.js.map +1 -1
- package/dist/es/node.js +1 -1
- package/dist/es/node.js.map +1 -1
- package/dist/es/start.js +11 -13
- package/dist/es/start.js.map +1 -1
- package/dist/es/utils.js +5 -4
- package/dist/es/utils.js.map +1 -1
- package/dist/types/builders/engineEnvBuilder.d.ts +4 -4
- package/dist/types/builders/extensionsBuilder.d.ts +3 -3
- package/dist/types/cli.d.ts +2 -2
- package/dist/types/commands/bootstrapLegacy.d.ts +8 -7
- package/dist/types/commands/help.d.ts +1 -0
- package/dist/types/commands/identityCreate.d.ts +2 -0
- package/dist/types/commands/identityImports.d.ts +1 -0
- package/dist/types/commands/identityVerificationMethodImport.d.ts +2 -1
- package/dist/types/commands/nodeSetIdentity.d.ts +1 -0
- package/dist/types/commands/removeTenantOrgAlias.d.ts +2 -0
- package/dist/types/commands/setNodeOrgId.d.ts +2 -0
- package/dist/types/commands/setTenantOrgId.d.ts +5 -22
- package/dist/types/commands/tenantImport.d.ts +7 -4
- package/dist/types/commands/tenantUpdate.d.ts +5 -2
- package/dist/types/commands/vaultKeyImport.d.ts +4 -3
- package/dist/types/defaults.d.ts +21 -0
- package/dist/types/models/ICliArgs.d.ts +1 -1
- package/dist/types/models/ICliCommand.d.ts +1 -1
- package/dist/types/models/ICliCommandDefinition.d.ts +2 -2
- package/dist/types/models/ICliCommandDefinitionParam.d.ts +1 -1
- package/dist/types/models/IEngineEnvironmentVariables.d.ts +0 -4
- package/dist/types/models/IEngineServerEnvironmentVariables.d.ts +4 -0
- package/dist/types/models/nodeExtensionInitialiseEngineMethod.d.ts +1 -0
- package/dist/types/models/nodeExtensionInitialiseEngineServerMethod.d.ts +1 -0
- package/dist/types/models/nodeExtensionInitialiseMethod.d.ts +1 -0
- package/dist/types/models/nodeExtensionShutdownMethod.d.ts +1 -0
- package/dist/types/utils.d.ts +4 -3
- package/docs/changelog.md +15 -0
- package/docs/reference/functions/extensionsInitialiseEngine.md +1 -1
- package/docs/reference/functions/extensionsInitialiseEngineServer.md +1 -1
- package/docs/reference/functions/getScriptDirectory.md +1 -1
- package/docs/reference/functions/initialiseLocales.md +2 -0
- package/docs/reference/functions/isFederatedCatalogueRequired.md +3 -3
- package/docs/reference/functions/isRightsManagementRequired.md +1 -1
- package/docs/reference/functions/loadJsonFile.md +1 -1
- package/docs/reference/functions/loadTextFile.md +1 -1
- package/docs/reference/functions/processEnvOptions.md +1 -1
- package/docs/reference/functions/registerCommands.md +1 -1
- package/docs/reference/functions/shutdownExtensions.md +1 -1
- package/docs/reference/interfaces/ICliArgs.md +1 -1
- package/docs/reference/interfaces/ICliCommand.md +1 -1
- package/docs/reference/interfaces/ICliCommandDefinition.md +2 -2
- package/docs/reference/interfaces/ICliCommandDefinitionParam.md +1 -1
- package/docs/reference/interfaces/IEngineEnvironmentVariables.md +0 -8
- package/docs/reference/interfaces/IEngineServerEnvironmentVariables.md +8 -12
- package/docs/reference/interfaces/INodeEnvironmentVariables.md +12 -12
- package/docs/reference/type-aliases/NodeExtensionInitialiseEngineMethod.md +2 -0
- package/docs/reference/type-aliases/NodeExtensionInitialiseEngineServerMethod.md +2 -0
- package/docs/reference/type-aliases/NodeExtensionInitialiseMethod.md +2 -0
- package/docs/reference/type-aliases/NodeExtensionShutdownMethod.md +2 -0
- package/docs/reference/variables/ATTESTATION_VERIFICATION_METHOD_ID.md +2 -0
- package/docs/reference/variables/AUTH_SIGNING_KEY_ID.md +2 -0
- package/docs/reference/variables/BLOB_STORAGE_ENCRYPTION_KEY_ID.md +2 -0
- package/docs/reference/variables/CONTEXT_ID_HANDLER_FEATURE_DID.md +2 -0
- package/docs/reference/variables/CONTEXT_ID_HANDLER_FEATURE_TENANT.md +2 -0
- package/docs/reference/variables/IMMUTABLE_PROOF_VERIFICATION_METHOD_ID.md +2 -0
- package/docs/reference/variables/TRUST_VERIFICATION_METHOD_ID.md +2 -0
- package/locales/en.json +17 -9
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ import { EntityStorageConnectorFactory } from "@twin.org/entity-storage-models";
|
|
|
8
8
|
import { Did, IdentityConnectorFactory, IdentityResolverConnectorFactory } from "@twin.org/identity-models";
|
|
9
9
|
import { VaultConnectorFactory } from "@twin.org/vault-models";
|
|
10
10
|
import { WalletConnectorFactory } from "@twin.org/wallet-models";
|
|
11
|
+
import { nodeSetIdentity } from "./nodeSetIdentity.js";
|
|
11
12
|
import { applyOrganizationIdToTenant } from "./setTenantOrgId.js";
|
|
12
13
|
const COMMAND_NAME = "identity-create";
|
|
13
14
|
/**
|
|
@@ -80,6 +81,13 @@ export function getCommandDefinitionIdentityCreate(commandDefinitions) {
|
|
|
80
81
|
description: I18n.formatMessage("node.cli.commands.identity-create.params.output-env-prefix.description"),
|
|
81
82
|
required: false
|
|
82
83
|
},
|
|
84
|
+
{
|
|
85
|
+
key: "node-id",
|
|
86
|
+
type: "boolean",
|
|
87
|
+
description: I18n.formatMessage("node.cli.commands.identity-create.params.node-id.description"),
|
|
88
|
+
required: false,
|
|
89
|
+
defaultValue: false
|
|
90
|
+
},
|
|
83
91
|
{
|
|
84
92
|
key: "node-organization-id",
|
|
85
93
|
type: "boolean",
|
|
@@ -107,6 +115,7 @@ export function getCommandDefinitionIdentityCreate(commandDefinitions) {
|
|
|
107
115
|
* @param params.identity The DID of the identity to create.
|
|
108
116
|
* @param params.controller The controller DID for the identity.
|
|
109
117
|
* @param params.fundWallet Whether to fund the wallet associated with the identity from a faucet.
|
|
118
|
+
* @param params.nodeId If true, set the created DID as the node identity.
|
|
110
119
|
* @param params.nodeOrganizationId If true, set the created DID as the node organization ID.
|
|
111
120
|
* @param params.tenantOrganizationId The tenant ID to set the created DID as the organization ID for.
|
|
112
121
|
* @param params.outputJson The output .json file to store the command output.
|
|
@@ -115,6 +124,12 @@ export function getCommandDefinitionIdentityCreate(commandDefinitions) {
|
|
|
115
124
|
* @returns The identity details.
|
|
116
125
|
*/
|
|
117
126
|
export async function identityCreate(engineCore, envVars, params) {
|
|
127
|
+
const assignmentCount = (params.nodeId ? 1 : 0) +
|
|
128
|
+
(params.nodeOrganizationId ? 1 : 0) +
|
|
129
|
+
(Is.stringValue(params.tenantOrganizationId) ? 1 : 0);
|
|
130
|
+
if (assignmentCount > 1) {
|
|
131
|
+
throw new GeneralError("identityCreate", "onlyOneAssignmentOptionAllowed");
|
|
132
|
+
}
|
|
118
133
|
let workingIdentity = params?.identity;
|
|
119
134
|
let tempIdentity;
|
|
120
135
|
if (!Is.stringValue(workingIdentity)) {
|
|
@@ -140,6 +155,9 @@ export async function identityCreate(engineCore, envVars, params) {
|
|
|
140
155
|
await mnemonicFinalise(vaultConnector, tempIdentity, workingIdentity);
|
|
141
156
|
await walletFinalise(engineCore, workingIdentity, walletAddress);
|
|
142
157
|
}
|
|
158
|
+
if (params.nodeId) {
|
|
159
|
+
await nodeSetIdentity(engineCore, envVars, { identity: workingIdentity });
|
|
160
|
+
}
|
|
143
161
|
if (params.nodeOrganizationId) {
|
|
144
162
|
if (Coerce.boolean(envVars.tenantEnabled)) {
|
|
145
163
|
throw new GeneralError("identityCreate", "nodeOrganizationIdNotAvailableInMultiTenantMode");
|
|
@@ -151,9 +169,11 @@ export async function identityCreate(engineCore, envVars, params) {
|
|
|
151
169
|
if (Is.stringValue(params.tenantOrganizationId)) {
|
|
152
170
|
await applyOrganizationIdToTenant(engineCore, params.tenantOrganizationId, workingIdentity);
|
|
153
171
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
172
|
+
if (mnemonicStored) {
|
|
173
|
+
CLIDisplay.break();
|
|
174
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-create.labels.mnemonic"), mnemonicResult.mnemonic);
|
|
175
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-create.labels.did"), workingIdentity);
|
|
176
|
+
}
|
|
157
177
|
if (Is.stringValue(envVars.iotaExplorerEndpoint) &&
|
|
158
178
|
envVars.identityConnector === IdentityConnectorType.Iota) {
|
|
159
179
|
const idParts = Did.parse(workingIdentity);
|
|
@@ -239,8 +259,9 @@ async function mnemonicCreate(vaultConnector, identity, providedMnemonic) {
|
|
|
239
259
|
/**
|
|
240
260
|
* Finalise the mnemonic for the node identity.
|
|
241
261
|
* @param vaultConnector The vault connector to use.
|
|
242
|
-
* @param tempIdentity The identity
|
|
243
|
-
* @param identity The final identity
|
|
262
|
+
* @param tempIdentity The temporary identity used during creation.
|
|
263
|
+
* @param identity The final resolved identity.
|
|
264
|
+
* @returns A promise that resolves when the mnemonic has been migrated to the final identity key.
|
|
244
265
|
*/
|
|
245
266
|
async function mnemonicFinalise(vaultConnector, tempIdentity, identity) {
|
|
246
267
|
// Now that we have an identity we can remove the temporary one
|
|
@@ -257,10 +278,10 @@ async function mnemonicFinalise(vaultConnector, tempIdentity, identity) {
|
|
|
257
278
|
}
|
|
258
279
|
}
|
|
259
280
|
/**
|
|
260
|
-
* Remove the mnemonic.
|
|
281
|
+
* Remove the mnemonic and associated account secret for an identity.
|
|
261
282
|
* @param vaultConnector The vault connector.
|
|
262
283
|
* @param identity The working identity.
|
|
263
|
-
* @returns
|
|
284
|
+
* @returns A promise that resolves when all vault secrets for the identity have been removed.
|
|
264
285
|
*/
|
|
265
286
|
async function mnemonicRemove(vaultConnector, identity) {
|
|
266
287
|
try {
|
|
@@ -273,11 +294,11 @@ async function mnemonicRemove(vaultConnector, identity) {
|
|
|
273
294
|
catch { }
|
|
274
295
|
}
|
|
275
296
|
/**
|
|
276
|
-
*
|
|
297
|
+
* Resolve or create a DID identity document.
|
|
277
298
|
* @param engineCore The engine core for the node.
|
|
278
|
-
* @param controller The controller for the
|
|
279
|
-
* @param providedIdentity
|
|
280
|
-
* @returns The
|
|
299
|
+
* @param controller The controller DID for the new document.
|
|
300
|
+
* @param providedIdentity An existing DID to resolve; if absent or not found a new one is created.
|
|
301
|
+
* @returns The DID string for the resolved or newly created identity.
|
|
281
302
|
*/
|
|
282
303
|
async function identityGenerate(engineCore, controller, providedIdentity) {
|
|
283
304
|
CLIDisplay.section(I18n.formatMessage("node.cli.commands.identity-create.labels.processingIdentity"));
|
|
@@ -307,11 +328,11 @@ async function identityGenerate(engineCore, controller, providedIdentity) {
|
|
|
307
328
|
return identityDocument.id;
|
|
308
329
|
}
|
|
309
330
|
/**
|
|
310
|
-
*
|
|
331
|
+
* Generate and fund a wallet address for the given identity.
|
|
311
332
|
* @param engineCore The engine core for the node.
|
|
312
333
|
* @param identity The identity to create the wallet for.
|
|
313
334
|
* @param walletAddressIndex The index of the wallet address to use.
|
|
314
|
-
* @returns The
|
|
335
|
+
* @returns The primary wallet address for the identity.
|
|
315
336
|
*/
|
|
316
337
|
async function generateWallet(engineCore, identity, walletAddressIndex) {
|
|
317
338
|
CLIDisplay.section(I18n.formatMessage("node.cli.commands.identity-create.labels.fundingWallet"));
|
|
@@ -332,10 +353,11 @@ async function generateWallet(engineCore, identity, walletAddressIndex) {
|
|
|
332
353
|
return addresses[0];
|
|
333
354
|
}
|
|
334
355
|
/**
|
|
335
|
-
*
|
|
356
|
+
* Correct the identity association on a wallet address after the final DID is known.
|
|
336
357
|
* @param engineCore The engine core for the node.
|
|
337
|
-
* @param identity The
|
|
338
|
-
* @param address The address
|
|
358
|
+
* @param identity The final resolved identity.
|
|
359
|
+
* @param address The wallet address to update.
|
|
360
|
+
* @returns A promise that resolves when the wallet address identity has been updated.
|
|
339
361
|
*/
|
|
340
362
|
async function walletFinalise(engineCore, identity, address) {
|
|
341
363
|
if (Is.stringValue(address)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identityCreate.js","sourceRoot":"","sources":["../../../src/commands/identityCreate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay, CLIUtils } from \"@twin.org/cli-core\";\nimport { Coerce, GeneralError, I18n, Is, RandomHelper, StringHelper } from \"@twin.org/core\";\nimport { Bip39 } from \"@twin.org/crypto\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport { IdentityConnectorType, WalletConnectorType } from \"@twin.org/engine-types\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport {\n\tDid,\n\tIdentityConnectorFactory,\n\tIdentityResolverConnectorFactory\n} from \"@twin.org/identity-models\";\nimport { nameofKebabCase } from \"@twin.org/nameof\";\nimport { type IVaultConnector, VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport type { WalletAddress } from \"@twin.org/wallet-connector-entity-storage\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { applyOrganizationIdToTenant } from \"./setTenantOrgId.js\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-create\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityCreate(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\"node.cli.commands.identity-create.description\"),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-create.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"mnemonic\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.mnemonic.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"24 words\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"controller\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.controller.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"fund-wallet\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.fund-wallet.description\"\n\t\t\t\t),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-json\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.output-json.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.output-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.output-env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"node-organization-id\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.node-organization-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"tenant-organization-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\textendedType: \"hex(32)\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.tenant-organization-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) => identityCreate(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for creating an identity.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.mnemonic The mnemonic to use for the identity.\n * @param params.identity The DID of the identity to create.\n * @param params.controller The controller DID for the identity.\n * @param params.fundWallet Whether to fund the wallet associated with the identity from a faucet.\n * @param params.nodeOrganizationId If true, set the created DID as the node organization ID.\n * @param params.tenantOrganizationId The tenant ID to set the created DID as the organization ID for.\n * @param params.outputJson The output .json file to store the command output.\n * @param params.outputEnv The output .env file to store the command output.\n * @param params.outputEnvPrefix The prefix to use for variables in the output .env file.\n * @returns The identity details.\n */\nexport async function identityCreate(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tmnemonic?: string;\n\t\tidentity?: string;\n\t\tcontroller?: string;\n\t\tfundWallet?: boolean;\n\t\tnodeOrganizationId?: boolean;\n\t\ttenantOrganizationId?: string;\n\t\toutputJson?: string;\n\t\toutputEnv?: string;\n\t\toutputEnvPrefix?: string;\n\t}\n): Promise<{ mnemonic: string; did: string; walletAddress?: string }> {\n\tlet workingIdentity = params?.identity;\n\tlet tempIdentity;\n\tif (!Is.stringValue(workingIdentity)) {\n\t\ttempIdentity = `did:temp:${RandomHelper.generateUuidV7()}`;\n\t\tworkingIdentity = tempIdentity;\n\t}\n\tlet mnemonicStored = false;\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\ttry {\n\t\tconst mnemonicResult = await mnemonicCreate(vaultConnector, workingIdentity, params.mnemonic);\n\t\tmnemonicStored = mnemonicResult.stored;\n\n\t\tconst fundWallet = params.fundWallet ?? false;\n\t\tlet walletAddress;\n\t\tif (fundWallet) {\n\t\t\twalletAddress = await generateWallet(\n\t\t\t\tengineCore,\n\t\t\t\tworkingIdentity,\n\t\t\t\tCoerce.integer(envVars.identityWalletAddressIndex) ?? 0\n\t\t\t);\n\t\t}\n\n\t\tconst workingController = params?.controller ?? workingIdentity;\n\t\tworkingIdentity = await identityGenerate(engineCore, workingController, workingIdentity);\n\n\t\tif (Is.stringValue(tempIdentity)) {\n\t\t\t// If we were using a temporary identity store the mnemonic using\n\t\t\t// the final identity\n\t\t\tawait mnemonicFinalise(vaultConnector, tempIdentity, workingIdentity);\n\n\t\t\tawait walletFinalise(engineCore, workingIdentity, walletAddress);\n\t\t}\n\n\t\tif (params.nodeOrganizationId) {\n\t\t\tif (Coerce.boolean(envVars.tenantEnabled)) {\n\t\t\t\tthrow new GeneralError(\"identityCreate\", \"nodeOrganizationIdNotAvailableInMultiTenantMode\");\n\t\t\t}\n\t\t\tconst state = engineCore.getState();\n\t\t\tstate.nodeOrganizationId = workingIdentity;\n\t\t\tengineCore.setStateDirty();\n\t\t}\n\n\t\tif (Is.stringValue(params.tenantOrganizationId)) {\n\t\t\tawait applyOrganizationIdToTenant(engineCore, params.tenantOrganizationId, workingIdentity);\n\t\t}\n\n\t\tCLIDisplay.break();\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.mnemonic\"),\n\t\t\tmnemonicResult.mnemonic\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.did\"),\n\t\t\tworkingIdentity\n\t\t);\n\t\tif (\n\t\t\tIs.stringValue(envVars.iotaExplorerEndpoint) &&\n\t\t\tenvVars.identityConnector === IdentityConnectorType.Iota\n\t\t) {\n\t\t\tconst idParts = Did.parse(workingIdentity);\n\t\t\tif (Is.stringValue(walletAddress)) {\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.walletAddress\"),\n\t\t\t\t\t`${StringHelper.trimTrailingSlashes(envVars.iotaExplorerEndpoint)}/address/${walletAddress}?network=${idParts.network ?? envVars.iotaNetwork}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.explorer\"),\n\t\t\t\t`${StringHelper.trimTrailingSlashes(envVars.iotaExplorerEndpoint)}/object/${idParts.id}?network=${idParts.network ?? envVars.iotaNetwork}`\n\t\t\t);\n\t\t}\n\t\tCLIDisplay.break();\n\n\t\tconst json = { mnemonic: mnemonicResult.mnemonic, did: workingIdentity, walletAddress };\n\t\tif (Is.stringValue(params.outputJson)) {\n\t\t\tawait CLIUtils.writeJsonFile(\n\t\t\t\tparams.outputJson,\n\t\t\t\t{ mnemonic: mnemonicResult.mnemonic, did: workingIdentity, walletAddress },\n\t\t\t\tfalse\n\t\t\t);\n\t\t}\n\n\t\tif (Is.stringValue(params.outputEnv)) {\n\t\t\tconst output = [\n\t\t\t\t`${params.outputEnvPrefix}MNEMONIC=\"${mnemonicResult.mnemonic}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID=\"${workingIdentity}\"`\n\t\t\t];\n\t\t\tif (Is.stringValue(walletAddress)) {\n\t\t\t\toutput.push(`${params.outputEnvPrefix}WALLET_ADDRESS=\"${walletAddress}\"`);\n\t\t\t}\n\t\t\tawait CLIUtils.writeEnvFile(params.outputEnv, output, false);\n\t\t}\n\n\t\tCLIDisplay.done();\n\n\t\treturn json;\n\t} finally {\n\t\t// Always remove temporary identity mnemonic if created\n\t\tif (Is.stringValue(tempIdentity) && mnemonicStored) {\n\t\t\tawait mnemonicRemove(vaultConnector, tempIdentity);\n\t\t}\n\t}\n}\n\n/**\n * Handle the mnemonic generation or retrieval.\n * @param vaultConnector The vault connector.\n * @param identity The working identity.\n * @param providedMnemonic The mnemonic provided by the user.\n * @returns The mnemonic and the flag to determine if the mnemonic was stored.\n */\nasync function mnemonicCreate(\n\tvaultConnector: IVaultConnector,\n\tidentity: string,\n\tprovidedMnemonic?: string\n): Promise<{\n\tstored: boolean;\n\tmnemonic: string;\n}> {\n\tif (Is.stringValue(providedMnemonic) && !Bip39.validateMnemonic(providedMnemonic)) {\n\t\tthrow new GeneralError(\"identityCreate\", \"invalidMnemonic\");\n\t}\n\tlet mnemonic = providedMnemonic;\n\tlet storeMnemonic;\n\n\tCLIDisplay.section(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.processingMnemonic\")\n\t);\n\n\tconst mnemonicKey = `${identity}/mnemonic`;\n\n\ttry {\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.readingMnemonic\"));\n\t\tconst storedMnemonic = await vaultConnector.getSecret<string>(mnemonicKey);\n\t\tif (Is.stringValue(storedMnemonic)) {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.existingMnemonic\")\n\t\t\t);\n\t\t\tstoreMnemonic = storedMnemonic !== mnemonic && !Is.empty(mnemonic);\n\t\t\tmnemonic = storedMnemonic;\n\t\t} else {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.noExistingMnemonic\")\n\t\t\t);\n\t\t\tstoreMnemonic = true;\n\t\t}\n\t} catch {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.noExistingMnemonic\")\n\t\t);\n\t\tstoreMnemonic = true;\n\t}\n\n\t// If there is no mnemonic then we need to generate one\n\tif (Is.empty(mnemonic)) {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.generatingMnemonic\")\n\t\t);\n\t\tmnemonic = Bip39.randomMnemonic();\n\t\tstoreMnemonic = true;\n\t}\n\n\t// If there is no mnemonic stored in the vault then we need to store it\n\tif (storeMnemonic) {\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.storingMnemonic\"));\n\t\tawait vaultConnector.setSecret(mnemonicKey, mnemonic);\n\t}\n\tCLIDisplay.break();\n\n\treturn {\n\t\tstored: storeMnemonic,\n\t\tmnemonic\n\t};\n}\n\n/**\n * Finalise the mnemonic for the node identity.\n * @param vaultConnector The vault connector to use.\n * @param tempIdentity The identity of the node.\n * @param identity The final identity for the node.\n */\nasync function mnemonicFinalise(\n\tvaultConnector: IVaultConnector,\n\ttempIdentity: string,\n\tidentity: string\n): Promise<void> {\n\t// Now that we have an identity we can remove the temporary one\n\t// and store the mnemonic with the new identity\n\tif (tempIdentity !== identity) {\n\t\tconst mnemonic = await vaultConnector.getSecret(`${tempIdentity}/mnemonic`);\n\t\tawait vaultConnector.setSecret(`${identity}/mnemonic`, mnemonic);\n\n\t\ttry {\n\t\t\t// not all accounts have account entries in the vault, so wrap this in a try catch\n\t\t\tconst accountChunk = await vaultConnector.getSecret(`${tempIdentity}/account/0/0/0`);\n\t\t\tawait vaultConnector.setSecret(`${identity}/account/0/0/0`, accountChunk);\n\t\t} catch {}\n\t}\n}\n\n/**\n * Remove the mnemonic.\n * @param vaultConnector The vault connector.\n * @param identity The working identity.\n * @returns Nothing.\n */\nasync function mnemonicRemove(vaultConnector: IVaultConnector, identity: string): Promise<void> {\n\ttry {\n\t\tawait vaultConnector.removeSecret(`${identity}/mnemonic`);\n\t} catch {}\n\n\ttry {\n\t\tawait vaultConnector.removeSecret(`${identity}/account/0/0/0`);\n\t} catch {}\n}\n\n/**\n * Generate an identity.\n * @param engineCore The engine core for the node.\n * @param controller The controller for the identity.\n * @param providedIdentity The existing identity if there is one.\n * @returns The addresses for the wallet.\n */\nasync function identityGenerate(\n\tengineCore: IEngineCore,\n\tcontroller: string,\n\tprovidedIdentity?: string\n): Promise<string> {\n\tCLIDisplay.section(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.processingIdentity\")\n\t);\n\n\tconst defaultIdentityConnectorType = engineCore.getRegisteredInstanceType(\"identityConnector\");\n\tconst identityConnector = IdentityConnectorFactory.get(defaultIdentityConnectorType);\n\n\tlet identityDocument;\n\n\ttry {\n\t\tif (Is.stringValue(providedIdentity)) {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.resolvingIdentity\")\n\t\t\t);\n\t\t\tconst defaultIdentityResolverConnectorType = engineCore.getRegisteredInstanceType(\n\t\t\t\t\"identityResolverConnector\"\n\t\t\t);\n\n\t\t\tconst identityResolverConnector = IdentityResolverConnectorFactory.get(\n\t\t\t\tdefaultIdentityResolverConnectorType\n\t\t\t);\n\t\t\tidentityDocument = await identityResolverConnector.resolveDocument(providedIdentity);\n\t\t\tif (Is.objectValue(identityDocument)) {\n\t\t\t\tCLIDisplay.task(\n\t\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.existingIdentity\")\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\tif (Is.empty(identityDocument)) {\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.noIdentityFound\"));\n\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.creatingIdentity\")\n\t\t);\n\n\t\tCLIDisplay.spinnerStart();\n\t\tidentityDocument = await identityConnector.createDocument(controller);\n\t\tCLIDisplay.spinnerStop();\n\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.createdIdentity\"));\n\t}\n\n\treturn identityDocument.id;\n}\n\n/**\n * Bootstrap the wallet for the node.\n * @param engineCore The engine core for the node.\n * @param identity The identity to create the wallet for.\n * @param walletAddressIndex The index of the wallet address to use.\n * @returns The addresses for the wallet.\n */\nasync function generateWallet(\n\tengineCore: IEngineCore,\n\tidentity: string,\n\twalletAddressIndex: number\n): Promise<string> {\n\tCLIDisplay.section(I18n.formatMessage(\"node.cli.commands.identity-create.labels.fundingWallet\"));\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.addressIndex\"),\n\t\twalletAddressIndex.toString()\n\t);\n\n\tconst defaultWalletConnectorType = engineCore.getRegisteredInstanceType(\"walletConnector\");\n\n\tconst walletConnector = WalletConnectorFactory.get(defaultWalletConnectorType);\n\tconst addresses = await walletConnector.getAddresses(identity, 0, walletAddressIndex, 5);\n\n\tif (defaultWalletConnectorType.startsWith(WalletConnectorType.Iota)) {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.addingTokens\", {\n\t\t\t\taddress: addresses[0]\n\t\t\t})\n\t\t);\n\t\tCLIDisplay.break();\n\n\t\tCLIDisplay.spinnerStart();\n\n\t\t// Add some funds to the wallet from the faucet\n\t\tawait walletConnector.ensureBalance(identity, addresses[0], 1000000000n);\n\n\t\tCLIDisplay.spinnerStop();\n\t}\n\n\treturn addresses[0];\n}\n\n/**\n * Bootstrap the identity for the node.\n * @param engineCore The engine core for the node.\n * @param identity The identity of the node.\n * @param address The address for the wallet.\n */\nasync function walletFinalise(\n\tengineCore: IEngineCore,\n\tidentity: string,\n\taddress?: string\n): Promise<void> {\n\tif (Is.stringValue(address)) {\n\t\tconst defaultWalletConnectorType = engineCore.getRegisteredInstanceType(\"walletConnector\");\n\n\t\t// If we are using entity storage for wallet the identity associated with the\n\t\t// address will be wrong, so fix it\n\t\tif (defaultWalletConnectorType.startsWith(WalletConnectorType.EntityStorage)) {\n\t\t\tconst walletAddress =\n\t\t\t\tEntityStorageConnectorFactory.get<IEntityStorageConnector<WalletAddress>>(\n\t\t\t\t\tnameofKebabCase<WalletAddress>()\n\t\t\t\t);\n\t\t\tconst addr = await walletAddress.get(address);\n\t\t\tif (!Is.empty(addr)) {\n\t\t\t\taddr.identity = identity;\n\t\t\t\tawait walletAddress.set(addr);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"identityCreate.js","sourceRoot":"","sources":["../../../src/commands/identityCreate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay, CLIUtils } from \"@twin.org/cli-core\";\nimport { Coerce, GeneralError, I18n, Is, RandomHelper, StringHelper } from \"@twin.org/core\";\nimport { Bip39 } from \"@twin.org/crypto\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport { IdentityConnectorType, WalletConnectorType } from \"@twin.org/engine-types\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport {\n\tDid,\n\tIdentityConnectorFactory,\n\tIdentityResolverConnectorFactory\n} from \"@twin.org/identity-models\";\nimport { nameofKebabCase } from \"@twin.org/nameof\";\nimport { type IVaultConnector, VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport type { WalletAddress } from \"@twin.org/wallet-connector-entity-storage\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { nodeSetIdentity } from \"./nodeSetIdentity.js\";\nimport { applyOrganizationIdToTenant } from \"./setTenantOrgId.js\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-create\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityCreate(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\"node.cli.commands.identity-create.description\"),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-create.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"mnemonic\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.mnemonic.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"24 words\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"controller\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.controller.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"fund-wallet\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.fund-wallet.description\"\n\t\t\t\t),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-json\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.output-json.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.output-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.output-env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"node-id\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.node-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"node-organization-id\",\n\t\t\t\ttype: \"boolean\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.node-organization-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"tenant-organization-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\textendedType: \"hex(32)\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-create.params.tenant-organization-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) => identityCreate(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for creating an identity.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.mnemonic The mnemonic to use for the identity.\n * @param params.identity The DID of the identity to create.\n * @param params.controller The controller DID for the identity.\n * @param params.fundWallet Whether to fund the wallet associated with the identity from a faucet.\n * @param params.nodeId If true, set the created DID as the node identity.\n * @param params.nodeOrganizationId If true, set the created DID as the node organization ID.\n * @param params.tenantOrganizationId The tenant ID to set the created DID as the organization ID for.\n * @param params.outputJson The output .json file to store the command output.\n * @param params.outputEnv The output .env file to store the command output.\n * @param params.outputEnvPrefix The prefix to use for variables in the output .env file.\n * @returns The identity details.\n */\nexport async function identityCreate(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tmnemonic?: string;\n\t\tidentity?: string;\n\t\tcontroller?: string;\n\t\tfundWallet?: boolean;\n\t\tnodeId?: boolean;\n\t\tnodeOrganizationId?: boolean;\n\t\ttenantOrganizationId?: string;\n\t\toutputJson?: string;\n\t\toutputEnv?: string;\n\t\toutputEnvPrefix?: string;\n\t}\n): Promise<{ mnemonic: string; did: string; walletAddress?: string }> {\n\tconst assignmentCount =\n\t\t(params.nodeId ? 1 : 0) +\n\t\t(params.nodeOrganizationId ? 1 : 0) +\n\t\t(Is.stringValue(params.tenantOrganizationId) ? 1 : 0);\n\tif (assignmentCount > 1) {\n\t\tthrow new GeneralError(\"identityCreate\", \"onlyOneAssignmentOptionAllowed\");\n\t}\n\n\tlet workingIdentity = params?.identity;\n\tlet tempIdentity;\n\tif (!Is.stringValue(workingIdentity)) {\n\t\ttempIdentity = `did:temp:${RandomHelper.generateUuidV7()}`;\n\t\tworkingIdentity = tempIdentity;\n\t}\n\tlet mnemonicStored = false;\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\ttry {\n\t\tconst mnemonicResult = await mnemonicCreate(vaultConnector, workingIdentity, params.mnemonic);\n\t\tmnemonicStored = mnemonicResult.stored;\n\n\t\tconst fundWallet = params.fundWallet ?? false;\n\t\tlet walletAddress;\n\t\tif (fundWallet) {\n\t\t\twalletAddress = await generateWallet(\n\t\t\t\tengineCore,\n\t\t\t\tworkingIdentity,\n\t\t\t\tCoerce.integer(envVars.identityWalletAddressIndex) ?? 0\n\t\t\t);\n\t\t}\n\n\t\tconst workingController = params?.controller ?? workingIdentity;\n\t\tworkingIdentity = await identityGenerate(engineCore, workingController, workingIdentity);\n\n\t\tif (Is.stringValue(tempIdentity)) {\n\t\t\t// If we were using a temporary identity store the mnemonic using\n\t\t\t// the final identity\n\t\t\tawait mnemonicFinalise(vaultConnector, tempIdentity, workingIdentity);\n\n\t\t\tawait walletFinalise(engineCore, workingIdentity, walletAddress);\n\t\t}\n\n\t\tif (params.nodeId) {\n\t\t\tawait nodeSetIdentity(engineCore, envVars, { identity: workingIdentity });\n\t\t}\n\n\t\tif (params.nodeOrganizationId) {\n\t\t\tif (Coerce.boolean(envVars.tenantEnabled)) {\n\t\t\t\tthrow new GeneralError(\"identityCreate\", \"nodeOrganizationIdNotAvailableInMultiTenantMode\");\n\t\t\t}\n\t\t\tconst state = engineCore.getState();\n\t\t\tstate.nodeOrganizationId = workingIdentity;\n\t\t\tengineCore.setStateDirty();\n\t\t}\n\n\t\tif (Is.stringValue(params.tenantOrganizationId)) {\n\t\t\tawait applyOrganizationIdToTenant(engineCore, params.tenantOrganizationId, workingIdentity);\n\t\t}\n\n\t\tif (mnemonicStored) {\n\t\t\tCLIDisplay.break();\n\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.mnemonic\"),\n\t\t\t\tmnemonicResult.mnemonic\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.did\"),\n\t\t\t\tworkingIdentity\n\t\t\t);\n\t\t}\n\t\tif (\n\t\t\tIs.stringValue(envVars.iotaExplorerEndpoint) &&\n\t\t\tenvVars.identityConnector === IdentityConnectorType.Iota\n\t\t) {\n\t\t\tconst idParts = Did.parse(workingIdentity);\n\t\t\tif (Is.stringValue(walletAddress)) {\n\t\t\t\tCLIDisplay.value(\n\t\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.walletAddress\"),\n\t\t\t\t\t`${StringHelper.trimTrailingSlashes(envVars.iotaExplorerEndpoint)}/address/${walletAddress}?network=${idParts.network ?? envVars.iotaNetwork}`\n\t\t\t\t);\n\t\t\t}\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.explorer\"),\n\t\t\t\t`${StringHelper.trimTrailingSlashes(envVars.iotaExplorerEndpoint)}/object/${idParts.id}?network=${idParts.network ?? envVars.iotaNetwork}`\n\t\t\t);\n\t\t}\n\t\tCLIDisplay.break();\n\n\t\tconst json = { mnemonic: mnemonicResult.mnemonic, did: workingIdentity, walletAddress };\n\t\tif (Is.stringValue(params.outputJson)) {\n\t\t\tawait CLIUtils.writeJsonFile(\n\t\t\t\tparams.outputJson,\n\t\t\t\t{ mnemonic: mnemonicResult.mnemonic, did: workingIdentity, walletAddress },\n\t\t\t\tfalse\n\t\t\t);\n\t\t}\n\n\t\tif (Is.stringValue(params.outputEnv)) {\n\t\t\tconst output = [\n\t\t\t\t`${params.outputEnvPrefix}MNEMONIC=\"${mnemonicResult.mnemonic}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID=\"${workingIdentity}\"`\n\t\t\t];\n\t\t\tif (Is.stringValue(walletAddress)) {\n\t\t\t\toutput.push(`${params.outputEnvPrefix}WALLET_ADDRESS=\"${walletAddress}\"`);\n\t\t\t}\n\t\t\tawait CLIUtils.writeEnvFile(params.outputEnv, output, false);\n\t\t}\n\n\t\tCLIDisplay.done();\n\n\t\treturn json;\n\t} finally {\n\t\t// Always remove temporary identity mnemonic if created\n\t\tif (Is.stringValue(tempIdentity) && mnemonicStored) {\n\t\t\tawait mnemonicRemove(vaultConnector, tempIdentity);\n\t\t}\n\t}\n}\n\n/**\n * Handle the mnemonic generation or retrieval.\n * @param vaultConnector The vault connector.\n * @param identity The working identity.\n * @param providedMnemonic The mnemonic provided by the user.\n * @returns The mnemonic and the flag to determine if the mnemonic was stored.\n */\nasync function mnemonicCreate(\n\tvaultConnector: IVaultConnector,\n\tidentity: string,\n\tprovidedMnemonic?: string\n): Promise<{\n\tstored: boolean;\n\tmnemonic: string;\n}> {\n\tif (Is.stringValue(providedMnemonic) && !Bip39.validateMnemonic(providedMnemonic)) {\n\t\tthrow new GeneralError(\"identityCreate\", \"invalidMnemonic\");\n\t}\n\tlet mnemonic = providedMnemonic;\n\tlet storeMnemonic;\n\n\tCLIDisplay.section(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.processingMnemonic\")\n\t);\n\n\tconst mnemonicKey = `${identity}/mnemonic`;\n\n\ttry {\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.readingMnemonic\"));\n\t\tconst storedMnemonic = await vaultConnector.getSecret<string>(mnemonicKey);\n\t\tif (Is.stringValue(storedMnemonic)) {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.existingMnemonic\")\n\t\t\t);\n\t\t\tstoreMnemonic = storedMnemonic !== mnemonic && !Is.empty(mnemonic);\n\t\t\tmnemonic = storedMnemonic;\n\t\t} else {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.noExistingMnemonic\")\n\t\t\t);\n\t\t\tstoreMnemonic = true;\n\t\t}\n\t} catch {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.noExistingMnemonic\")\n\t\t);\n\t\tstoreMnemonic = true;\n\t}\n\n\t// If there is no mnemonic then we need to generate one\n\tif (Is.empty(mnemonic)) {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.generatingMnemonic\")\n\t\t);\n\t\tmnemonic = Bip39.randomMnemonic();\n\t\tstoreMnemonic = true;\n\t}\n\n\t// If there is no mnemonic stored in the vault then we need to store it\n\tif (storeMnemonic) {\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.storingMnemonic\"));\n\t\tawait vaultConnector.setSecret(mnemonicKey, mnemonic);\n\t}\n\tCLIDisplay.break();\n\n\treturn {\n\t\tstored: storeMnemonic,\n\t\tmnemonic\n\t};\n}\n\n/**\n * Finalise the mnemonic for the node identity.\n * @param vaultConnector The vault connector to use.\n * @param tempIdentity The temporary identity used during creation.\n * @param identity The final resolved identity.\n * @returns A promise that resolves when the mnemonic has been migrated to the final identity key.\n */\nasync function mnemonicFinalise(\n\tvaultConnector: IVaultConnector,\n\ttempIdentity: string,\n\tidentity: string\n): Promise<void> {\n\t// Now that we have an identity we can remove the temporary one\n\t// and store the mnemonic with the new identity\n\tif (tempIdentity !== identity) {\n\t\tconst mnemonic = await vaultConnector.getSecret(`${tempIdentity}/mnemonic`);\n\t\tawait vaultConnector.setSecret(`${identity}/mnemonic`, mnemonic);\n\n\t\ttry {\n\t\t\t// not all accounts have account entries in the vault, so wrap this in a try catch\n\t\t\tconst accountChunk = await vaultConnector.getSecret(`${tempIdentity}/account/0/0/0`);\n\t\t\tawait vaultConnector.setSecret(`${identity}/account/0/0/0`, accountChunk);\n\t\t} catch {}\n\t}\n}\n\n/**\n * Remove the mnemonic and associated account secret for an identity.\n * @param vaultConnector The vault connector.\n * @param identity The working identity.\n * @returns A promise that resolves when all vault secrets for the identity have been removed.\n */\nasync function mnemonicRemove(vaultConnector: IVaultConnector, identity: string): Promise<void> {\n\ttry {\n\t\tawait vaultConnector.removeSecret(`${identity}/mnemonic`);\n\t} catch {}\n\n\ttry {\n\t\tawait vaultConnector.removeSecret(`${identity}/account/0/0/0`);\n\t} catch {}\n}\n\n/**\n * Resolve or create a DID identity document.\n * @param engineCore The engine core for the node.\n * @param controller The controller DID for the new document.\n * @param providedIdentity An existing DID to resolve; if absent or not found a new one is created.\n * @returns The DID string for the resolved or newly created identity.\n */\nasync function identityGenerate(\n\tengineCore: IEngineCore,\n\tcontroller: string,\n\tprovidedIdentity?: string\n): Promise<string> {\n\tCLIDisplay.section(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.processingIdentity\")\n\t);\n\n\tconst defaultIdentityConnectorType = engineCore.getRegisteredInstanceType(\"identityConnector\");\n\tconst identityConnector = IdentityConnectorFactory.get(defaultIdentityConnectorType);\n\n\tlet identityDocument;\n\n\ttry {\n\t\tif (Is.stringValue(providedIdentity)) {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.resolvingIdentity\")\n\t\t\t);\n\t\t\tconst defaultIdentityResolverConnectorType = engineCore.getRegisteredInstanceType(\n\t\t\t\t\"identityResolverConnector\"\n\t\t\t);\n\n\t\t\tconst identityResolverConnector = IdentityResolverConnectorFactory.get(\n\t\t\t\tdefaultIdentityResolverConnectorType\n\t\t\t);\n\t\t\tidentityDocument = await identityResolverConnector.resolveDocument(providedIdentity);\n\t\t\tif (Is.objectValue(identityDocument)) {\n\t\t\t\tCLIDisplay.task(\n\t\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.existingIdentity\")\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\tif (Is.empty(identityDocument)) {\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.noIdentityFound\"));\n\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.creatingIdentity\")\n\t\t);\n\n\t\tCLIDisplay.spinnerStart();\n\t\tidentityDocument = await identityConnector.createDocument(controller);\n\t\tCLIDisplay.spinnerStop();\n\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-create.labels.createdIdentity\"));\n\t}\n\n\treturn identityDocument.id;\n}\n\n/**\n * Generate and fund a wallet address for the given identity.\n * @param engineCore The engine core for the node.\n * @param identity The identity to create the wallet for.\n * @param walletAddressIndex The index of the wallet address to use.\n * @returns The primary wallet address for the identity.\n */\nasync function generateWallet(\n\tengineCore: IEngineCore,\n\tidentity: string,\n\twalletAddressIndex: number\n): Promise<string> {\n\tCLIDisplay.section(I18n.formatMessage(\"node.cli.commands.identity-create.labels.fundingWallet\"));\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.addressIndex\"),\n\t\twalletAddressIndex.toString()\n\t);\n\n\tconst defaultWalletConnectorType = engineCore.getRegisteredInstanceType(\"walletConnector\");\n\n\tconst walletConnector = WalletConnectorFactory.get(defaultWalletConnectorType);\n\tconst addresses = await walletConnector.getAddresses(identity, 0, walletAddressIndex, 5);\n\n\tif (defaultWalletConnectorType.startsWith(WalletConnectorType.Iota)) {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-create.labels.addingTokens\", {\n\t\t\t\taddress: addresses[0]\n\t\t\t})\n\t\t);\n\t\tCLIDisplay.break();\n\n\t\tCLIDisplay.spinnerStart();\n\n\t\t// Add some funds to the wallet from the faucet\n\t\tawait walletConnector.ensureBalance(identity, addresses[0], 1000000000n);\n\n\t\tCLIDisplay.spinnerStop();\n\t}\n\n\treturn addresses[0];\n}\n\n/**\n * Correct the identity association on a wallet address after the final DID is known.\n * @param engineCore The engine core for the node.\n * @param identity The final resolved identity.\n * @param address The wallet address to update.\n * @returns A promise that resolves when the wallet address identity has been updated.\n */\nasync function walletFinalise(\n\tengineCore: IEngineCore,\n\tidentity: string,\n\taddress?: string\n): Promise<void> {\n\tif (Is.stringValue(address)) {\n\t\tconst defaultWalletConnectorType = engineCore.getRegisteredInstanceType(\"walletConnector\");\n\n\t\t// If we are using entity storage for wallet the identity associated with the\n\t\t// address will be wrong, so fix it\n\t\tif (defaultWalletConnectorType.startsWith(WalletConnectorType.EntityStorage)) {\n\t\t\tconst walletAddress =\n\t\t\t\tEntityStorageConnectorFactory.get<IEntityStorageConnector<WalletAddress>>(\n\t\t\t\t\tnameofKebabCase<WalletAddress>()\n\t\t\t\t);\n\t\t\tconst addr = await walletAddress.get(address);\n\t\t\tif (!Is.empty(addr)) {\n\t\t\t\taddr.identity = identity;\n\t\t\t\tawait walletAddress.set(addr);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -55,6 +55,7 @@ export function getCommandDefinitionIdentityImport(commandDefinitions) {
|
|
|
55
55
|
* @param params The parameters for the command.
|
|
56
56
|
* @param params.identity The DID of the identity to import.
|
|
57
57
|
* @param params.mnemonic The mnemonic to use for the identity.
|
|
58
|
+
* @returns A promise that resolves when the identity mnemonic has been stored in the vault.
|
|
58
59
|
*/
|
|
59
60
|
export async function identityImport(engineCore, envVars, params) {
|
|
60
61
|
Did.guard("identityImport", "identity", params.identity);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identityImports.js","sourceRoot":"","sources":["../../../src/commands/identityImports.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAM/D,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAAC,kBAElD;IACA,kBAAkB,CAAC,YAAY,CAAC,GAAG;QAClC,OAAO,EAAE,YAAY;QACrB,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,+CAA+C,CAAC;QAChF,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,2CAA2C,CAAC;QACxE,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,KAAK;QAC1B,MAAM,EAAE;YACP;gBACC,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,IAAI,CAAC,aAAa,CAC9B,iEAAiE,CACjE;gBACD,QAAQ,EAAE,KAAK;aACf;YACD;gBACC,GAAG,EAAE,UAAU;gBACf,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,IAAI,CAAC,aAAa,CAC9B,+DAA+D,CAC/D;gBACD,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,GAAG,EAAE,UAAU;gBACf,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,IAAI,CAAC,aAAa,CAC9B,+DAA+D,CAC/D;gBACD,YAAY,EAAE,UAAU;gBACxB,QAAQ,EAAE,IAAI;aACd;YACD;gBACC,GAAG,EAAE,UAAU;gBACf,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,IAAI,CAAC,aAAa,CAC9B,+DAA+D,CAC/D;gBACD,QAAQ,EAAE,KAAK;aACf;SACD;QACD,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;KAC1F,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"identityImports.js","sourceRoot":"","sources":["../../../src/commands/identityImports.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { GeneralError, Guards, I18n, Is } from \"@twin.org/core\";\nimport { Bip39 } from \"@twin.org/crypto\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport { Did, IdentityResolverConnectorFactory } from \"@twin.org/identity-models\";\nimport { VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-import\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityImport(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\"node.cli.commands.identity-import.description\"),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-import.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-import.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-import.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"mnemonic\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-import.params.mnemonic.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"24 words\",\n\t\t\t\trequired: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-import.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) => identityImport(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for importing an identity.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.identity The DID of the identity to import.\n * @param params.mnemonic The mnemonic to use for the identity.\n * @returns A promise that resolves when the identity mnemonic has been stored in the vault.\n */\nexport async function identityImport(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tidentity?: string;\n\t\tmnemonic?: string;\n\t}\n): Promise<void> {\n\tDid.guard(\"identityImport\", \"identity\", params.identity);\n\tGuards.stringValue(\"identityImport\", \"mnemonic\", params.mnemonic);\n\tif (!Bip39.validateMnemonic(params.mnemonic)) {\n\t\tthrow new GeneralError(\"identityImport\", \"invalidMnemonic\");\n\t}\n\n\tconst defaultIdentityResolverConnectorType = engineCore.getRegisteredInstanceType(\n\t\t\"identityResolverConnector\"\n\t);\n\n\tconst identityResolverConnector = IdentityResolverConnectorFactory.get(\n\t\tdefaultIdentityResolverConnectorType\n\t);\n\n\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-import.labels.resolvingIdentity\"));\n\tconst identityDocument = await identityResolverConnector.resolveDocument(params.identity);\n\n\tif (Is.empty(identityDocument)) {\n\t\tthrow new GeneralError(\"identityImport\", \"identityNotFound\", {\n\t\t\tidentity: params.identity\n\t\t});\n\t}\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.identity-import.labels.storingMnemonic\"));\n\tconst mnemonicKey = `${params.identity}/mnemonic`;\n\tawait vaultConnector.setSecret(mnemonicKey, params.mnemonic);\n\n\tCLIDisplay.break();\n\tCLIDisplay.done();\n}\n"]}
|
|
@@ -177,17 +177,19 @@ export async function identityVerificationMethodCreate(engineCore, envVars, para
|
|
|
177
177
|
: "";
|
|
178
178
|
const jwk = await Jwk.fromEd25519Private(keyPair.privateKey);
|
|
179
179
|
const kid = await Jwk.generateKid(jwk);
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
180
|
+
if (createMethod) {
|
|
181
|
+
CLIDisplay.break();
|
|
182
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.verificationMethodId"), verificationMethod.id);
|
|
183
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.verificationMethodType"), verificationMethod.type);
|
|
184
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.kid"), kid);
|
|
185
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.privateKeyBase64Url"), privateKeyBase64Url);
|
|
186
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.publicKeyBase64Url"), publicKeyBase64Url);
|
|
187
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.privateKeyBase64"), privateKeyBase64);
|
|
188
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.publicKeyBase64"), publicKeyBase64);
|
|
189
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.privateKeyHex"), privateKeyHex);
|
|
190
|
+
CLIDisplay.value(I18n.formatMessage("node.cli.commands.identity-verification-method-create.labels.publicKeyHex"), publicKeyHex);
|
|
191
|
+
CLIDisplay.break();
|
|
192
|
+
}
|
|
191
193
|
json = {
|
|
192
194
|
verificationMethodId: verificationMethod.id,
|
|
193
195
|
verificationMethodType: verificationMethod.type,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identityVerificationMethodCreate.js","sourceRoot":"","sources":["../../../src/commands/identityVerificationMethodCreate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay, CLIUtils } from \"@twin.org/cli-core\";\nimport { ComponentFactory, Converter, GeneralError, Guards, I18n, Is } from \"@twin.org/core\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport {\n\tDid,\n\tDocumentHelper,\n\tIdentityConnectorFactory,\n\ttype IIdentityResolverComponent\n} from \"@twin.org/identity-models\";\nimport { DidVerificationMethodType } from \"@twin.org/standards-w3c-did\";\nimport { VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport { type IJwk, Jwk } from \"@twin.org/web\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-verification-method-create\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityVerificationMethodCreate(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\n\t\t\t\"node.cli.commands.identity-verification-method-create.description\"\n\t\t),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-verification-method-create.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"controller\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.controller.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-type\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.verification-method-type.description\"\n\t\t\t\t),\n\t\t\t\toptions: Object.values(DidVerificationMethodType),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: \"assertionMethod\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.verification-method-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"overwrite-mode\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.overwrite-mode.description\"\n\t\t\t\t),\n\t\t\t\toptions: [\"skip\", \"overwrite\", \"error\"],\n\t\t\t\tdefaultValue: \"skip\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-json\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.output-json.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.output-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.output-env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) =>\n\t\t\tidentityVerificationMethodCreate(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for creating an identity verification method.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.identity The DID of the identity to create.\n * @param params.verificationMethodType The type of verification method to create.\n * @param params.verificationMethodId The ID of the verification method to create.\n * @param params.controller The controller DID for the identity.\n * @param params.overwriteMode The mode to use when a verification method with the same ID already exists.\n * @param params.outputJson The output .json file to store the command output.\n * @param params.outputEnv The output .env file to store the command output.\n * @param params.outputEnvPrefix The prefix to use for variables in the output .env file.\n * @returns The created verification method details or undefined if skipped.\n */\nexport async function identityVerificationMethodCreate(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tidentity?: string;\n\t\tverificationMethodType?: DidVerificationMethodType;\n\t\tverificationMethodId?: string;\n\t\tcontroller?: string;\n\t\toverwriteMode?: \"skip\" | \"overwrite\" | \"error\";\n\t\toutputJson?: string;\n\t\toutputEnv?: string;\n\t\toutputEnvPrefix?: string;\n\t}\n): Promise<\n\t| {\n\t\t\tverificationMethodId: string;\n\t\t\tverificationMethodType: string;\n\t\t\tprivateKeyJwk: IJwk;\n\t\t\tprivateKeyHex: string;\n\t\t\tpublicKeyHex: string;\n\t\t\tprivateKeyBase64: string;\n\t\t\tpublicKeyBase64: string;\n\t }\n\t| undefined\n> {\n\tDid.guard(\"identityVerificationMethodCreate\", \"identity\", params.identity);\n\tGuards.arrayOneOf(\n\t\t\"identityVerificationMethodCreate\",\n\t\t\"verificationMethodType\",\n\t\tparams.verificationMethodType,\n\t\tObject.values(DidVerificationMethodType)\n\t);\n\tGuards.arrayOneOf(\"identityVerificationMethodCreate\", \"overwrite-mode\", params.overwriteMode, [\n\t\t\"skip\",\n\t\t\"overwrite\",\n\t\t\"error\"\n\t]);\n\n\tconst defaultIdentityConnectorType = engineCore.getRegisteredInstanceType(\"identityConnector\");\n\tconst identityConnector = IdentityConnectorFactory.get(defaultIdentityConnectorType);\n\n\tconst defaultIdentityResolverComponentType = engineCore.getRegisteredInstanceType(\n\t\t\"identityResolverComponent\"\n\t);\n\tconst identityResolverComponent = ComponentFactory.get<IIdentityResolverComponent>(\n\t\tdefaultIdentityResolverComponentType\n\t);\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\tlet createMethod = true;\n\tlet verificationMethod;\n\n\t// We only need to perform the overwrite check if a verification method ID was provided\n\t// otherwise a new ID will be generated\n\tif (Is.stringValue(params.verificationMethodId)) {\n\t\tif (params.overwriteMode === \"skip\" || params.overwriteMode === \"error\") {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.resolvingIdentity\"\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst identityDoc = await identityResolverComponent.identityResolve(params.identity);\n\t\t\ttry {\n\t\t\t\tverificationMethod = DocumentHelper.getVerificationMethod(\n\t\t\t\t\tidentityDoc,\n\t\t\t\t\tDocumentHelper.joinId(params.identity, params.verificationMethodId),\n\t\t\t\t\tparams.verificationMethodType\n\t\t\t\t);\n\t\t\t} catch {}\n\n\t\t\tif (!Is.empty(verificationMethod)) {\n\t\t\t\tif (params.overwriteMode === \"error\") {\n\t\t\t\t\tthrow new GeneralError(\n\t\t\t\t\t\t\"identityVerificationMethodCreate\",\n\t\t\t\t\t\t\"verificationMethodAlreadyExists\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Verify the vault key also exists before skipping.\n\t\t\t\t// The verification method may exist in the identity document while the\n\t\t\t\t// vault key is missing (e.g. database wipe, renameKey partial failure).\n\t\t\t\t// In that case we must NOT skip the addVerificationMethod will re-create\n\t\t\t\t// the vault key and update the method.\n\t\t\t\tlet vaultKeyExists = false;\n\t\t\t\ttry {\n\t\t\t\t\tconst keyParts = DocumentHelper.parseId(verificationMethod.id);\n\t\t\t\t\tawait vaultConnector.getKey(`${params.identity}/${keyParts.fragment}`);\n\t\t\t\t\tvaultKeyExists = true;\n\t\t\t\t} catch {}\n\n\t\t\t\tif (vaultKeyExists) {\n\t\t\t\t\tcreateMethod = false;\n\t\t\t\t\tCLIDisplay.task(\n\t\t\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.skipping\"\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (createMethod) {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.creatingVerificationMethod\"\n\t\t\t)\n\t\t);\n\t\tCLIDisplay.spinnerStart();\n\n\t\tverificationMethod = await identityConnector.addVerificationMethod(\n\t\t\tparams.controller ?? params.identity,\n\t\t\tparams.identity,\n\t\t\tparams.verificationMethodType as DidVerificationMethodType,\n\t\t\tparams.verificationMethodId\n\t\t);\n\n\t\tCLIDisplay.spinnerStop();\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.createdVerificationMethod\"\n\t\t\t)\n\t\t);\n\t}\n\n\tlet json;\n\n\tif (!Is.empty(verificationMethod)) {\n\t\tconst keyParts = DocumentHelper.parseId(verificationMethod.id);\n\n\t\tconst keyPair = await vaultConnector.getKey(`${params.identity}/${keyParts.fragment}`);\n\t\tconst privateKeyBase64Url = Converter.bytesToBase64Url(keyPair.privateKey);\n\t\tconst publicKeyBase64Url = Is.uint8Array(keyPair.publicKey)\n\t\t\t? Converter.bytesToBase64Url(keyPair.publicKey)\n\t\t\t: \"\";\n\t\tconst privateKeyBase64 = Converter.bytesToBase64(keyPair.privateKey);\n\t\tconst publicKeyBase64 = Is.uint8Array(keyPair.publicKey)\n\t\t\t? Converter.bytesToBase64(keyPair.publicKey)\n\t\t\t: \"\";\n\n\t\tconst privateKeyHex = Converter.bytesToHex(keyPair.privateKey, true);\n\t\tconst publicKeyHex = Is.uint8Array(keyPair.publicKey)\n\t\t\t? Converter.bytesToHex(keyPair.publicKey, true)\n\t\t\t: \"\";\n\n\t\tconst jwk = await Jwk.fromEd25519Private(keyPair.privateKey);\n\t\tconst kid = await Jwk.generateKid(jwk);\n\n\t\tCLIDisplay.break();\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.verificationMethodId\"\n\t\t\t),\n\t\t\tverificationMethod.id\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.verificationMethodType\"\n\t\t\t),\n\t\t\tverificationMethod.type\n\t\t);\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"node.cli.commands.identity-verification-method-create.labels.kid\"),\n\t\t\tkid\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.privateKeyBase64Url\"\n\t\t\t),\n\t\t\tprivateKeyBase64Url\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.publicKeyBase64Url\"\n\t\t\t),\n\t\t\tpublicKeyBase64Url\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.privateKeyBase64\"\n\t\t\t),\n\t\t\tprivateKeyBase64\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.publicKeyBase64\"\n\t\t\t),\n\t\t\tpublicKeyBase64\n\t\t);\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.privateKeyHex\"\n\t\t\t),\n\t\t\tprivateKeyHex\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.publicKeyHex\"\n\t\t\t),\n\t\t\tpublicKeyHex\n\t\t);\n\n\t\tCLIDisplay.break();\n\n\t\tjson = {\n\t\t\tverificationMethodId: verificationMethod.id,\n\t\t\tverificationMethodType: verificationMethod.type,\n\t\t\tprivateKeyJwk: {\n\t\t\t\tkid,\n\t\t\t\t...jwk\n\t\t\t},\n\t\t\tprivateKeyHex,\n\t\t\tpublicKeyHex,\n\t\t\tprivateKeyBase64,\n\t\t\tpublicKeyBase64\n\t\t};\n\n\t\tif (Is.stringValue(params.outputJson)) {\n\t\t\tawait CLIUtils.writeJsonFile(params.outputJson, json, false);\n\t\t}\n\n\t\tif (Is.stringValue(params.outputEnv)) {\n\t\t\tconst output = [\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_ID=\"${verificationMethod.id}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_TYPE=\"${verificationMethod.type}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_KID=\"${kid}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_KTY=\"${jwk.kty}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_USE=\"${jwk.use}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_ALG=\"${jwk.alg}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_CRV=\"${jwk.crv}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_X=\"${jwk.x}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_D=\"${jwk.d}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PRIVATE_KEY_HEX=\"${privateKeyHex}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PUBLIC_KEY_HEX=\"${publicKeyHex}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PRIVATE_KEY_BASE64=\"${privateKeyBase64}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PUBLIC_KEY_BASE64=\"${publicKeyBase64}\"`\n\t\t\t];\n\t\t\tawait CLIUtils.writeEnvFile(params.outputEnv, output, false);\n\t\t}\n\t}\n\n\tCLIDisplay.done();\n\n\treturn json;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"identityVerificationMethodCreate.js","sourceRoot":"","sources":["../../../src/commands/identityVerificationMethodCreate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay, CLIUtils } from \"@twin.org/cli-core\";\nimport { ComponentFactory, Converter, GeneralError, Guards, I18n, Is } from \"@twin.org/core\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport {\n\tDid,\n\tDocumentHelper,\n\tIdentityConnectorFactory,\n\ttype IIdentityResolverComponent\n} from \"@twin.org/identity-models\";\nimport { DidVerificationMethodType } from \"@twin.org/standards-w3c-did\";\nimport { VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport { type IJwk, Jwk } from \"@twin.org/web\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-verification-method-create\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityVerificationMethodCreate(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\n\t\t\t\"node.cli.commands.identity-verification-method-create.description\"\n\t\t),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-verification-method-create.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"controller\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.controller.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-type\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.verification-method-type.description\"\n\t\t\t\t),\n\t\t\t\toptions: Object.values(DidVerificationMethodType),\n\t\t\t\trequired: false,\n\t\t\t\tdefaultValue: \"assertionMethod\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.verification-method-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"overwrite-mode\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.overwrite-mode.description\"\n\t\t\t\t),\n\t\t\t\toptions: [\"skip\", \"overwrite\", \"error\"],\n\t\t\t\tdefaultValue: \"skip\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-json\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.output-json.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.output-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.params.output-env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) =>\n\t\t\tidentityVerificationMethodCreate(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for creating an identity verification method.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.identity The DID of the identity to create.\n * @param params.verificationMethodType The type of verification method to create.\n * @param params.verificationMethodId The ID of the verification method to create.\n * @param params.controller The controller DID for the identity.\n * @param params.overwriteMode The mode to use when a verification method with the same ID already exists.\n * @param params.outputJson The output .json file to store the command output.\n * @param params.outputEnv The output .env file to store the command output.\n * @param params.outputEnvPrefix The prefix to use for variables in the output .env file.\n * @returns The created verification method details or undefined if skipped.\n */\nexport async function identityVerificationMethodCreate(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tidentity?: string;\n\t\tverificationMethodType?: DidVerificationMethodType;\n\t\tverificationMethodId?: string;\n\t\tcontroller?: string;\n\t\toverwriteMode?: \"skip\" | \"overwrite\" | \"error\";\n\t\toutputJson?: string;\n\t\toutputEnv?: string;\n\t\toutputEnvPrefix?: string;\n\t}\n): Promise<\n\t| {\n\t\t\tverificationMethodId: string;\n\t\t\tverificationMethodType: string;\n\t\t\tprivateKeyJwk: IJwk;\n\t\t\tprivateKeyHex: string;\n\t\t\tpublicKeyHex: string;\n\t\t\tprivateKeyBase64: string;\n\t\t\tpublicKeyBase64: string;\n\t }\n\t| undefined\n> {\n\tDid.guard(\"identityVerificationMethodCreate\", \"identity\", params.identity);\n\tGuards.arrayOneOf(\n\t\t\"identityVerificationMethodCreate\",\n\t\t\"verificationMethodType\",\n\t\tparams.verificationMethodType,\n\t\tObject.values(DidVerificationMethodType)\n\t);\n\tGuards.arrayOneOf(\"identityVerificationMethodCreate\", \"overwrite-mode\", params.overwriteMode, [\n\t\t\"skip\",\n\t\t\"overwrite\",\n\t\t\"error\"\n\t]);\n\n\tconst defaultIdentityConnectorType = engineCore.getRegisteredInstanceType(\"identityConnector\");\n\tconst identityConnector = IdentityConnectorFactory.get(defaultIdentityConnectorType);\n\n\tconst defaultIdentityResolverComponentType = engineCore.getRegisteredInstanceType(\n\t\t\"identityResolverComponent\"\n\t);\n\tconst identityResolverComponent = ComponentFactory.get<IIdentityResolverComponent>(\n\t\tdefaultIdentityResolverComponentType\n\t);\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\tlet createMethod = true;\n\tlet verificationMethod;\n\n\t// We only need to perform the overwrite check if a verification method ID was provided\n\t// otherwise a new ID will be generated\n\tif (Is.stringValue(params.verificationMethodId)) {\n\t\tif (params.overwriteMode === \"skip\" || params.overwriteMode === \"error\") {\n\t\t\tCLIDisplay.task(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.resolvingIdentity\"\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tconst identityDoc = await identityResolverComponent.identityResolve(params.identity);\n\t\t\ttry {\n\t\t\t\tverificationMethod = DocumentHelper.getVerificationMethod(\n\t\t\t\t\tidentityDoc,\n\t\t\t\t\tDocumentHelper.joinId(params.identity, params.verificationMethodId),\n\t\t\t\t\tparams.verificationMethodType\n\t\t\t\t);\n\t\t\t} catch {}\n\n\t\t\tif (!Is.empty(verificationMethod)) {\n\t\t\t\tif (params.overwriteMode === \"error\") {\n\t\t\t\t\tthrow new GeneralError(\n\t\t\t\t\t\t\"identityVerificationMethodCreate\",\n\t\t\t\t\t\t\"verificationMethodAlreadyExists\"\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Verify the vault key also exists before skipping.\n\t\t\t\t// The verification method may exist in the identity document while the\n\t\t\t\t// vault key is missing (e.g. database wipe, renameKey partial failure).\n\t\t\t\t// In that case we must NOT skip the addVerificationMethod will re-create\n\t\t\t\t// the vault key and update the method.\n\t\t\t\tlet vaultKeyExists = false;\n\t\t\t\ttry {\n\t\t\t\t\tconst keyParts = DocumentHelper.parseId(verificationMethod.id);\n\t\t\t\t\tawait vaultConnector.getKey(`${params.identity}/${keyParts.fragment}`);\n\t\t\t\t\tvaultKeyExists = true;\n\t\t\t\t} catch {}\n\n\t\t\t\tif (vaultKeyExists) {\n\t\t\t\t\tcreateMethod = false;\n\t\t\t\t\tCLIDisplay.task(\n\t\t\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.skipping\"\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (createMethod) {\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.creatingVerificationMethod\"\n\t\t\t)\n\t\t);\n\t\tCLIDisplay.spinnerStart();\n\n\t\tverificationMethod = await identityConnector.addVerificationMethod(\n\t\t\tparams.controller ?? params.identity,\n\t\t\tparams.identity,\n\t\t\tparams.verificationMethodType as DidVerificationMethodType,\n\t\t\tparams.verificationMethodId\n\t\t);\n\n\t\tCLIDisplay.spinnerStop();\n\t\tCLIDisplay.task(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.createdVerificationMethod\"\n\t\t\t)\n\t\t);\n\t}\n\n\tlet json;\n\n\tif (!Is.empty(verificationMethod)) {\n\t\tconst keyParts = DocumentHelper.parseId(verificationMethod.id);\n\n\t\tconst keyPair = await vaultConnector.getKey(`${params.identity}/${keyParts.fragment}`);\n\t\tconst privateKeyBase64Url = Converter.bytesToBase64Url(keyPair.privateKey);\n\t\tconst publicKeyBase64Url = Is.uint8Array(keyPair.publicKey)\n\t\t\t? Converter.bytesToBase64Url(keyPair.publicKey)\n\t\t\t: \"\";\n\t\tconst privateKeyBase64 = Converter.bytesToBase64(keyPair.privateKey);\n\t\tconst publicKeyBase64 = Is.uint8Array(keyPair.publicKey)\n\t\t\t? Converter.bytesToBase64(keyPair.publicKey)\n\t\t\t: \"\";\n\n\t\tconst privateKeyHex = Converter.bytesToHex(keyPair.privateKey, true);\n\t\tconst publicKeyHex = Is.uint8Array(keyPair.publicKey)\n\t\t\t? Converter.bytesToHex(keyPair.publicKey, true)\n\t\t\t: \"\";\n\n\t\tconst jwk = await Jwk.fromEd25519Private(keyPair.privateKey);\n\t\tconst kid = await Jwk.generateKid(jwk);\n\n\t\tif (createMethod) {\n\t\t\tCLIDisplay.break();\n\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.verificationMethodId\"\n\t\t\t\t),\n\t\t\t\tverificationMethod.id\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.verificationMethodType\"\n\t\t\t\t),\n\t\t\t\tverificationMethod.type\n\t\t\t);\n\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\"node.cli.commands.identity-verification-method-create.labels.kid\"),\n\t\t\t\tkid\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.privateKeyBase64Url\"\n\t\t\t\t),\n\t\t\t\tprivateKeyBase64Url\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.publicKeyBase64Url\"\n\t\t\t\t),\n\t\t\t\tpublicKeyBase64Url\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.privateKeyBase64\"\n\t\t\t\t),\n\t\t\t\tprivateKeyBase64\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.publicKeyBase64\"\n\t\t\t\t),\n\t\t\t\tpublicKeyBase64\n\t\t\t);\n\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.privateKeyHex\"\n\t\t\t\t),\n\t\t\t\tprivateKeyHex\n\t\t\t);\n\t\t\tCLIDisplay.value(\n\t\t\t\tI18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-create.labels.publicKeyHex\"\n\t\t\t\t),\n\t\t\t\tpublicKeyHex\n\t\t\t);\n\n\t\t\tCLIDisplay.break();\n\t\t}\n\n\t\tjson = {\n\t\t\tverificationMethodId: verificationMethod.id,\n\t\t\tverificationMethodType: verificationMethod.type,\n\t\t\tprivateKeyJwk: {\n\t\t\t\tkid,\n\t\t\t\t...jwk\n\t\t\t},\n\t\t\tprivateKeyHex,\n\t\t\tpublicKeyHex,\n\t\t\tprivateKeyBase64,\n\t\t\tpublicKeyBase64\n\t\t};\n\n\t\tif (Is.stringValue(params.outputJson)) {\n\t\t\tawait CLIUtils.writeJsonFile(params.outputJson, json, false);\n\t\t}\n\n\t\tif (Is.stringValue(params.outputEnv)) {\n\t\t\tconst output = [\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_ID=\"${verificationMethod.id}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_TYPE=\"${verificationMethod.type}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_KID=\"${kid}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_KTY=\"${jwk.kty}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_USE=\"${jwk.use}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_ALG=\"${jwk.alg}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_CRV=\"${jwk.crv}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_X=\"${jwk.x}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_JWK_D=\"${jwk.d}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PRIVATE_KEY_HEX=\"${privateKeyHex}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PUBLIC_KEY_HEX=\"${publicKeyHex}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PRIVATE_KEY_BASE64=\"${privateKeyBase64}\"`,\n\t\t\t\t`${params.outputEnvPrefix}DID_VERIFICATION_METHOD_PUBLIC_KEY_BASE64=\"${publicKeyBase64}\"`\n\t\t\t];\n\t\t\tawait CLIUtils.writeEnvFile(params.outputEnv, output, false);\n\t\t}\n\t}\n\n\tCLIDisplay.done();\n\n\treturn json;\n}\n"]}
|
|
@@ -69,7 +69,7 @@ export function getCommandDefinitionIdentityVerificationMethodImport(commandDefi
|
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
/**
|
|
72
|
-
* Command for
|
|
72
|
+
* Command for importing an existing key as a verification method on an identity document.
|
|
73
73
|
* @param engineCore The engine core.
|
|
74
74
|
* @param envVars The environment variables for the node.
|
|
75
75
|
* @param params The parameters for the command.
|
|
@@ -78,6 +78,7 @@ export function getCommandDefinitionIdentityVerificationMethodImport(commandDefi
|
|
|
78
78
|
* @param params.verificationMethodId The ID of the verification method to create.
|
|
79
79
|
* @param params.controller The controller DID for the identity.
|
|
80
80
|
* @param params.privateKeyHex The private key in hex format.
|
|
81
|
+
* @returns A promise that resolves when the verification method has been imported.
|
|
81
82
|
*/
|
|
82
83
|
export async function identityVerificationMethodImport(engineCore, envVars, params) {
|
|
83
84
|
Did.guard("identityVerificationMethodImport", "identity", params.identity);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identityVerificationMethodImport.js","sourceRoot":"","sources":["../../../src/commands/identityVerificationMethodImport.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { Converter, GeneralError, Guards, HexHelper, I18n, Is } from \"@twin.org/core\";\nimport { Ed25519 } from \"@twin.org/crypto\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport {\n\tDid,\n\tDocumentHelper,\n\tIdentityConnectorFactory,\n\tIdentityResolverConnectorFactory\n} from \"@twin.org/identity-models\";\nimport { DidVerificationMethodType } from \"@twin.org/standards-w3c-did\";\nimport { VaultConnectorFactory, VaultKeyType } from \"@twin.org/vault-models\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-verification-method-import\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityVerificationMethodImport(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\n\t\t\t\"node.cli.commands.identity-verification-method-import.description\"\n\t\t),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-verification-method-import.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"controller\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.controller.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-type\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.verification-method-type.description\"\n\t\t\t\t),\n\t\t\t\toptions: Object.values(DidVerificationMethodType),\n\t\t\t\trequired: true,\n\t\t\t\tdefaultValue: \"assertionMethod\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.verification-method-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"private-key-hex\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.private-key-hex.description\"\n\t\t\t\t),\n\t\t\t\trequired: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) =>\n\t\t\tidentityVerificationMethodImport(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for creating an identity verification method.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.identity The DID of the identity to create.\n * @param params.verificationMethodType The type of verification method to create.\n * @param params.verificationMethodId The ID of the verification method to create.\n * @param params.controller The controller DID for the identity.\n * @param params.privateKeyHex The private key in hex format.\n */\nexport async function identityVerificationMethodImport(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tidentity?: string;\n\t\tverificationMethodType?: DidVerificationMethodType;\n\t\tverificationMethodId?: string;\n\t\tcontroller?: string;\n\t\tprivateKeyHex?: string;\n\t}\n): Promise<void> {\n\tDid.guard(\"identityVerificationMethodImport\", \"identity\", params.identity);\n\tGuards.arrayOneOf(\n\t\t\"identityVerificationMethodImport\",\n\t\t\"verification-method-type\",\n\t\tparams.verificationMethodType,\n\t\tObject.values(DidVerificationMethodType)\n\t);\n\tGuards.stringValue(\n\t\t\"identityVerificationMethodImport\",\n\t\t\"verification-method-id\",\n\t\tparams.verificationMethodId\n\t);\n\tGuards.stringHex(\n\t\t\"identityVerificationMethodImport\",\n\t\t\"private-key-hex\",\n\t\tparams.privateKeyHex,\n\t\ttrue\n\t);\n\tconst defaultIdentityConnectorType = engineCore.getRegisteredInstanceType(\"identityConnector\");\n\tconst identityConnector = IdentityConnectorFactory.get(defaultIdentityConnectorType);\n\n\tconst defaultIdentityResolverConnectorType = engineCore.getRegisteredInstanceType(\n\t\t\"identityResolverConnector\"\n\t);\n\n\tconst identityResolverConnector = IdentityResolverConnectorFactory.get(\n\t\tdefaultIdentityResolverConnectorType\n\t);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\n\t\t\t\"node.cli.commands.identity-verification-method-import.labels.resolvingIdentity\"\n\t\t)\n\t);\n\tconst identityDocument = await identityResolverConnector.resolveDocument(params.identity);\n\n\tif (Is.empty(identityDocument)) {\n\t\tthrow new GeneralError(\"identityImport\", \"identityNotFound\", {\n\t\t\tidentity: params.identity\n\t\t});\n\t}\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-verification-method-import.labels.importing\")\n\t);\n\tCLIDisplay.spinnerStart();\n\n\tlet verificationMethodId = params.verificationMethodId;\n\tif (verificationMethodId.includes(\"#\")) {\n\t\tconst parts = DocumentHelper.parseId(verificationMethodId);\n\t\tif (Is.stringValue(parts.fragment)) {\n\t\t\tverificationMethodId = parts.fragment;\n\t\t}\n\t}\n\n\tlet vaultKey;\n\tconst vaultKeyId = `${params.identity}/${verificationMethodId}`;\n\n\ttry {\n\t\tvaultKey = await vaultConnector.getKey(vaultKeyId);\n\t} catch {}\n\n\tif (Is.empty(vaultKey)) {\n\t\tconst privateKeyBytes = Converter.hexToBytes(HexHelper.stripPrefix(params.privateKeyHex));\n\t\tconst publicKeyBytes = Ed25519.publicKeyFromPrivateKey(privateKeyBytes);\n\t\tawait vaultConnector.addKey(vaultKeyId, VaultKeyType.Ed25519, privateKeyBytes, publicKeyBytes);\n\t}\n\n\tawait identityConnector.addVerificationMethod(\n\t\tparams.controller ?? params.identity,\n\t\tparams.identity,\n\t\tparams.verificationMethodType as DidVerificationMethodType,\n\t\tverificationMethodId\n\t);\n\n\tCLIDisplay.spinnerStop();\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-verification-method-import.labels.imported\")\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.done();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"identityVerificationMethodImport.js","sourceRoot":"","sources":["../../../src/commands/identityVerificationMethodImport.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { Converter, GeneralError, Guards, HexHelper, I18n, Is } from \"@twin.org/core\";\nimport { Ed25519 } from \"@twin.org/crypto\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport {\n\tDid,\n\tDocumentHelper,\n\tIdentityConnectorFactory,\n\tIdentityResolverConnectorFactory\n} from \"@twin.org/identity-models\";\nimport { DidVerificationMethodType } from \"@twin.org/standards-w3c-did\";\nimport { VaultConnectorFactory, VaultKeyType } from \"@twin.org/vault-models\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"../models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"identity-verification-method-import\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionIdentityVerificationMethodImport(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\n\t\t\t\"node.cli.commands.identity-verification-method-import.description\"\n\t\t),\n\t\texample: I18n.formatMessage(\"node.cli.commands.identity-verification-method-import.example\"),\n\t\trequiresNodeIdentity: false,\n\t\trequiresOrgIdentity: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"env-prefix\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.env-prefix.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"identity\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.identity.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"controller\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.controller.description\"\n\t\t\t\t),\n\t\t\t\textendedType: \"did\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-type\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.verification-method-type.description\"\n\t\t\t\t),\n\t\t\t\toptions: Object.values(DidVerificationMethodType),\n\t\t\t\trequired: true,\n\t\t\t\tdefaultValue: \"assertionMethod\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"verification-method-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.verification-method-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"private-key-hex\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.private-key-hex.description\"\n\t\t\t\t),\n\t\t\t\trequired: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"load-env\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.identity-verification-method-import.params.load-env.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) =>\n\t\t\tidentityVerificationMethodImport(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for importing an existing key as a verification method on an identity document.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.identity The DID of the identity to create.\n * @param params.verificationMethodType The type of verification method to create.\n * @param params.verificationMethodId The ID of the verification method to create.\n * @param params.controller The controller DID for the identity.\n * @param params.privateKeyHex The private key in hex format.\n * @returns A promise that resolves when the verification method has been imported.\n */\nexport async function identityVerificationMethodImport(\n\tengineCore: IEngineCore<INodeEngineConfig, INodeEngineState>,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\tidentity?: string;\n\t\tverificationMethodType?: DidVerificationMethodType;\n\t\tverificationMethodId?: string;\n\t\tcontroller?: string;\n\t\tprivateKeyHex?: string;\n\t}\n): Promise<void> {\n\tDid.guard(\"identityVerificationMethodImport\", \"identity\", params.identity);\n\tGuards.arrayOneOf(\n\t\t\"identityVerificationMethodImport\",\n\t\t\"verification-method-type\",\n\t\tparams.verificationMethodType,\n\t\tObject.values(DidVerificationMethodType)\n\t);\n\tGuards.stringValue(\n\t\t\"identityVerificationMethodImport\",\n\t\t\"verification-method-id\",\n\t\tparams.verificationMethodId\n\t);\n\tGuards.stringHex(\n\t\t\"identityVerificationMethodImport\",\n\t\t\"private-key-hex\",\n\t\tparams.privateKeyHex,\n\t\ttrue\n\t);\n\tconst defaultIdentityConnectorType = engineCore.getRegisteredInstanceType(\"identityConnector\");\n\tconst identityConnector = IdentityConnectorFactory.get(defaultIdentityConnectorType);\n\n\tconst defaultIdentityResolverConnectorType = engineCore.getRegisteredInstanceType(\n\t\t\"identityResolverConnector\"\n\t);\n\n\tconst identityResolverConnector = IdentityResolverConnectorFactory.get(\n\t\tdefaultIdentityResolverConnectorType\n\t);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\n\t\t\t\"node.cli.commands.identity-verification-method-import.labels.resolvingIdentity\"\n\t\t)\n\t);\n\tconst identityDocument = await identityResolverConnector.resolveDocument(params.identity);\n\n\tif (Is.empty(identityDocument)) {\n\t\tthrow new GeneralError(\"identityImport\", \"identityNotFound\", {\n\t\t\tidentity: params.identity\n\t\t});\n\t}\n\n\tconst defaultVaultConnectorType = engineCore.getRegisteredInstanceType(\"vaultConnector\");\n\tconst vaultConnector = VaultConnectorFactory.get(defaultVaultConnectorType);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-verification-method-import.labels.importing\")\n\t);\n\tCLIDisplay.spinnerStart();\n\n\tlet verificationMethodId = params.verificationMethodId;\n\tif (verificationMethodId.includes(\"#\")) {\n\t\tconst parts = DocumentHelper.parseId(verificationMethodId);\n\t\tif (Is.stringValue(parts.fragment)) {\n\t\t\tverificationMethodId = parts.fragment;\n\t\t}\n\t}\n\n\tlet vaultKey;\n\tconst vaultKeyId = `${params.identity}/${verificationMethodId}`;\n\n\ttry {\n\t\tvaultKey = await vaultConnector.getKey(vaultKeyId);\n\t} catch {}\n\n\tif (Is.empty(vaultKey)) {\n\t\tconst privateKeyBytes = Converter.hexToBytes(HexHelper.stripPrefix(params.privateKeyHex));\n\t\tconst publicKeyBytes = Ed25519.publicKeyFromPrivateKey(privateKeyBytes);\n\t\tawait vaultConnector.addKey(vaultKeyId, VaultKeyType.Ed25519, privateKeyBytes, publicKeyBytes);\n\t}\n\n\tawait identityConnector.addVerificationMethod(\n\t\tparams.controller ?? params.identity,\n\t\tparams.identity,\n\t\tparams.verificationMethodType as DidVerificationMethodType,\n\t\tverificationMethodId\n\t);\n\n\tCLIDisplay.spinnerStop();\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"node.cli.commands.identity-verification-method-import.labels.imported\")\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.done();\n}\n"]}
|
|
@@ -45,6 +45,7 @@ export function getCommandDefinitionNodeSetIdentity(commandDefinitions) {
|
|
|
45
45
|
* @param envVars The environment variables for the node.
|
|
46
46
|
* @param params The parameters for the command.
|
|
47
47
|
* @param params.identity The DID to set for the node.
|
|
48
|
+
* @returns A promise that resolves when the node identity has been persisted.
|
|
48
49
|
*/
|
|
49
50
|
export async function nodeSetIdentity(engineCore, envVars, params) {
|
|
50
51
|
Did.guard("nodeSetIdentity", "identity", params.identity);
|
|
@@ -56,6 +57,10 @@ export async function nodeSetIdentity(engineCore, envVars, params) {
|
|
|
56
57
|
throw new NotFoundError("nodeSetIdentity", "identityNotFound", params.identity);
|
|
57
58
|
}
|
|
58
59
|
const state = engineCore.getState();
|
|
60
|
+
if (state.nodeId === params.identity) {
|
|
61
|
+
CLIDisplay.task(I18n.formatMessage("node.cli.commands.node-set-identity.labels.skipping"));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
59
64
|
state.nodeId = params.identity;
|
|
60
65
|
engineCore.setStateDirty();
|
|
61
66
|
CLIDisplay.task(I18n.formatMessage("node.cli.commands.node-set-identity.labels.stored"));
|