@catladder/cli 0.0.0-main-2355fd7c → 0.0.0-main-018e2dee
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/apps/cli/src/apps/catenv/catenv.js +3 -0
- package/dist/apps/cli/src/apps/catenv/catenv.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.d.ts +4 -0
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.js +12 -0
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkCloudRun.d.ts +2 -2
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkCloudRun.js +3 -1
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkCloudRun.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkLocalAccess.d.ts +10 -0
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkLocalAccess.js +98 -0
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/checkLocalAccess.js.map +1 -0
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/index.js +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/doctor/index.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupContext.js +2 -0
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupContext.js.map +1 -1
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupLocalAccess.d.ts +9 -0
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupLocalAccess.js +31 -0
- package/dist/apps/cli/src/apps/cli/commands/project/setup/setupLocalAccess.js.map +1 -0
- package/dist/apps/cli/src/config/getProjectConfig.js +9 -1
- package/dist/apps/cli/src/config/getProjectConfig.js.map +1 -1
- package/dist/apps/cli/src/gcloud/localAccess.d.ts +53 -0
- package/dist/apps/cli/src/gcloud/localAccess.js +176 -0
- package/dist/apps/cli/src/gcloud/localAccess.js.map +1 -0
- package/dist/apps/cli/src/gcloud/serviceAccounts.js +9 -2
- package/dist/apps/cli/src/gcloud/serviceAccounts.js.map +1 -1
- package/dist/apps/cli/src/localAccess/declared.d.ts +14 -0
- package/dist/apps/cli/src/localAccess/declared.js +34 -0
- package/dist/apps/cli/src/localAccess/declared.js.map +1 -0
- package/dist/apps/cli/src/localAccess/keyFiles.d.ts +28 -0
- package/dist/apps/cli/src/localAccess/keyFiles.js +91 -0
- package/dist/apps/cli/src/localAccess/keyFiles.js.map +1 -0
- package/dist/apps/cli/src/utils/writePrivateFile.d.ts +7 -0
- package/dist/apps/cli/src/utils/writePrivateFile.js +25 -0
- package/dist/apps/cli/src/utils/writePrivateFile.js.map +1 -0
- package/dist/apps/cli/src/vault/BitwardenVault.js +13 -22
- package/dist/apps/cli/src/vault/BitwardenVault.js.map +1 -1
- package/dist/apps/cli/src/vault/VaultManager.d.ts +6 -0
- package/dist/apps/cli/src/vault/VaultManager.js +18 -0
- package/dist/apps/cli/src/vault/VaultManager.js.map +1 -1
- package/dist/apps/cli/src/vault/bw.d.ts +6 -2
- package/dist/apps/cli/src/vault/bw.js +32 -6
- package/dist/apps/cli/src/vault/bw.js.map +1 -1
- package/dist/apps/cli/src/vault/cache.js +5 -2
- package/dist/apps/cli/src/vault/cache.js.map +1 -1
- package/dist/bundles/catenv/index.js +436 -31
- package/dist/bundles/cli/index.js +786 -35
- package/dist/bundles/skills/catladder-secrets/SKILL.md +35 -3
- package/dist/packages/pipeline/src/index.d.ts +1 -0
- package/dist/packages/pipeline/src/index.js +1 -0
- package/dist/packages/pipeline/src/index.js.map +1 -1
- package/dist/packages/pipeline/src/localAccess/index.d.ts +53 -0
- package/dist/packages/pipeline/src/localAccess/index.js +177 -0
- package/dist/packages/pipeline/src/localAccess/index.js.map +1 -0
- package/dist/packages/pipeline/src/types/config.d.ts +75 -0
- package/dist/packages/pipeline/src/types/config.js.map +1 -1
- package/dist/skills/catladder-secrets/SKILL.md +35 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/apps/catenv/catenv.ts +4 -0
- package/src/apps/cli/commands/project/doctor/GcloudProjectInspector.ts +25 -1
- package/src/apps/cli/commands/project/doctor/__tests__/checkLocalAccess.test.ts +127 -0
- package/src/apps/cli/commands/project/doctor/checkCloudRun.ts +5 -1
- package/src/apps/cli/commands/project/doctor/checkLocalAccess.ts +146 -0
- package/src/apps/cli/commands/project/doctor/index.ts +1 -1
- package/src/apps/cli/commands/project/setup/setupContext.ts +2 -0
- package/src/apps/cli/commands/project/setup/setupLocalAccess.ts +44 -0
- package/src/config/__tests__/getEnvVarsResolved.test.ts +45 -0
- package/src/config/getProjectConfig.ts +11 -1
- package/src/gcloud/__tests__/localAccess.test.ts +82 -0
- package/src/gcloud/__tests__/syncLocalAccess.test.ts +196 -0
- package/src/gcloud/localAccess.ts +257 -0
- package/src/gcloud/serviceAccounts.ts +8 -2
- package/src/localAccess/__tests__/keyFiles.test.ts +166 -0
- package/src/localAccess/declared.ts +38 -0
- package/src/localAccess/keyFiles.ts +126 -0
- package/src/utils/__tests__/writePrivateFile.test.ts +40 -0
- package/src/utils/writePrivateFile.ts +20 -0
- package/src/vault/BitwardenVault.ts +8 -9
- package/src/vault/VaultManager.ts +28 -0
- package/src/vault/__tests__/BitwardenVault.test.ts +4 -4
- package/src/vault/__tests__/cache.test.ts +37 -0
- package/src/vault/bw.ts +34 -9
- package/src/vault/cache.ts +5 -2
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.syncLocalAccessServiceAccount = exports.listUserManagedKeyIds = exports.parseServiceAccountKey = exports.getConditionalRolesOfMemberInBindings = exports.getRolesOfMemberInBindings = exports.getLocalAccessServiceAccountNames = void 0;
|
|
4
|
+
const pipeline_1 = require("../../../../packages/pipeline/src/index.js");
|
|
5
|
+
const child_process_promise_1 = require("child-process-promise");
|
|
6
|
+
const promises_1 = require("fs/promises");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const serviceAccountNames_1 = require("./serviceAccountNames");
|
|
10
|
+
const serviceAccounts_1 = require("./serviceAccounts");
|
|
11
|
+
/**
|
|
12
|
+
* the dedicated read-only service account of a component/env that
|
|
13
|
+
* `project setup` provisions from the `localAccess` declaration.
|
|
14
|
+
* Shared with `project doctor` and catenv.
|
|
15
|
+
*/
|
|
16
|
+
const getLocalAccessServiceAccountNames = (context, projectId) => (0, serviceAccountNames_1.getGcloudServiceAccountNames)(context, {
|
|
17
|
+
name: pipeline_1.LOCAL_ACCESS_GCP_SA_NAME,
|
|
18
|
+
projectId,
|
|
19
|
+
});
|
|
20
|
+
exports.getLocalAccessServiceAccountNames = getLocalAccessServiceAccountNames;
|
|
21
|
+
/**
|
|
22
|
+
* all unconditional roles bound to `member` in the given iam policy
|
|
23
|
+
* bindings. Conditional bindings are reported separately, see
|
|
24
|
+
* {@link getConditionalRolesOfMemberInBindings}.
|
|
25
|
+
*/
|
|
26
|
+
const getRolesOfMemberInBindings = (bindings, member) => bindings
|
|
27
|
+
.filter((binding) => !binding.condition)
|
|
28
|
+
.filter((binding) => { var _a; return (_a = binding.members) === null || _a === void 0 ? void 0 : _a.includes(member); })
|
|
29
|
+
.map((binding) => binding.role)
|
|
30
|
+
.sort();
|
|
31
|
+
exports.getRolesOfMemberInBindings = getRolesOfMemberInBindings;
|
|
32
|
+
/**
|
|
33
|
+
* roles bound to `member` under an iam condition. These cannot be
|
|
34
|
+
* removed by role name alone, so they are never touched by `project
|
|
35
|
+
* setup` — only reported.
|
|
36
|
+
*/
|
|
37
|
+
const getConditionalRolesOfMemberInBindings = (bindings, member) => bindings
|
|
38
|
+
.filter((binding) => binding.condition)
|
|
39
|
+
.filter((binding) => { var _a; return (_a = binding.members) === null || _a === void 0 ? void 0 : _a.includes(member); })
|
|
40
|
+
.map((binding) => binding.role)
|
|
41
|
+
.sort();
|
|
42
|
+
exports.getConditionalRolesOfMemberInBindings = getConditionalRolesOfMemberInBindings;
|
|
43
|
+
/**
|
|
44
|
+
* parses the output of `gcloud iam service-accounts keys create` and
|
|
45
|
+
* makes sure it is a usable service account key
|
|
46
|
+
*/
|
|
47
|
+
const parseServiceAccountKey = (raw) => {
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = JSON.parse(raw);
|
|
51
|
+
}
|
|
52
|
+
catch (_a) {
|
|
53
|
+
throw new Error("gcloud did not return a valid service account key");
|
|
54
|
+
}
|
|
55
|
+
if (typeof parsed.private_key_id !== "string" ||
|
|
56
|
+
typeof parsed.private_key !== "string") {
|
|
57
|
+
throw new Error("gcloud did not return a valid service account key");
|
|
58
|
+
}
|
|
59
|
+
return { key: raw, privateKeyId: parsed.private_key_id };
|
|
60
|
+
};
|
|
61
|
+
exports.parseServiceAccountKey = parseServiceAccountKey;
|
|
62
|
+
const getProjectBindings = async (projectId) => {
|
|
63
|
+
var _a;
|
|
64
|
+
return (_a = JSON.parse((await (0, child_process_promise_1.exec)(`gcloud projects get-iam-policy ${projectId} --format=json`))
|
|
65
|
+
.stdout).bindings) !== null && _a !== void 0 ? _a : [];
|
|
66
|
+
};
|
|
67
|
+
const listUserManagedKeyIds = async (fullIdentifier) => {
|
|
68
|
+
const keys = JSON.parse((await (0, child_process_promise_1.exec)(`gcloud iam service-accounts keys list --iam-account=${fullIdentifier} --managed-by=user --format=json`)).stdout);
|
|
69
|
+
return keys.map((key) => key.name.split("/").pop());
|
|
70
|
+
};
|
|
71
|
+
exports.listUserManagedKeyIds = listUserManagedKeyIds;
|
|
72
|
+
/**
|
|
73
|
+
* makes the account's bindings equal to `roles`: adds missing, removes
|
|
74
|
+
* everything else (the account is dedicated, every other binding is
|
|
75
|
+
* drift). Idempotent — a no-op when nothing differs.
|
|
76
|
+
*/
|
|
77
|
+
const syncBindings = async (io, projectId, fullIdentifier, roles) => {
|
|
78
|
+
const member = `serviceAccount:${fullIdentifier}`;
|
|
79
|
+
const bindings = await getProjectBindings(projectId);
|
|
80
|
+
const conditional = (0, exports.getConditionalRolesOfMemberInBindings)(bindings, member);
|
|
81
|
+
if (conditional.length > 0) {
|
|
82
|
+
io.log(`⚠️ ${fullIdentifier} has conditional bindings (${conditional.join(", ")}) — setup does not touch them, remove them by hand`);
|
|
83
|
+
}
|
|
84
|
+
const { missing, extra } = (0, pipeline_1.diffRoleBindings)(roles, (0, exports.getRolesOfMemberInBindings)(bindings, member));
|
|
85
|
+
for (const role of missing) {
|
|
86
|
+
io.log(` + ${role}`);
|
|
87
|
+
await (0, child_process_promise_1.exec)(`gcloud projects add-iam-policy-binding ${projectId} --member=${member} --role=${role} --condition=None`);
|
|
88
|
+
}
|
|
89
|
+
for (const role of extra) {
|
|
90
|
+
io.log(` - ${role}`);
|
|
91
|
+
await (0, child_process_promise_1.exec)(`gcloud projects remove-iam-policy-binding ${projectId} --member=${member} --role=${role} --condition=None`);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* brings the local access service account of a component/env in line
|
|
96
|
+
* with the declared `roles`:
|
|
97
|
+
*
|
|
98
|
+
* - roles declared: account exists, carries exactly these bindings,
|
|
99
|
+
* and a key for it is in the secret store (under the `local` env, so
|
|
100
|
+
* it is never mirrored to ci). The key is only created when the
|
|
101
|
+
* stored one is missing or no longer valid — re-running is a no-op.
|
|
102
|
+
* - no roles declared: bindings are removed and the account (with its
|
|
103
|
+
* keys) deleted if it exists.
|
|
104
|
+
*/
|
|
105
|
+
const syncLocalAccessServiceAccount = async (io, context, projectId, roles) => {
|
|
106
|
+
const { fullName, fullIdentifier } = (0, exports.getLocalAccessServiceAccountNames)(context, projectId);
|
|
107
|
+
const exists = await (0, serviceAccounts_1.accountExists)(fullIdentifier);
|
|
108
|
+
if (roles.length === 0) {
|
|
109
|
+
if (exists) {
|
|
110
|
+
io.log(`local access no longer declared, removing ${fullIdentifier}...`);
|
|
111
|
+
await syncBindings(io, projectId, fullIdentifier, []);
|
|
112
|
+
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts delete ${fullIdentifier} --quiet --project="${projectId}"`);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!exists) {
|
|
117
|
+
io.log(`creating local access service account ${fullIdentifier}...`);
|
|
118
|
+
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts create ${fullName} --display-name="${context.fullConfig.customerName}-${context.fullConfig.appName} ${context.env}:${context.name} | Catladder local access (read-only)" --project="${projectId}" --description="Read-only access for local use (agents, scripts)"`);
|
|
119
|
+
}
|
|
120
|
+
await syncBindings(io, projectId, fullIdentifier, roles);
|
|
121
|
+
const secretName = (0, pipeline_1.getLocalAccessGcpSecretName)(context.env);
|
|
122
|
+
const vaultManager = await io.getVaultManager();
|
|
123
|
+
const rawName = (0, pipeline_1.getSecretVarName)("local", context.name, secretName);
|
|
124
|
+
// straight from the vault, NOT through the local cache: a stale cache
|
|
125
|
+
// (older than the first setup, or holding an older key) would make us
|
|
126
|
+
// believe the key is gone, delete the valid one and lock out every
|
|
127
|
+
// other machine.
|
|
128
|
+
const stored = (await vaultManager.vault.readAllSecrets(io))[rawName];
|
|
129
|
+
const validKeyIds = await (0, exports.listUserManagedKeyIds)(fullIdentifier);
|
|
130
|
+
let storedKeyId;
|
|
131
|
+
try {
|
|
132
|
+
storedKeyId = JSON.parse(stored).private_key_id;
|
|
133
|
+
}
|
|
134
|
+
catch (_a) {
|
|
135
|
+
// no (or unparsable) stored key
|
|
136
|
+
}
|
|
137
|
+
if (storedKeyId && validKeyIds.includes(storedKeyId)) {
|
|
138
|
+
// keep the cache in line with the vault
|
|
139
|
+
await vaultManager.cacheSecrets("local", context.name, {
|
|
140
|
+
[secretName]: stored,
|
|
141
|
+
});
|
|
142
|
+
// at most one key per account: also drop leftovers of a failed run
|
|
143
|
+
// or keys added by hand
|
|
144
|
+
await deleteKeys(fullIdentifier, validKeyIds.filter((id) => id !== storedKeyId));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
io.log("creating local access key...");
|
|
148
|
+
// create first: a failed create must not leave the vault empty
|
|
149
|
+
const { key, privateKeyId } = await createServiceAccountKey(fullIdentifier);
|
|
150
|
+
// straight into the vault, NOT through writeSecretsAndMirror: this
|
|
151
|
+
// key is for local use only and must never reach ci variables.
|
|
152
|
+
// A fresh key replaces the old one, a backup would be dead.
|
|
153
|
+
await vaultManager.writeSecrets("local", context.name, { [secretName]: key }, io, { backup: false });
|
|
154
|
+
// only now drop the keys that are not the new one
|
|
155
|
+
await deleteKeys(fullIdentifier, validKeyIds.filter((id) => id !== privateKeyId));
|
|
156
|
+
};
|
|
157
|
+
exports.syncLocalAccessServiceAccount = syncLocalAccessServiceAccount;
|
|
158
|
+
const deleteKeys = async (fullIdentifier, keyIds) => {
|
|
159
|
+
for (const keyId of keyIds) {
|
|
160
|
+
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts keys delete ${keyId} --quiet --iam-account=${fullIdentifier}`);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
const createServiceAccountKey = async (fullIdentifier) => {
|
|
164
|
+
// a private temp file (0700 folder) instead of /dev/stdout | cat:
|
|
165
|
+
// the pipe hid gcloud's exit code
|
|
166
|
+
const folder = await (0, promises_1.mkdtemp)((0, path_1.join)((0, os_1.tmpdir)(), "catladder-local-access-"));
|
|
167
|
+
try {
|
|
168
|
+
const file = (0, path_1.join)(folder, "key.json");
|
|
169
|
+
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts keys create "${file}" --iam-account=${fullIdentifier}`);
|
|
170
|
+
return (0, exports.parseServiceAccountKey)(await (0, promises_1.readFile)(file, "utf-8"));
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
await (0, promises_1.rm)(folder, { recursive: true, force: true });
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=localAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localAccess.js","sourceRoot":"","sources":["../../../../../src/gcloud/localAccess.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,19 @@ const child_process_promise_1 = require("child-process-promise");
|
|
|
5
5
|
const secrets_1 = require("../secrets");
|
|
6
6
|
const serviceAccountNames_1 = require("./serviceAccountNames");
|
|
7
7
|
const accountExists = async (fullIdentifier) => {
|
|
8
|
+
var _a, _b;
|
|
8
9
|
try {
|
|
9
10
|
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts describe ${fullIdentifier}`);
|
|
10
11
|
return true;
|
|
11
12
|
}
|
|
12
|
-
catch (
|
|
13
|
-
|
|
13
|
+
catch (e) {
|
|
14
|
+
// only a missing account means "does not exist": an auth or
|
|
15
|
+
// permission error must not look like one (setup would skip the
|
|
16
|
+
// deletion, doctor would report it missing)
|
|
17
|
+
if (`${(_a = e === null || e === void 0 ? void 0 : e.stderr) !== null && _a !== void 0 ? _a : ""}${(_b = e === null || e === void 0 ? void 0 : e.message) !== null && _b !== void 0 ? _b : ""}`.includes("NOT_FOUND")) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
throw e;
|
|
14
21
|
}
|
|
15
22
|
};
|
|
16
23
|
exports.accountExists = accountExists;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceAccounts.js","sourceRoot":"","sources":["../../../../../src/gcloud/serviceAccounts.ts"],"names":[],"mappings":";;;AAEA,iEAA6C;AAE7C,wCAAmD;AACnD,+DAAqE;AAE9D,MAAM,aAAa,GAAG,KAAK,EAAE,cAAsB,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"serviceAccounts.js","sourceRoot":"","sources":["../../../../../src/gcloud/serviceAccounts.ts"],"names":[],"mappings":";;;AAEA,iEAA6C;AAE7C,wCAAmD;AACnD,+DAAqE;AAE9D,MAAM,aAAa,GAAG,KAAK,EAAE,cAAsB,EAAE,EAAE;;IAC5D,IAAI,CAAC;QACH,MAAM,IAAA,4BAAI,EAAC,wCAAwC,cAAc,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,4DAA4D;QAC5D,gEAAgE;QAChE,4CAA4C;QAC5C,IAAI,GAAG,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,mCAAI,EAAE,GAAG,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,OAAO,mCAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC,CAAC;AAbW,QAAA,aAAa,iBAaxB;AASF,MAAM,0BAA0B,GAAG,KAAK,EACtC,OAAyB,EACzB,OAAuB,EACN,EAAE;IACnB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAA,kDAA4B,EAC/D,OAAO,EACP,OAAO,CACR,CAAC;IAEF,MAAM,eAAe,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,MAAM,WAAW,EAAE,CAAC;IAE3I,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,cAAc,CAAC,CAAC;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAA,4BAAI,EACR,sCAAsC,QAAQ,oBAAoB,eAAe,gBAAgB,SAAS,qBAAqB,WAAW,GAAG,CAC9I,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,kBAAkB,cAAc,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAA,4BAAI,EACR,0CAA0C,SAAS,aAAa,UAAU,WAAW,IAAI,mBAAmB,CAC7G,CAAC;IACJ,CAAC;IAED,aAAa;IAEb,wBAAwB;IACxB,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAI,EACrB,uDAAuD,cAAc,kCAAkC,CACxG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAA,4BAAI,EACR,2CAA2C,GAAG,CAAC,IAAI,0BAA0B,cAAc,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,IAAA,4BAAI;IACf,kEAAkE;IAClE,qEAAqE,cAAc,QAAQ,CAC5F,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEK,MAAM,uCAAuC,GAAG,KAAK,EAC1D,QAAY,EACZ,OAAyB,EACzB,OAAuB,EACvB,UAAkB,EACH,EAAE;IACjB,QAAQ,CAAC,GAAG,CAAC,4BAA4B,GAAG,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/D,mEAAmE;IACnE,oEAAoE;IACpE,qEAAqE;IACrE,8BAA8B;IAC9B,MAAM,IAAA,+BAAqB,EACzB,QAAQ,EACR;QACE;YACE,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,aAAa,EAAE,OAAO,CAAC,IAAI;YAC3B,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE;SAC/B;KACF;IACD,mEAAmE;IACnE,8DAA8D;IAC9D,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC,CAAC;AA3BW,QAAA,uCAAuC,2CA2BlD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Config } from "../../../../packages/pipeline/src/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* the envs of a component declaring gcp local access. An invalid
|
|
4
|
+
* declaration yields none instead of throwing: catenv and the vault
|
|
5
|
+
* cache must keep working (`project doctor` and `project setup` report
|
|
6
|
+
* the invalid declaration loudly).
|
|
7
|
+
*/
|
|
8
|
+
export declare const getDeclaredLocalAccessEnvs: (config: Config, componentName: string) => string[];
|
|
9
|
+
/**
|
|
10
|
+
* the declared `credentialsEnvVar` names of a component, mapped to their
|
|
11
|
+
* env. Empty instead of throwing on an invalid declaration, see
|
|
12
|
+
* {@link getDeclaredLocalAccessEnvs}.
|
|
13
|
+
*/
|
|
14
|
+
export declare const getDeclaredLocalAccessCredentialsEnvVars: (config: Config, componentName: string) => Record<string, string>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDeclaredLocalAccessCredentialsEnvVars = exports.getDeclaredLocalAccessEnvs = void 0;
|
|
4
|
+
const pipeline_1 = require("../../../../packages/pipeline/src/index.js");
|
|
5
|
+
/**
|
|
6
|
+
* the envs of a component declaring gcp local access. An invalid
|
|
7
|
+
* declaration yields none instead of throwing: catenv and the vault
|
|
8
|
+
* cache must keep working (`project doctor` and `project setup` report
|
|
9
|
+
* the invalid declaration loudly).
|
|
10
|
+
*/
|
|
11
|
+
const getDeclaredLocalAccessEnvs = (config, componentName) => {
|
|
12
|
+
try {
|
|
13
|
+
return (0, pipeline_1.getLocalAccessGcpEnvs)(config, componentName);
|
|
14
|
+
}
|
|
15
|
+
catch (_a) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
exports.getDeclaredLocalAccessEnvs = getDeclaredLocalAccessEnvs;
|
|
20
|
+
/**
|
|
21
|
+
* the declared `credentialsEnvVar` names of a component, mapped to their
|
|
22
|
+
* env. Empty instead of throwing on an invalid declaration, see
|
|
23
|
+
* {@link getDeclaredLocalAccessEnvs}.
|
|
24
|
+
*/
|
|
25
|
+
const getDeclaredLocalAccessCredentialsEnvVars = (config, componentName) => {
|
|
26
|
+
try {
|
|
27
|
+
return (0, pipeline_1.getLocalAccessGcpCredentialsEnvVars)(config, componentName);
|
|
28
|
+
}
|
|
29
|
+
catch (_a) {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.getDeclaredLocalAccessCredentialsEnvVars = getDeclaredLocalAccessCredentialsEnvVars;
|
|
34
|
+
//# sourceMappingURL=declared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declared.js","sourceRoot":"","sources":["../../../../../src/localAccess/declared.ts"],"names":[],"mappings":";;;AACA,kDAG6B;AAE7B;;;;;GAKG;AACI,MAAM,0BAA0B,GAAG,CACxC,MAAc,EACd,aAAqB,EACX,EAAE;IACZ,IAAI,CAAC;QACH,OAAO,IAAA,gCAAqB,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtD,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AATW,QAAA,0BAA0B,8BASrC;AAEF;;;;GAIG;AACI,MAAM,wCAAwC,GAAG,CACtD,MAAc,EACd,aAAqB,EACG,EAAE;IAC1B,IAAI,CAAC;QACH,OAAO,IAAA,8CAAmC,EAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AATW,QAAA,wCAAwC,4CASnD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Config } from "../../../../packages/pipeline/src/index.js";
|
|
2
|
+
import type { IO } from "../core/types";
|
|
3
|
+
/** file name of a component/env key, relative to the local access folder */
|
|
4
|
+
export declare const getLocalAccessKeyFileName: (env: string, componentName: string) => string;
|
|
5
|
+
/**
|
|
6
|
+
* env var exposing the key file path. Deliberately NOT
|
|
7
|
+
* GOOGLE_APPLICATION_CREDENTIALS: the key must only be used where a
|
|
8
|
+
* command opts in (isolated gcloud config, or a declared
|
|
9
|
+
* `credentialsEnvVar`), never by ADC implicitly.
|
|
10
|
+
*/
|
|
11
|
+
export declare const getLocalAccessKeyFileVarName: (env: string) => string;
|
|
12
|
+
/**
|
|
13
|
+
* env vars pointing at the key files that exist for the component
|
|
14
|
+
* (only paths, no secrets): one per env, plus the declared
|
|
15
|
+
* `credentialsEnvVar` names
|
|
16
|
+
*/
|
|
17
|
+
export declare const getLocalAccessKeyFileVars: (config: Config, componentName: string) => Promise<Record<string, string>>;
|
|
18
|
+
/**
|
|
19
|
+
* writes the stored local access service account keys to gitignored
|
|
20
|
+
* files (mode 0600) and removes files of declarations that are gone.
|
|
21
|
+
* A no-op without any declaration (nothing is created). Never throws:
|
|
22
|
+
* a vault that cannot be reached or an invalid declaration (reported by
|
|
23
|
+
* `project doctor`) must not break catenv.
|
|
24
|
+
*
|
|
25
|
+
* The key is only read through the cache; if setup rotated it on another
|
|
26
|
+
* machine, refresh with `catenv --vault-mode refresh`.
|
|
27
|
+
*/
|
|
28
|
+
export declare const writeLocalAccessKeyFiles: (io: IO, config: Config) => Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writeLocalAccessKeyFiles = exports.getLocalAccessKeyFileVars = exports.getLocalAccessKeyFileVarName = exports.getLocalAccessKeyFileName = void 0;
|
|
4
|
+
const pipeline_1 = require("../../../../packages/pipeline/src/index.js");
|
|
5
|
+
const promises_1 = require("fs/promises");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const writePrivateFile_1 = require("../utils/writePrivateFile");
|
|
9
|
+
const declared_1 = require("./declared");
|
|
10
|
+
const gitProjectInformation_1 = require("../git/gitProjectInformation");
|
|
11
|
+
const sanitize = (s) => s.replace(/[^A-Za-z0-9]+/g, "_");
|
|
12
|
+
/** file name of a component/env key, relative to the local access folder */
|
|
13
|
+
const getLocalAccessKeyFileName = (env, componentName) => `gcp-${sanitize(env)}-${sanitize(componentName)}.json`;
|
|
14
|
+
exports.getLocalAccessKeyFileName = getLocalAccessKeyFileName;
|
|
15
|
+
/**
|
|
16
|
+
* env var exposing the key file path. Deliberately NOT
|
|
17
|
+
* GOOGLE_APPLICATION_CREDENTIALS: the key must only be used where a
|
|
18
|
+
* command opts in (isolated gcloud config, or a declared
|
|
19
|
+
* `credentialsEnvVar`), never by ADC implicitly.
|
|
20
|
+
*/
|
|
21
|
+
const getLocalAccessKeyFileVarName = (env) => `CATLADDER_LOCAL_ACCESS_GCP_${sanitize(env).toUpperCase()}_KEY_FILE`;
|
|
22
|
+
exports.getLocalAccessKeyFileVarName = getLocalAccessKeyFileVarName;
|
|
23
|
+
// inside .catladder/, which ignores itself (see vault/cache.ts)
|
|
24
|
+
const getFolder = async () => (0, path_1.join)(await (0, gitProjectInformation_1.getProjectRootPath)(), ".catladder", "local-access");
|
|
25
|
+
/**
|
|
26
|
+
* env vars pointing at the key files that exist for the component
|
|
27
|
+
* (only paths, no secrets): one per env, plus the declared
|
|
28
|
+
* `credentialsEnvVar` names
|
|
29
|
+
*/
|
|
30
|
+
const getLocalAccessKeyFileVars = async (config, componentName) => {
|
|
31
|
+
const folder = await getFolder();
|
|
32
|
+
const getPath = (env) => (0, path_1.join)(folder, (0, exports.getLocalAccessKeyFileName)(env, componentName));
|
|
33
|
+
return Object.fromEntries([
|
|
34
|
+
...(0, declared_1.getDeclaredLocalAccessEnvs)(config, componentName).map((env) => [
|
|
35
|
+
(0, exports.getLocalAccessKeyFileVarName)(env),
|
|
36
|
+
getPath(env),
|
|
37
|
+
]),
|
|
38
|
+
...Object.entries((0, declared_1.getDeclaredLocalAccessCredentialsEnvVars)(config, componentName)).map(([name, env]) => [name, getPath(env)]),
|
|
39
|
+
].filter(([, path]) => (0, fs_1.existsSync)(path)));
|
|
40
|
+
};
|
|
41
|
+
exports.getLocalAccessKeyFileVars = getLocalAccessKeyFileVars;
|
|
42
|
+
/**
|
|
43
|
+
* writes the stored local access service account keys to gitignored
|
|
44
|
+
* files (mode 0600) and removes files of declarations that are gone.
|
|
45
|
+
* A no-op without any declaration (nothing is created). Never throws:
|
|
46
|
+
* a vault that cannot be reached or an invalid declaration (reported by
|
|
47
|
+
* `project doctor`) must not break catenv.
|
|
48
|
+
*
|
|
49
|
+
* The key is only read through the cache; if setup rotated it on another
|
|
50
|
+
* machine, refresh with `catenv --vault-mode refresh`.
|
|
51
|
+
*/
|
|
52
|
+
const writeLocalAccessKeyFiles = async (io, config) => {
|
|
53
|
+
const wanted = Object.keys(config.components).flatMap((componentName) => (0, declared_1.getDeclaredLocalAccessEnvs)(config, componentName).map((env) => ({
|
|
54
|
+
env,
|
|
55
|
+
componentName,
|
|
56
|
+
secretName: (0, pipeline_1.getSecretVarName)("local", componentName, (0, pipeline_1.getLocalAccessGcpSecretName)(env)),
|
|
57
|
+
fileName: (0, exports.getLocalAccessKeyFileName)(env, componentName),
|
|
58
|
+
})));
|
|
59
|
+
const folder = await getFolder();
|
|
60
|
+
if (wanted.length === 0 && !(0, fs_1.existsSync)(folder))
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
const secrets = wanted.length > 0
|
|
64
|
+
? await (await io.getVaultManager()).readSecrets(wanted.map((w) => w.secretName), io)
|
|
65
|
+
: {};
|
|
66
|
+
await (0, promises_1.mkdir)(folder, { recursive: true, mode: 0o700 });
|
|
67
|
+
// the parent folder ignores itself
|
|
68
|
+
await (0, promises_1.writeFile)((0, path_1.join)(folder, "..", ".gitignore"), "*\n");
|
|
69
|
+
const written = new Set();
|
|
70
|
+
for (const { secretName, fileName, env, componentName } of wanted) {
|
|
71
|
+
const key = secrets[secretName];
|
|
72
|
+
if (!key) {
|
|
73
|
+
io.log(`⚠️ no local access key for ${env}:${componentName} in the secret store — run \`catladder project setup\` (or \`catenv --vault-mode refresh\` if it was set up on another machine)`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const path = (0, path_1.join)(folder, fileName);
|
|
77
|
+
await (0, writePrivateFile_1.writePrivateFile)(path, key);
|
|
78
|
+
written.add(fileName);
|
|
79
|
+
}
|
|
80
|
+
for (const file of await (0, promises_1.readdir)(folder)) {
|
|
81
|
+
if (!written.has(file)) {
|
|
82
|
+
await (0, promises_1.rm)((0, path_1.join)(folder, file), { force: true });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
io.log(`⚠️ could not write local access keys: ${e.message}`);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
exports.writeLocalAccessKeyFiles = writeLocalAccessKeyFiles;
|
|
91
|
+
//# sourceMappingURL=keyFiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyFiles.js","sourceRoot":"","sources":["../../../../../src/localAccess/keyFiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* writes a file readable by the owner only. Goes through a 0600 temp
|
|
3
|
+
* file and a rename, so the content is never visible with looser
|
|
4
|
+
* permissions (writing first and chmod-ing afterwards would leave an
|
|
5
|
+
* existing 0644 file readable until the chmod).
|
|
6
|
+
*/
|
|
7
|
+
export declare const writePrivateFile: (path: string, content: string) => Promise<void>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.writePrivateFile = void 0;
|
|
4
|
+
const promises_1 = require("fs/promises");
|
|
5
|
+
/**
|
|
6
|
+
* writes a file readable by the owner only. Goes through a 0600 temp
|
|
7
|
+
* file and a rename, so the content is never visible with looser
|
|
8
|
+
* permissions (writing first and chmod-ing afterwards would leave an
|
|
9
|
+
* existing 0644 file readable until the chmod).
|
|
10
|
+
*/
|
|
11
|
+
const writePrivateFile = async (path, content) => {
|
|
12
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
13
|
+
try {
|
|
14
|
+
await (0, promises_1.writeFile)(tmp, content, { mode: 0o600 });
|
|
15
|
+
// the mode is only applied when the file is created
|
|
16
|
+
await (0, promises_1.chmod)(tmp, 0o600);
|
|
17
|
+
await (0, promises_1.rename)(tmp, path);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
await (0, promises_1.rm)(tmp, { force: true });
|
|
21
|
+
throw e;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
exports.writePrivateFile = writePrivateFile;
|
|
25
|
+
//# sourceMappingURL=writePrivateFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writePrivateFile.js","sourceRoot":"","sources":["../../../../../src/utils/writePrivateFile.ts"],"names":[],"mappings":";;;AAAA,0CAA2D;AAE3D;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAY,EAAE,OAAe,EAAE,EAAE;IACtE,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,IAAA,oBAAS,EAAC,GAAG,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,oDAAoD;QACpD,MAAM,IAAA,gBAAK,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxB,MAAM,IAAA,iBAAM,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAA,aAAE,EAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC,CAAC;AAXW,QAAA,gBAAgB,oBAW3B"}
|
|
@@ -100,30 +100,21 @@ class BitwardenVault {
|
|
|
100
100
|
: {};
|
|
101
101
|
const notes = (0, yaml_1.stringify)({ ...previous, ...secrets });
|
|
102
102
|
if (existing) {
|
|
103
|
-
await (0, bw_1.runBw)(bwSession, [
|
|
104
|
-
"edit",
|
|
105
|
-
"item",
|
|
106
|
-
existing.id,
|
|
107
|
-
encodePayload({ ...existing, notes }),
|
|
108
|
-
]);
|
|
103
|
+
await (0, bw_1.runBw)(bwSession, ["edit", "item", existing.id], encodePayload({ ...existing, notes }));
|
|
109
104
|
}
|
|
110
105
|
else {
|
|
111
|
-
await (0, bw_1.runBw)(bwSession, [
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
: {}),
|
|
125
|
-
}),
|
|
126
|
-
]);
|
|
106
|
+
await (0, bw_1.runBw)(bwSession, ["create", "item"], encodePayload({
|
|
107
|
+
type: SECURE_NOTE_TYPE,
|
|
108
|
+
secureNote: { type: 0 },
|
|
109
|
+
name,
|
|
110
|
+
notes,
|
|
111
|
+
...(collection.organizationId
|
|
112
|
+
? {
|
|
113
|
+
organizationId: collection.organizationId,
|
|
114
|
+
collectionIds: [collection.id],
|
|
115
|
+
}
|
|
116
|
+
: {}),
|
|
117
|
+
}));
|
|
127
118
|
}
|
|
128
119
|
}
|
|
129
120
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BitwardenVault.js","sourceRoot":"","sources":["../../../../../src/vault/BitwardenVault.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BitwardenVault.js","sourceRoot":"","sources":["../../../../../src/vault/BitwardenVault.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,10 +34,16 @@ export declare class VaultManager {
|
|
|
34
34
|
* local cache (write-through, "local" env only)
|
|
35
35
|
*/
|
|
36
36
|
writeSecrets(env: string, componentName: string, secrets: Record<string, unknown>, io?: IO | null, options?: WriteSecretsOptions): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* updates the local cache only (the vault already holds the values),
|
|
39
|
+
* "local" env only
|
|
40
|
+
*/
|
|
41
|
+
cacheSecrets(env: string, componentName: string, secrets: Record<string, string>): Promise<void>;
|
|
37
42
|
/**
|
|
38
43
|
* the subset of the vault secrets that may be cached: the declared
|
|
39
44
|
* secrets of the "local" env, per component, as a hierarchy
|
|
40
45
|
*/
|
|
41
46
|
private cacheableSubset;
|
|
42
47
|
private declaredSecretKeys;
|
|
48
|
+
private declaredEnvSecretKeys;
|
|
43
49
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VaultManager = void 0;
|
|
4
4
|
const pipeline_1 = require("../../../../packages/pipeline/src/index.js");
|
|
5
|
+
const declared_1 = require("../localAccess/declared");
|
|
5
6
|
const BitwardenVault_1 = require("./BitwardenVault");
|
|
6
7
|
const cache_1 = require("./cache");
|
|
7
8
|
const GitlabVault_1 = require("./GitlabVault");
|
|
@@ -84,6 +85,15 @@ class VaultManager {
|
|
|
84
85
|
])));
|
|
85
86
|
}
|
|
86
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* updates the local cache only (the vault already holds the values),
|
|
90
|
+
* "local" env only
|
|
91
|
+
*/
|
|
92
|
+
async cacheSecrets(env, componentName, secrets) {
|
|
93
|
+
if (env !== CACHED_ENV)
|
|
94
|
+
return;
|
|
95
|
+
await (0, cache_1.updateSecretsCache)(this.vault.id, env, componentName, secrets);
|
|
96
|
+
}
|
|
87
97
|
/**
|
|
88
98
|
* the subset of the vault secrets that may be cached: the declared
|
|
89
99
|
* secrets of the "local" env, per component, as a hierarchy
|
|
@@ -107,6 +117,14 @@ class VaultManager {
|
|
|
107
117
|
return Object.keys(local).length > 0 ? { [CACHED_ENV]: local } : {};
|
|
108
118
|
}
|
|
109
119
|
async declaredSecretKeys(componentName) {
|
|
120
|
+
return [
|
|
121
|
+
...(await this.declaredEnvSecretKeys(componentName)),
|
|
122
|
+
// the local access keys `project setup` provisions are not part
|
|
123
|
+
// of any env's vars, but belong to the cached local secrets
|
|
124
|
+
...(0, declared_1.getDeclaredLocalAccessEnvs)(this.config, componentName).map(pipeline_1.getLocalAccessGcpSecretName),
|
|
125
|
+
];
|
|
126
|
+
}
|
|
127
|
+
async declaredEnvSecretKeys(componentName) {
|
|
110
128
|
try {
|
|
111
129
|
const { secretEnvVarKeys, jobOnlyVars } = await (0, pipeline_1.getEnvironment)({
|
|
112
130
|
config: this.config,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VaultManager.js","sourceRoot":"","sources":["../../../../../src/vault/VaultManager.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"VaultManager.js","sourceRoot":"","sources":["../../../../../src/vault/VaultManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,11 @@ export declare const getBwSession: (io: IO | null, { allowPrompt }: {
|
|
|
7
7
|
allowPrompt: boolean;
|
|
8
8
|
}) => Promise<string>;
|
|
9
9
|
/**
|
|
10
|
-
* runs a bw command with the given session and returns stdout
|
|
10
|
+
* runs a bw command with the given session and returns stdout.
|
|
11
|
+
*
|
|
12
|
+
* `input` is written to stdin: use it for payloads (e.g. the secrets of
|
|
13
|
+
* `bw create item`), which would otherwise be visible in `ps` and be
|
|
14
|
+
* echoed by node's "Command failed" error.
|
|
11
15
|
*/
|
|
12
|
-
export declare const runBw: (session: string, args: string[]) => Promise<string>;
|
|
16
|
+
export declare const runBw: (session: string, args: string[], input?: string) => Promise<string>;
|
|
13
17
|
export declare const runBwJson: <T>(session: string, args: string[]) => Promise<T>;
|