@celilo/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1566 -0
- package/bin/celilo +16 -0
- package/drizzle/0000_complex_puma.sql +179 -0
- package/drizzle/0001_dizzy_wolfpack.sql +2 -0
- package/drizzle/0002_web_routes.sql +16 -0
- package/drizzle/0003_backup_storage.sql +32 -0
- package/drizzle/meta/0000_snapshot.json +1151 -0
- package/drizzle/meta/0001_snapshot.json +1167 -0
- package/drizzle/meta/0002_snapshot.json +1257 -0
- package/drizzle/meta/_journal.json +27 -0
- package/package.json +64 -0
- package/schemas/system_config.json +106 -0
- package/src/__integration__/container-services-cli.integration.test.ts +246 -0
- package/src/ansible/dependencies.test.ts +309 -0
- package/src/ansible/dependencies.ts +896 -0
- package/src/ansible/inventory.test.ts +463 -0
- package/src/ansible/inventory.ts +445 -0
- package/src/ansible/secrets.ts +222 -0
- package/src/ansible/validation.test.ts +92 -0
- package/src/ansible/validation.ts +272 -0
- package/src/api-clients/digitalocean.ts +94 -0
- package/src/api-clients/proxmox.ts +655 -0
- package/src/capabilities/logging-wrapper.test.ts +217 -0
- package/src/capabilities/lookup.test.ts +149 -0
- package/src/capabilities/lookup.ts +89 -0
- package/src/capabilities/public-web-helpers.test.ts +198 -0
- package/src/capabilities/public-web-publish.test.ts +458 -0
- package/src/capabilities/registration.test.ts +395 -0
- package/src/capabilities/registration.ts +200 -0
- package/src/capabilities/route-validation.test.ts +121 -0
- package/src/capabilities/route-validation.ts +96 -0
- package/src/capabilities/secret-ref.test.ts +313 -0
- package/src/capabilities/secret-validation.ts +157 -0
- package/src/capabilities/secrets.test.ts +750 -0
- package/src/capabilities/secrets.ts +244 -0
- package/src/capabilities/validation.test.ts +613 -0
- package/src/capabilities/validation.ts +160 -0
- package/src/capabilities/well-known.test.ts +238 -0
- package/src/capabilities/well-known.ts +222 -0
- package/src/cli/cli.test.ts +654 -0
- package/src/cli/command-registry.ts +742 -0
- package/src/cli/command-tree-parser.test.ts +180 -0
- package/src/cli/command-tree-parser.ts +193 -0
- package/src/cli/commands/backup-create.ts +137 -0
- package/src/cli/commands/backup-delete.ts +74 -0
- package/src/cli/commands/backup-import.ts +97 -0
- package/src/cli/commands/backup-list.ts +132 -0
- package/src/cli/commands/backup-name.ts +73 -0
- package/src/cli/commands/backup-prune.ts +98 -0
- package/src/cli/commands/backup-restore.ts +122 -0
- package/src/cli/commands/capability-info.ts +121 -0
- package/src/cli/commands/capability-list.ts +47 -0
- package/src/cli/commands/completion.ts +87 -0
- package/src/cli/commands/hook-run.ts +176 -0
- package/src/cli/commands/ipam.ts +607 -0
- package/src/cli/commands/machine-add.ts +235 -0
- package/src/cli/commands/machine-earmark.ts +82 -0
- package/src/cli/commands/machine-list.ts +77 -0
- package/src/cli/commands/machine-remove.ts +90 -0
- package/src/cli/commands/machine-status.ts +131 -0
- package/src/cli/commands/module-audit.ts +51 -0
- package/src/cli/commands/module-build.ts +60 -0
- package/src/cli/commands/module-config.ts +170 -0
- package/src/cli/commands/module-deploy.ts +71 -0
- package/src/cli/commands/module-generate.ts +236 -0
- package/src/cli/commands/module-health.ts +108 -0
- package/src/cli/commands/module-import.ts +80 -0
- package/src/cli/commands/module-list.ts +43 -0
- package/src/cli/commands/module-logs.ts +73 -0
- package/src/cli/commands/module-remove.ts +162 -0
- package/src/cli/commands/module-show.ts +208 -0
- package/src/cli/commands/module-status.ts +131 -0
- package/src/cli/commands/module-types.ts +189 -0
- package/src/cli/commands/module-upgrade.ts +192 -0
- package/src/cli/commands/package.ts +68 -0
- package/src/cli/commands/secret-list.ts +99 -0
- package/src/cli/commands/secret-set.ts +134 -0
- package/src/cli/commands/service-add-digitalocean.ts +133 -0
- package/src/cli/commands/service-add-proxmox.ts +342 -0
- package/src/cli/commands/service-config-get.ts +83 -0
- package/src/cli/commands/service-config-set.ts +145 -0
- package/src/cli/commands/service-list.ts +74 -0
- package/src/cli/commands/service-reconfigure.ts +230 -0
- package/src/cli/commands/service-remove.ts +103 -0
- package/src/cli/commands/service-verify.ts +240 -0
- package/src/cli/commands/status.ts +216 -0
- package/src/cli/commands/storage-add-local.ts +106 -0
- package/src/cli/commands/storage-add-s3.ts +114 -0
- package/src/cli/commands/storage-list.ts +72 -0
- package/src/cli/commands/storage-remove.ts +54 -0
- package/src/cli/commands/storage-set-default.ts +44 -0
- package/src/cli/commands/storage-verify.ts +54 -0
- package/src/cli/commands/system-config.ts +168 -0
- package/src/cli/commands/system-init.ts +314 -0
- package/src/cli/commands/system-secret-get.ts +98 -0
- package/src/cli/commands/system-secret-set.ts +76 -0
- package/src/cli/commands/system-vault-password.ts +34 -0
- package/src/cli/completion.test.ts +37 -0
- package/src/cli/completion.ts +482 -0
- package/src/cli/fuel-gauge.test.ts +208 -0
- package/src/cli/fuel-gauge.ts +405 -0
- package/src/cli/generate-zsh-completion.test.ts +95 -0
- package/src/cli/generate-zsh-completion.ts +497 -0
- package/src/cli/index.ts +1583 -0
- package/src/cli/interactive-config.test.ts +201 -0
- package/src/cli/interactive-config.ts +62 -0
- package/src/cli/parser.test.ts +227 -0
- package/src/cli/parser.ts +244 -0
- package/src/cli/prompts.test.ts +33 -0
- package/src/cli/prompts.ts +121 -0
- package/src/cli/types.ts +38 -0
- package/src/cli/validators.test.ts +235 -0
- package/src/cli/validators.ts +188 -0
- package/src/config/env.ts +41 -0
- package/src/config/paths.test.ts +172 -0
- package/src/config/paths.ts +108 -0
- package/src/db/client.ts +190 -0
- package/src/db/migrate.ts +30 -0
- package/src/db/schema.test.ts +221 -0
- package/src/db/schema.ts +434 -0
- package/src/hooks/capability-loader-firewall.test.ts +246 -0
- package/src/hooks/capability-loader.test.ts +100 -0
- package/src/hooks/capability-loader.ts +520 -0
- package/src/hooks/define-hook.test.ts +488 -0
- package/src/hooks/executor.test.ts +462 -0
- package/src/hooks/executor.ts +469 -0
- package/src/hooks/logger.test.ts +54 -0
- package/src/hooks/logger.ts +95 -0
- package/src/hooks/test-fixtures/failing-hook.ts +13 -0
- package/src/hooks/test-fixtures/no-default-hook.ts +6 -0
- package/src/hooks/test-fixtures/success-hook.ts +20 -0
- package/src/hooks/test-fixtures/unbranded-hook.ts +11 -0
- package/src/hooks/test-fixtures/void-hook.ts +13 -0
- package/src/hooks/types.ts +89 -0
- package/src/infrastructure/property-extractor.test.ts +194 -0
- package/src/infrastructure/property-extractor.ts +151 -0
- package/src/ipam/allocator.test.ts +442 -0
- package/src/ipam/allocator.ts +369 -0
- package/src/ipam/auto-allocator.test.ts +247 -0
- package/src/ipam/auto-allocator.ts +270 -0
- package/src/ipam/subnet-parser.test.ts +107 -0
- package/src/ipam/subnet-parser.ts +136 -0
- package/src/manifest/contracts/index.ts +61 -0
- package/src/manifest/contracts/v1.ts +118 -0
- package/src/manifest/json-schema-roundtrip.test.ts +99 -0
- package/src/manifest/schema.ts +367 -0
- package/src/manifest/template-validator.test.ts +231 -0
- package/src/manifest/template-validator.ts +322 -0
- package/src/manifest/validate.test.ts +1180 -0
- package/src/manifest/validate.ts +415 -0
- package/src/module/import.test.ts +355 -0
- package/src/module/import.ts +676 -0
- package/src/module/packaging/audit.ts +169 -0
- package/src/module/packaging/build.ts +228 -0
- package/src/module/packaging/checksum.ts +41 -0
- package/src/module/packaging/extract.ts +234 -0
- package/src/module/packaging/signature.ts +47 -0
- package/src/secrets/encryption.test.ts +284 -0
- package/src/secrets/encryption.ts +162 -0
- package/src/secrets/generators.test.ts +112 -0
- package/src/secrets/generators.ts +127 -0
- package/src/secrets/master-key.test.ts +159 -0
- package/src/secrets/master-key.ts +114 -0
- package/src/secrets/storage.test.ts +115 -0
- package/src/secrets/storage.ts +106 -0
- package/src/secrets/vault.test.ts +35 -0
- package/src/secrets/vault.ts +42 -0
- package/src/services/backup-create.ts +532 -0
- package/src/services/backup-metadata.ts +198 -0
- package/src/services/backup-restore.ts +229 -0
- package/src/services/backup-retention.ts +84 -0
- package/src/services/backup-storage.ts +281 -0
- package/src/services/build-stream.test.ts +122 -0
- package/src/services/build-stream.ts +201 -0
- package/src/services/config-interview.ts +694 -0
- package/src/services/container-service.test.ts +298 -0
- package/src/services/container-service.ts +401 -0
- package/src/services/cross-module-data-manager.test.ts +405 -0
- package/src/services/cross-module-data-manager.ts +412 -0
- package/src/services/deploy-ansible.ts +88 -0
- package/src/services/deploy-planner.ts +153 -0
- package/src/services/deploy-preflight.ts +274 -0
- package/src/services/deploy-ssh.ts +131 -0
- package/src/services/deploy-terraform.test.ts +55 -0
- package/src/services/deploy-terraform.ts +445 -0
- package/src/services/deploy-validation.ts +311 -0
- package/src/services/dns-auto-register.ts +211 -0
- package/src/services/health-runner.ts +184 -0
- package/src/services/infrastructure-selector.test.ts +485 -0
- package/src/services/infrastructure-selector.ts +245 -0
- package/src/services/infrastructure-variable-resolver.test.ts +751 -0
- package/src/services/infrastructure-variable-resolver.ts +234 -0
- package/src/services/machine-detector.ts +328 -0
- package/src/services/machine-pool.test.ts +405 -0
- package/src/services/machine-pool.ts +316 -0
- package/src/services/manifest-validation.ts +120 -0
- package/src/services/module-build.test.ts +290 -0
- package/src/services/module-build.ts +431 -0
- package/src/services/module-config.test.ts +237 -0
- package/src/services/module-config.ts +298 -0
- package/src/services/module-deploy.ts +862 -0
- package/src/services/module-types-drift.test.ts +73 -0
- package/src/services/module-types-generator.test.ts +288 -0
- package/src/services/module-types-generator.ts +189 -0
- package/src/services/proxmox-state-recovery.ts +140 -0
- package/src/services/schema-validation.ts +155 -0
- package/src/services/secret-schema-loader.test.ts +311 -0
- package/src/services/secret-schema-loader.ts +239 -0
- package/src/services/ssh-key-manager.test.ts +283 -0
- package/src/services/ssh-key-manager.ts +193 -0
- package/src/services/storage-providers/local.ts +105 -0
- package/src/services/storage-providers/s3.ts +182 -0
- package/src/services/storage-providers/types.ts +24 -0
- package/src/services/system-config-schema-types.ts +25 -0
- package/src/services/system-config-validator.test.ts +160 -0
- package/src/services/system-config-validator.ts +74 -0
- package/src/services/system-init.test.ts +153 -0
- package/src/services/system-init.ts +253 -0
- package/src/services/terraform-safety.ts +174 -0
- package/src/services/zone-detector.test.ts +110 -0
- package/src/services/zone-detector.ts +102 -0
- package/src/services/zone-policy.test.ts +97 -0
- package/src/services/zone-policy.ts +126 -0
- package/src/templates/generator.test.ts +645 -0
- package/src/templates/generator.ts +1119 -0
- package/src/templates/types.ts +62 -0
- package/src/test-utils/INTERACTIVE_PROMPTS.md +167 -0
- package/src/test-utils/cli-context-interactive.test.ts +152 -0
- package/src/test-utils/cli-context-server.test.ts +66 -0
- package/src/test-utils/cli-context.test.ts +273 -0
- package/src/test-utils/cli-context.ts +677 -0
- package/src/test-utils/cli-result.test.ts +282 -0
- package/src/test-utils/cli-result.ts +241 -0
- package/src/test-utils/cli.ts +55 -0
- package/src/test-utils/completion-harness.test.ts +126 -0
- package/src/test-utils/completion-harness.ts +82 -0
- package/src/test-utils/database.test.ts +182 -0
- package/src/test-utils/database.ts +126 -0
- package/src/test-utils/filesystem.test.ts +208 -0
- package/src/test-utils/filesystem.ts +142 -0
- package/src/test-utils/fixtures.test.ts +123 -0
- package/src/test-utils/fixtures.ts +160 -0
- package/src/test-utils/golden-diff.ts +197 -0
- package/src/test-utils/index.ts +77 -0
- package/src/test-utils/integration.ts +81 -0
- package/src/test-utils/module-fixtures.ts +468 -0
- package/src/test-utils/modules.test.ts +144 -0
- package/src/test-utils/modules.ts +183 -0
- package/src/test-utils/setup-test-db.ts +90 -0
- package/src/test-utils/value-extractor.test.ts +231 -0
- package/src/test-utils/value-extractor.ts +228 -0
- package/src/types/infrastructure.ts +157 -0
- package/src/utils/shell.test.ts +365 -0
- package/src/utils/shell.ts +159 -0
- package/src/validation/schemas.ts +166 -0
- package/src/variables/ansible-resolver.test.ts +142 -0
- package/src/variables/ansible-resolver.ts +69 -0
- package/src/variables/capability-self-ref.test.ts +220 -0
- package/src/variables/context.test.ts +1265 -0
- package/src/variables/context.ts +624 -0
- package/src/variables/declarative-derivation.test.ts +743 -0
- package/src/variables/declarative-derivation.ts +200 -0
- package/src/variables/parser.test.ts +231 -0
- package/src/variables/parser.ts +76 -0
- package/src/variables/resolver.test.ts +458 -0
- package/src/variables/resolver.ts +282 -0
- package/src/variables/types.ts +59 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability Secret Access Helpers
|
|
3
|
+
* Functions for checking if fields are secrets and retrieving secret values
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Database } from 'bun:sqlite';
|
|
7
|
+
import type { ModuleManifest } from '../manifest/schema';
|
|
8
|
+
import { decryptSecret } from '../secrets/encryption';
|
|
9
|
+
import { getOrCreateMasterKey } from '../secrets/master-key';
|
|
10
|
+
import { checkAllowlist, getProviderManifest } from './validation';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if a capability field is marked as secret in the provider manifest
|
|
14
|
+
*
|
|
15
|
+
* Execution function (Rule 10.1) - performs database query
|
|
16
|
+
*
|
|
17
|
+
* @param capabilityName - Name of the capability (e.g., dns_registrar)
|
|
18
|
+
* @param fieldPath - Path to the field (e.g., tsig or server.ip.primary)
|
|
19
|
+
* @param db - Database connection
|
|
20
|
+
* @returns True if field is a secret
|
|
21
|
+
*/
|
|
22
|
+
export function isCapabilityFieldSecret(
|
|
23
|
+
capabilityName: string,
|
|
24
|
+
fieldPath: string,
|
|
25
|
+
db: Database,
|
|
26
|
+
): boolean {
|
|
27
|
+
const providerManifest = getProviderManifest(capabilityName, db);
|
|
28
|
+
|
|
29
|
+
if (!providerManifest) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const capabilityDef = providerManifest.provides?.capabilities?.find(
|
|
34
|
+
(cap) => cap.name === capabilityName,
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
if (!capabilityDef?.secrets) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Check if fieldPath matches any secret name
|
|
42
|
+
return capabilityDef.secrets.some((secret) => secret.name === fieldPath);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Check if consumer module can access a capability secret
|
|
47
|
+
*
|
|
48
|
+
* Execution function (Rule 10.1) - performs database queries
|
|
49
|
+
*
|
|
50
|
+
* @param consumerModuleId - Module ID requesting access
|
|
51
|
+
* @param capabilityName - Name of the capability
|
|
52
|
+
* @param secretName - Name of the secret
|
|
53
|
+
* @param db - Database connection
|
|
54
|
+
* @returns True if access is allowed
|
|
55
|
+
*/
|
|
56
|
+
export function checkCapabilitySecretAccess(
|
|
57
|
+
consumerModuleId: string,
|
|
58
|
+
capabilityName: string,
|
|
59
|
+
secretName: string,
|
|
60
|
+
db: Database,
|
|
61
|
+
): boolean {
|
|
62
|
+
// Get provider manifest
|
|
63
|
+
const providerManifest = getProviderManifest(capabilityName, db);
|
|
64
|
+
|
|
65
|
+
if (!providerManifest) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Get consumer manifest
|
|
70
|
+
const consumerResult = db
|
|
71
|
+
.prepare('SELECT manifest_data FROM modules WHERE id = ?')
|
|
72
|
+
.get(consumerModuleId) as { manifest_data: string } | undefined;
|
|
73
|
+
|
|
74
|
+
if (!consumerResult) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
let consumerManifest: ModuleManifest;
|
|
79
|
+
try {
|
|
80
|
+
consumerManifest = JSON.parse(consumerResult.manifest_data) as ModuleManifest;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Failed to parse manifest for ${consumerModuleId}: ${error instanceof Error ? error.message : 'Invalid JSON'}`,
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Get list of capabilities provided by consumer
|
|
88
|
+
const consumerCapabilities = (consumerManifest.provides?.capabilities || []).map(
|
|
89
|
+
(cap) => cap.name,
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// Find secret definition in provider manifest
|
|
93
|
+
const capabilityDef = providerManifest.provides?.capabilities?.find(
|
|
94
|
+
(cap) => cap.name === capabilityName,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
if (!capabilityDef?.secrets) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const secret = capabilityDef.secrets.find((s) => s.name === secretName);
|
|
102
|
+
|
|
103
|
+
if (!secret) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Check if secret has readable_by restriction
|
|
108
|
+
if (!secret.readable_by || secret.readable_by.length === 0) {
|
|
109
|
+
// No restriction - accessible to all
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Check if consumer provides any capability in the allowlist
|
|
114
|
+
return checkAllowlist(consumerCapabilities, secret.readable_by);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get and decrypt capability secret
|
|
119
|
+
*
|
|
120
|
+
* Execution function (Rule 10.1) - performs database query and decryption
|
|
121
|
+
*
|
|
122
|
+
* @param capabilityName - Name of the capability
|
|
123
|
+
* @param secretName - Name of the secret
|
|
124
|
+
* @param db - Database connection
|
|
125
|
+
* @returns Decrypted secret value
|
|
126
|
+
* @throws Error if secret not found or decryption fails
|
|
127
|
+
*/
|
|
128
|
+
export async function getCapabilitySecret(
|
|
129
|
+
capabilityName: string,
|
|
130
|
+
secretName: string,
|
|
131
|
+
db: Database,
|
|
132
|
+
): Promise<string> {
|
|
133
|
+
// Get provider manifest to check for secret_ref
|
|
134
|
+
const providerManifest = getProviderManifest(capabilityName, db);
|
|
135
|
+
|
|
136
|
+
if (!providerManifest) {
|
|
137
|
+
throw new Error(`Provider manifest not found for capability '${capabilityName}'`);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Find capability and secret definition
|
|
141
|
+
const capabilityDef = providerManifest.provides?.capabilities?.find(
|
|
142
|
+
(cap) => cap.name === capabilityName,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
if (!capabilityDef?.secrets) {
|
|
146
|
+
throw new Error(`No secrets defined in capability '${capabilityName}'`);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const secretDef = capabilityDef.secrets.find((s) => s.name === secretName);
|
|
150
|
+
|
|
151
|
+
if (!secretDef) {
|
|
152
|
+
throw new Error(`Secret '${secretName}' not defined in capability '${capabilityName}'`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Check if secret uses secret_ref (reference to provider module's own secret)
|
|
156
|
+
if (secretDef.secret_ref) {
|
|
157
|
+
// Parse secret_ref (format: $secret:secret_name)
|
|
158
|
+
const match = secretDef.secret_ref.match(/^\$secret:(.+)$/);
|
|
159
|
+
if (!match) {
|
|
160
|
+
throw new Error(
|
|
161
|
+
`Invalid secret_ref format in capability '${capabilityName}': ${secretDef.secret_ref}`,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const moduleSecretName = match[1];
|
|
166
|
+
|
|
167
|
+
// Get provider module ID
|
|
168
|
+
const moduleResult = db
|
|
169
|
+
.prepare(
|
|
170
|
+
`SELECT p.id FROM modules p
|
|
171
|
+
JOIN capabilities c ON p.id = c.module_id
|
|
172
|
+
WHERE c.capability_name = ?
|
|
173
|
+
LIMIT 1`,
|
|
174
|
+
)
|
|
175
|
+
.get(capabilityName) as { id: string } | undefined;
|
|
176
|
+
|
|
177
|
+
if (!moduleResult) {
|
|
178
|
+
throw new Error(`Provider module not found for capability '${capabilityName}'`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Get module secret
|
|
182
|
+
const secretResult = db
|
|
183
|
+
.prepare('SELECT encrypted_value, iv, auth_tag FROM secrets WHERE module_id = ? AND name = ?')
|
|
184
|
+
.get(moduleResult.id, moduleSecretName) as
|
|
185
|
+
| { encrypted_value: string; iv: string; auth_tag: string }
|
|
186
|
+
| undefined;
|
|
187
|
+
|
|
188
|
+
if (!secretResult) {
|
|
189
|
+
throw new Error(
|
|
190
|
+
`Module secret '${moduleSecretName}' not found for capability '${capabilityName}' (referenced by secret_ref)`,
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Decrypt and return module secret
|
|
195
|
+
const masterKey = await getOrCreateMasterKey();
|
|
196
|
+
return decryptSecret(
|
|
197
|
+
{
|
|
198
|
+
encryptedValue: secretResult.encrypted_value,
|
|
199
|
+
iv: secretResult.iv,
|
|
200
|
+
authTag: secretResult.auth_tag,
|
|
201
|
+
},
|
|
202
|
+
masterKey,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// No secret_ref - read directly from capability_secrets table
|
|
207
|
+
const capabilityResult = db
|
|
208
|
+
.prepare('SELECT id FROM capabilities WHERE capability_name = ? LIMIT 1')
|
|
209
|
+
.get(capabilityName) as { id: number } | undefined;
|
|
210
|
+
|
|
211
|
+
if (!capabilityResult) {
|
|
212
|
+
throw new Error(`Capability '${capabilityName}' not found`);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const secretResult = db
|
|
216
|
+
.prepare(
|
|
217
|
+
'SELECT encrypted_value, iv, auth_tag FROM capability_secrets WHERE capability_id = ? AND name = ?',
|
|
218
|
+
)
|
|
219
|
+
.get(capabilityResult.id, secretName) as
|
|
220
|
+
| { encrypted_value: string; iv: string; auth_tag: string }
|
|
221
|
+
| undefined;
|
|
222
|
+
|
|
223
|
+
if (!secretResult) {
|
|
224
|
+
throw new Error(`Secret '${secretName}' not found in capability '${capabilityName}'`);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (!secretResult.encrypted_value || !secretResult.iv || !secretResult.auth_tag) {
|
|
228
|
+
throw new Error(
|
|
229
|
+
`Secret '${secretName}' in capability '${capabilityName}' has not been set. Run module configuration to set this secret.`,
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Decrypt secret
|
|
234
|
+
const masterKey = await getOrCreateMasterKey();
|
|
235
|
+
|
|
236
|
+
return decryptSecret(
|
|
237
|
+
{
|
|
238
|
+
encryptedValue: secretResult.encrypted_value,
|
|
239
|
+
iv: secretResult.iv,
|
|
240
|
+
authTag: secretResult.auth_tag,
|
|
241
|
+
},
|
|
242
|
+
masterKey,
|
|
243
|
+
);
|
|
244
|
+
}
|