diff --git a/src/secrets/CommandCat.ts b/src/secrets/CommandCat.ts index 96b65b7a..4f6885c9 100644 --- a/src/secrets/CommandCat.ts +++ b/src/secrets/CommandCat.ts @@ -85,7 +85,7 @@ class CommandGet extends CommandPolykey { for (const [vaultName, secretPath] of secretPaths) { await writer.write({ nameOrId: vaultName, - secretName: secretPath, + secretName: secretPath ?? '/', metadata: first ? { ...auth, options: { continueOnError: true } } : undefined, diff --git a/src/secrets/CommandEdit.ts b/src/secrets/CommandEdit.ts index 7a615d1e..f89269e1 100644 --- a/src/secrets/CommandEdit.ts +++ b/src/secrets/CommandEdit.ts @@ -17,7 +17,7 @@ class CommandEdit extends CommandPolykey { this.argument( '', 'Path to the secret to be edited, specified as :', - binParsers.parseSecretPathValue, + binParsers.parseSecretPath, ); this.addOption(binOptions.nodeId); this.addOption(binOptions.clientHost); @@ -68,7 +68,7 @@ class CommandEdit extends CommandPolykey { const writer = res.writable.getWriter(); await writer.write({ nameOrId: secretPath[0], - secretName: secretPath[1], + secretName: secretPath[1] ?? '/', metadata: auth, }); await writer.close(); diff --git a/src/secrets/CommandList.ts b/src/secrets/CommandList.ts index ef0c1f8f..a1a7fc26 100644 --- a/src/secrets/CommandList.ts +++ b/src/secrets/CommandList.ts @@ -14,7 +14,7 @@ class CommandList extends CommandPolykey { this.argument( '', 'Directory to list files from, specified as [:]', - binParsers.parseSecretPathOptional, + binParsers.parseSecretPath, ); this.addOption(binOptions.nodeId); this.addOption(binOptions.clientHost); diff --git a/src/secrets/CommandRemove.ts b/src/secrets/CommandRemove.ts index 9fa527c3..d5ee7d58 100644 --- a/src/secrets/CommandRemove.ts +++ b/src/secrets/CommandRemove.ts @@ -21,7 +21,7 @@ class CommandRemove extends CommandPolykey { this.addOption(binOptions.recursive); this.action(async (secretPaths, options) => { secretPaths = secretPaths.map((path: string) => - binParsers.parseSecretPathValue(path), + binParsers.parseSecretPath(path), ); const { default: PolykeyClient } = await import( 'polykey/dist/PolykeyClient' diff --git a/src/secrets/CommandStat.ts b/src/secrets/CommandStat.ts index 26633aee..78bd561e 100644 --- a/src/secrets/CommandStat.ts +++ b/src/secrets/CommandStat.ts @@ -13,7 +13,7 @@ class CommandStat extends CommandPolykey { this.argument( '', 'Path to where the secret, specified as :', - binParsers.parseSecretPathValue, + binParsers.parseSecretPath, ); this.addOption(binOptions.nodeId); this.addOption(binOptions.clientHost); diff --git a/src/secrets/CommandWrite.ts b/src/secrets/CommandWrite.ts index 76bbad22..05192174 100644 --- a/src/secrets/CommandWrite.ts +++ b/src/secrets/CommandWrite.ts @@ -13,7 +13,7 @@ class CommandWrite extends CommandPolykey { this.argument( '', 'Path to the secret, specified as :', - binParsers.parseSecretPathValue, + binParsers.parseSecretPath, ); this.addOption(binOptions.nodeId); this.addOption(binOptions.clientHost); diff --git a/src/utils/parsers.ts b/src/utils/parsers.ts index b0d026fe..cb163f69 100644 --- a/src/utils/parsers.ts +++ b/src/utils/parsers.ts @@ -65,12 +65,12 @@ function parseCoreCount(v: string): number | undefined { } } -function parseSecretPathOptional( - secretPath: string, -): [string, string?, string?] { +function parseSecretPath(secretPath: string): [string, string?, string?] { // E.g. If 'vault1:a/b/c', ['vault1', 'a/b/c'] is returned // If 'vault1', ['vault1, undefined] is returned - // splits out everything after an `=` separator + // If 'vault1:', an error is thrown + // If 'a/b/c', an error is thrown + // Splits out everything after an `=` separator const lastEqualIndex = secretPath.lastIndexOf('='); const splitSecretPath = lastEqualIndex === -1 @@ -89,18 +89,6 @@ function parseSecretPathOptional( return [vaultName, directoryPath, value]; } -function parseSecretPath(secretPath: string): [string, string, string?] { - // E.g. If 'vault1:a/b/c', ['vault1', 'a/b/c'] is returned - // If 'vault1', an error is thrown - const [vaultName, secretName, value] = parseSecretPathOptional(secretPath); - if (secretName === undefined) { - throw new commander.InvalidArgumentError( - `${secretPath} is not of the format :[=]`, - ); - } - return [vaultName, secretName, value]; -} - function parseSecretPathValue(secretPath: string): [string, string, string?] { const [vaultName, directoryPath, value] = parseSecretPath(secretPath); if (value != null && !secretPathValueRegex.test(value)) { @@ -108,6 +96,11 @@ function parseSecretPathValue(secretPath: string): [string, string, string?] { `${value} is not a valid value name`, ); } + if (directoryPath == null) { + throw new commander.InvalidArgumentError( + `${secretPath} is not of the format :[=]`, + ); + } return [vaultName, directoryPath, value]; } @@ -118,6 +111,11 @@ function parseSecretPathEnv(secretPath: string): [string, string, string?] { `${value} is not a valid environment variable name`, ); } + if (directoryPath == null) { + throw new commander.InvalidArgumentError( + `${secretPath} is not of the format :[=]`, + ); + } return [vaultName, directoryPath, value]; } @@ -221,7 +219,6 @@ export { validateParserToArgParser, validateParserToArgListParser, parseCoreCount, - parseSecretPathOptional, parseSecretPath, parseSecretPathValue, parseSecretPathEnv,