@serve.zone/interfaces 19.8.0 → 20.0.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/changelog.md +14 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/immutableimage.d.ts +2 -0
- package/dist_ts/data/immutableimage.js +1 -1
- package/dist_ts/data/index.d.ts +1 -0
- package/dist_ts/data/index.js +2 -1
- package/dist_ts/data/secret.d.ts +205 -0
- package/dist_ts/data/secret.js +469 -0
- package/dist_ts/data/secretbundle.d.ts +4 -0
- package/dist_ts/data/secretgroup.d.ts +4 -0
- package/dist_ts/data/service.d.ts +18 -6
- package/dist_ts/data/service.js +1 -1
- package/dist_ts/requests/index.d.ts +2 -1
- package/dist_ts/requests/index.js +3 -2
- package/dist_ts/requests/secret.d.ts +198 -0
- package/dist_ts/requests/secret.js +2 -0
- package/dist_ts/runtime.d.ts +41 -0
- package/dist_ts/runtime.js +33 -0
- package/package.json +9 -2
- package/readme.md +36 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/immutableimage.ts +2 -0
- package/ts/data/index.ts +1 -0
- package/ts/data/secret.ts +835 -0
- package/ts/data/secretbundle.ts +4 -0
- package/ts/data/secretgroup.ts +4 -0
- package/ts/data/service.ts +26 -6
- package/ts/requests/index.ts +2 -0
- package/ts/requests/secret.ts +256 -0
- package/ts/runtime.ts +80 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { normalizeServiceAbsolutePath } from './service.js';
|
|
2
|
+
/** Retired versions remain usable only through an already-accepted manifest. */
|
|
3
|
+
export const isSecretVersionMaterialIssuable = (lifecycleStateArg) => lifecycleStateArg === 'active' || lifecycleStateArg === 'retired';
|
|
4
|
+
export const resolvedSecretManifestReferencesEqual = (leftArg, rightArg) => (Boolean(leftArg)
|
|
5
|
+
&& Boolean(rightArg)
|
|
6
|
+
&& leftArg?.manifestId === rightArg?.manifestId
|
|
7
|
+
&& leftArg?.manifestDigest === rightArg?.manifestDigest
|
|
8
|
+
&& leftArg?.clusterId === rightArg?.clusterId
|
|
9
|
+
&& leftArg?.secretRolloutId === rightArg?.secretRolloutId
|
|
10
|
+
&& leftArg?.secretRolloutGeneration === rightArg?.secretRolloutGeneration);
|
|
11
|
+
export const isResolvedSecretManifestReferenceAccepted = (stateArg, referenceArg, nowArg) => (resolvedSecretManifestReferencesEqual(stateArg.desiredManifest, referenceArg)
|
|
12
|
+
|| resolvedSecretManifestReferencesEqual(stateArg.appliedManifest, referenceArg)
|
|
13
|
+
|| (Boolean(stateArg.previousAcceptedManifest)
|
|
14
|
+
&& nowArg < stateArg.previousAcceptedManifest.acceptedUntil
|
|
15
|
+
&& resolvedSecretManifestReferencesEqual(stateArg.previousAcceptedManifest.manifest, referenceArg)));
|
|
16
|
+
const secretIdentifierRegex = /^[A-Za-z0-9][A-Za-z0-9:._-]{0,199}$/;
|
|
17
|
+
const secretEnvironmentRegex = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
18
|
+
const secretKeyRegex = /^[A-Z_][A-Z0-9_]{0,252}$/;
|
|
19
|
+
const secretDigestRegex = /^sha256:[a-f0-9]{64}$/;
|
|
20
|
+
const secretManagementScopeRegex = /^(appstore|mail|oidc|webpush|platform|system):[A-Za-z0-9][A-Za-z0-9._-]{0,199}$/;
|
|
21
|
+
const isRecord = (valueArg) => (Boolean(valueArg) && typeof valueArg === 'object' && !Array.isArray(valueArg));
|
|
22
|
+
const isSecretIdentifier = (valueArg) => (typeof valueArg === 'string' && secretIdentifierRegex.test(valueArg));
|
|
23
|
+
const isSecretKey = (valueArg) => (typeof valueArg === 'string' && secretKeyRegex.test(valueArg));
|
|
24
|
+
const isSecretEnvironment = (valueArg) => (typeof valueArg === 'string' && secretEnvironmentRegex.test(valueArg));
|
|
25
|
+
export const validateSecretManagementScope = (sourceArg, scopeArg) => {
|
|
26
|
+
if (scopeArg === 'operator') {
|
|
27
|
+
return sourceArg === 'operator'
|
|
28
|
+
? []
|
|
29
|
+
: ['operator management scope requires operator source'];
|
|
30
|
+
}
|
|
31
|
+
if (scopeArg === 'legacy') {
|
|
32
|
+
return sourceArg === 'legacy'
|
|
33
|
+
? []
|
|
34
|
+
: ['legacy management scope requires legacy source'];
|
|
35
|
+
}
|
|
36
|
+
if (typeof scopeArg !== 'string' || !secretManagementScopeRegex.test(scopeArg)) {
|
|
37
|
+
return ['management scope must be canonical'];
|
|
38
|
+
}
|
|
39
|
+
return scopeArg.startsWith(`${sourceArg}:`)
|
|
40
|
+
? []
|
|
41
|
+
: ['management scope prefix must match management source'];
|
|
42
|
+
};
|
|
43
|
+
export const validateSecretDelivery = (deliveryArg) => {
|
|
44
|
+
if (!isRecord(deliveryArg))
|
|
45
|
+
return ['delivery must be an object'];
|
|
46
|
+
if (deliveryArg.type === 'environment') {
|
|
47
|
+
return isSecretKey(deliveryArg.variableName)
|
|
48
|
+
? []
|
|
49
|
+
: ['environment delivery variableName must be a canonical environment key'];
|
|
50
|
+
}
|
|
51
|
+
if (deliveryArg.type !== 'file') {
|
|
52
|
+
return ['delivery type must be environment or file'];
|
|
53
|
+
}
|
|
54
|
+
const errors = [];
|
|
55
|
+
if (typeof deliveryArg.targetPath !== 'string'
|
|
56
|
+
|| normalizeServiceAbsolutePath(deliveryArg.targetPath) !== deliveryArg.targetPath
|
|
57
|
+
|| !/^\/run\/secrets\/[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(deliveryArg.targetPath)
|
|
58
|
+
|| deliveryArg.targetPath === '/run/secrets/secret.json') {
|
|
59
|
+
errors.push('file delivery targetPath must be a canonical file below /run/secrets');
|
|
60
|
+
}
|
|
61
|
+
for (const field of ['uid', 'gid']) {
|
|
62
|
+
const value = deliveryArg[field];
|
|
63
|
+
if (!Number.isSafeInteger(value)
|
|
64
|
+
|| value < 0
|
|
65
|
+
|| value > 2_147_483_647) {
|
|
66
|
+
errors.push(`file delivery ${field} must be a bounded numeric identity`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (deliveryArg.mode !== 0o400 && deliveryArg.mode !== 0o440) {
|
|
70
|
+
errors.push('file delivery mode must be 0400 or 0440');
|
|
71
|
+
}
|
|
72
|
+
return errors;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* One shared precedence rule for resolution and runtime verification.
|
|
76
|
+
* A manifest is authoritative once published; before publication an attachment
|
|
77
|
+
* override wins over the Secret default.
|
|
78
|
+
*/
|
|
79
|
+
export const resolveSecretDelivery = (deliveryArg) => (deliveryArg.manifestDelivery
|
|
80
|
+
?? deliveryArg.attachmentOverride
|
|
81
|
+
?? deliveryArg.secretDefault);
|
|
82
|
+
export const validateServiceSecretConfiguration = (configurationArg) => {
|
|
83
|
+
if (!isRecord(configurationArg)) {
|
|
84
|
+
return ['secretConfiguration must be an object'];
|
|
85
|
+
}
|
|
86
|
+
if (configurationArg.schemaVersion !== 1) {
|
|
87
|
+
return ['secretConfiguration schemaVersion must be 1'];
|
|
88
|
+
}
|
|
89
|
+
if (!Array.isArray(configurationArg.secretSetAttachments)) {
|
|
90
|
+
return ['secretSetAttachments must be an array'];
|
|
91
|
+
}
|
|
92
|
+
if (configurationArg.secretSetAttachments.length > 64) {
|
|
93
|
+
return ['secretSetAttachments must contain at most 64 entries'];
|
|
94
|
+
}
|
|
95
|
+
const errors = [];
|
|
96
|
+
if (!Number.isSafeInteger(configurationArg.revision)
|
|
97
|
+
|| configurationArg.revision < 0) {
|
|
98
|
+
errors.push('secretConfiguration revision must be a non-negative integer');
|
|
99
|
+
}
|
|
100
|
+
if (!Number.isSafeInteger(configurationArg.secretsRevision)
|
|
101
|
+
|| configurationArg.secretsRevision < 0) {
|
|
102
|
+
errors.push('secretConfiguration secretsRevision must be a non-negative integer');
|
|
103
|
+
}
|
|
104
|
+
const attachmentIds = [];
|
|
105
|
+
const setEnvironmentKeys = [];
|
|
106
|
+
for (const [attachmentIndex, candidate] of configurationArg.secretSetAttachments.entries()) {
|
|
107
|
+
if (!isRecord(candidate)) {
|
|
108
|
+
errors.push(`secretSetAttachments[${attachmentIndex}] must be an object`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (!isSecretIdentifier(candidate.id)) {
|
|
112
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].id must be a canonical identifier`);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
attachmentIds.push(candidate.id);
|
|
116
|
+
}
|
|
117
|
+
if (!isSecretIdentifier(candidate.secretSetId)) {
|
|
118
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].secretSetId must be a canonical identifier`);
|
|
119
|
+
}
|
|
120
|
+
if (!isSecretEnvironment(candidate.environment)) {
|
|
121
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].environment must be a canonical environment`);
|
|
122
|
+
}
|
|
123
|
+
if (isSecretIdentifier(candidate.secretSetId)
|
|
124
|
+
&& isSecretEnvironment(candidate.environment)) {
|
|
125
|
+
setEnvironmentKeys.push(`${candidate.secretSetId}\0${candidate.environment}`);
|
|
126
|
+
}
|
|
127
|
+
if (candidate.mappings === undefined)
|
|
128
|
+
continue;
|
|
129
|
+
if (!Array.isArray(candidate.mappings) || candidate.mappings.length > 128) {
|
|
130
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].mappings must be a bounded array`);
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const sourceKeys = [];
|
|
134
|
+
const targetKeys = [];
|
|
135
|
+
for (const [mappingIndex, mappingCandidate] of candidate.mappings.entries()) {
|
|
136
|
+
if (!isRecord(mappingCandidate)) {
|
|
137
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].mappings[${mappingIndex}] must be an object`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (!isSecretKey(mappingCandidate.sourceKey)) {
|
|
141
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].mappings[${mappingIndex}].sourceKey must be canonical`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
sourceKeys.push(mappingCandidate.sourceKey);
|
|
145
|
+
}
|
|
146
|
+
const finalKey = mappingCandidate.targetKey ?? mappingCandidate.sourceKey;
|
|
147
|
+
if (!isSecretKey(finalKey)) {
|
|
148
|
+
errors.push(`secretSetAttachments[${attachmentIndex}].mappings[${mappingIndex}].targetKey must be canonical`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
targetKeys.push(finalKey);
|
|
152
|
+
}
|
|
153
|
+
if (mappingCandidate.delivery !== undefined) {
|
|
154
|
+
errors.push(...validateSecretDelivery(mappingCandidate.delivery).map((errorArg) => (`secretSetAttachments[${attachmentIndex}].mappings[${mappingIndex}].${errorArg}`)));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (new Set(sourceKeys).size !== sourceKeys.length) {
|
|
158
|
+
errors.push(`secretSetAttachments[${attachmentIndex}] has duplicate source mappings`);
|
|
159
|
+
}
|
|
160
|
+
if (new Set(targetKeys).size !== targetKeys.length) {
|
|
161
|
+
errors.push(`secretSetAttachments[${attachmentIndex}] has duplicate target mappings`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (new Set(attachmentIds).size !== attachmentIds.length) {
|
|
165
|
+
errors.push('secretSetAttachments ids must be unique');
|
|
166
|
+
}
|
|
167
|
+
if (new Set(setEnvironmentKeys).size !== setEnvironmentKeys.length) {
|
|
168
|
+
errors.push('a SecretSet may be attached only once per environment');
|
|
169
|
+
}
|
|
170
|
+
return errors;
|
|
171
|
+
};
|
|
172
|
+
export const validateServiceSecretMode = (serviceDataArg) => {
|
|
173
|
+
if (!isRecord(serviceDataArg))
|
|
174
|
+
return ['service data must be an object'];
|
|
175
|
+
const hasLegacyPrimary = typeof serviceDataArg.secretBundleId === 'string'
|
|
176
|
+
&& serviceDataArg.secretBundleId.length > 0;
|
|
177
|
+
const hasLegacyAdditional = Array.isArray(serviceDataArg.additionalSecretBundleIds)
|
|
178
|
+
&& serviceDataArg.additionalSecretBundleIds.length > 0;
|
|
179
|
+
if (serviceDataArg.secretConfiguration !== undefined
|
|
180
|
+
&& (hasLegacyPrimary || hasLegacyAdditional)) {
|
|
181
|
+
return ['legacy SecretBundle references cannot be mixed with secretConfiguration'];
|
|
182
|
+
}
|
|
183
|
+
return serviceDataArg.secretConfiguration === undefined
|
|
184
|
+
? []
|
|
185
|
+
: validateServiceSecretConfiguration(serviceDataArg.secretConfiguration);
|
|
186
|
+
};
|
|
187
|
+
export const validateSecretSetAttachmentOwnership = (configurationArg, serviceOrganizationIdArg, secretSetsArg) => {
|
|
188
|
+
const errors = validateServiceSecretConfiguration(configurationArg);
|
|
189
|
+
const secretSetsById = new Map(secretSetsArg.map((secretSetArg) => [
|
|
190
|
+
secretSetArg.id,
|
|
191
|
+
secretSetArg,
|
|
192
|
+
]));
|
|
193
|
+
for (const attachment of configurationArg.secretSetAttachments || []) {
|
|
194
|
+
const secretSet = secretSetsById.get(attachment.secretSetId);
|
|
195
|
+
if (!secretSet) {
|
|
196
|
+
errors.push(`SecretSet ${attachment.secretSetId} does not exist`);
|
|
197
|
+
}
|
|
198
|
+
else if (secretSet.organizationId !== serviceOrganizationIdArg) {
|
|
199
|
+
errors.push(`SecretSet ${attachment.secretSetId} belongs to another organization`);
|
|
200
|
+
}
|
|
201
|
+
else if (secretSet.lifecycleState !== 'active') {
|
|
202
|
+
errors.push(`SecretSet ${attachment.secretSetId} is not active`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return errors;
|
|
206
|
+
};
|
|
207
|
+
export const createResolvedSecretManifestDigestInput = (manifestArg) => JSON.stringify({
|
|
208
|
+
schemaVersion: manifestArg.schemaVersion,
|
|
209
|
+
id: manifestArg.id,
|
|
210
|
+
organizationId: manifestArg.organizationId,
|
|
211
|
+
serviceId: manifestArg.serviceId,
|
|
212
|
+
clusterId: manifestArg.clusterId,
|
|
213
|
+
secretRolloutId: manifestArg.secretRolloutId,
|
|
214
|
+
secretRolloutGeneration: manifestArg.secretRolloutGeneration,
|
|
215
|
+
entries: manifestArg.entries.map((entryArg) => ({
|
|
216
|
+
secretId: entryArg.secretId,
|
|
217
|
+
secretVersionId: entryArg.secretVersionId,
|
|
218
|
+
key: entryArg.key,
|
|
219
|
+
environment: entryArg.environment,
|
|
220
|
+
owner: entryArg.owner.kind === 'service'
|
|
221
|
+
? {
|
|
222
|
+
kind: 'service',
|
|
223
|
+
serviceId: entryArg.owner.serviceId,
|
|
224
|
+
}
|
|
225
|
+
: {
|
|
226
|
+
kind: 'secret-set',
|
|
227
|
+
secretSetId: entryArg.owner.secretSetId,
|
|
228
|
+
},
|
|
229
|
+
delivery: entryArg.delivery.type === 'environment'
|
|
230
|
+
? {
|
|
231
|
+
type: 'environment',
|
|
232
|
+
variableName: entryArg.delivery.variableName,
|
|
233
|
+
}
|
|
234
|
+
: {
|
|
235
|
+
type: 'file',
|
|
236
|
+
targetPath: entryArg.delivery.targetPath,
|
|
237
|
+
uid: entryArg.delivery.uid,
|
|
238
|
+
gid: entryArg.delivery.gid,
|
|
239
|
+
mode: entryArg.delivery.mode,
|
|
240
|
+
},
|
|
241
|
+
})),
|
|
242
|
+
createdAt: manifestArg.createdAt,
|
|
243
|
+
});
|
|
244
|
+
/** Shared canonical digest; the digest field itself is excluded from the input. */
|
|
245
|
+
export const computeResolvedSecretManifestDigest = async (manifestArg) => {
|
|
246
|
+
const encoded = new TextEncoder().encode(createResolvedSecretManifestDigestInput(manifestArg));
|
|
247
|
+
const digestBuffer = await globalThis.crypto.subtle.digest('SHA-256', encoded);
|
|
248
|
+
const digestHex = [...new Uint8Array(digestBuffer)]
|
|
249
|
+
.map((byteArg) => byteArg.toString(16).padStart(2, '0'))
|
|
250
|
+
.join('');
|
|
251
|
+
return `sha256:${digestHex}`;
|
|
252
|
+
};
|
|
253
|
+
export const verifyResolvedSecretManifestDigest = async (manifestArg) => (manifestArg.digest === await computeResolvedSecretManifestDigest(manifestArg));
|
|
254
|
+
export const validateResolvedSecretManifest = (manifestArg) => {
|
|
255
|
+
if (!isRecord(manifestArg))
|
|
256
|
+
return ['secret manifest must be an object'];
|
|
257
|
+
const errors = [];
|
|
258
|
+
if (manifestArg.schemaVersion !== 1)
|
|
259
|
+
errors.push('secret manifest schemaVersion must be 1');
|
|
260
|
+
for (const field of [
|
|
261
|
+
'id',
|
|
262
|
+
'organizationId',
|
|
263
|
+
'serviceId',
|
|
264
|
+
'clusterId',
|
|
265
|
+
'secretRolloutId',
|
|
266
|
+
]) {
|
|
267
|
+
if (!isSecretIdentifier(manifestArg[field])) {
|
|
268
|
+
errors.push(`secret manifest ${field} must be a canonical identifier`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (typeof manifestArg.digest !== 'string' || !secretDigestRegex.test(manifestArg.digest)) {
|
|
272
|
+
errors.push('secret manifest digest must be a canonical sha256 digest');
|
|
273
|
+
}
|
|
274
|
+
if (!Number.isSafeInteger(manifestArg.secretRolloutGeneration)
|
|
275
|
+
|| manifestArg.secretRolloutGeneration < 1) {
|
|
276
|
+
errors.push('secret manifest rollout generation must be a positive integer');
|
|
277
|
+
}
|
|
278
|
+
if (!Number.isSafeInteger(manifestArg.createdAt) || manifestArg.createdAt < 0) {
|
|
279
|
+
errors.push('secret manifest createdAt must be a non-negative integer');
|
|
280
|
+
}
|
|
281
|
+
if (!Array.isArray(manifestArg.entries) || manifestArg.entries.length > 256) {
|
|
282
|
+
errors.push('secret manifest entries must be a bounded array');
|
|
283
|
+
return errors;
|
|
284
|
+
}
|
|
285
|
+
const keyScopes = [];
|
|
286
|
+
const secretIds = [];
|
|
287
|
+
const versionIds = [];
|
|
288
|
+
const environmentDeliveryTargets = [];
|
|
289
|
+
const fileDeliveryTargets = [];
|
|
290
|
+
let previousSortKey;
|
|
291
|
+
for (const [index, candidate] of manifestArg.entries.entries()) {
|
|
292
|
+
if (!isRecord(candidate)) {
|
|
293
|
+
errors.push(`secret manifest entries[${index}] must be an object`);
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
if (!isSecretIdentifier(candidate.secretId)) {
|
|
297
|
+
errors.push(`secret manifest entries[${index}].secretId must be canonical`);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
secretIds.push(candidate.secretId);
|
|
301
|
+
}
|
|
302
|
+
if (!isSecretIdentifier(candidate.secretVersionId)) {
|
|
303
|
+
errors.push(`secret manifest entries[${index}].secretVersionId must be canonical`);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
versionIds.push(candidate.secretVersionId);
|
|
307
|
+
}
|
|
308
|
+
if (!isSecretKey(candidate.key)) {
|
|
309
|
+
errors.push(`secret manifest entries[${index}].key must be canonical`);
|
|
310
|
+
}
|
|
311
|
+
if (!isSecretEnvironment(candidate.environment)) {
|
|
312
|
+
errors.push(`secret manifest entries[${index}].environment must be canonical`);
|
|
313
|
+
}
|
|
314
|
+
else if (isSecretKey(candidate.key)) {
|
|
315
|
+
keyScopes.push(`${candidate.environment}\0${candidate.key}`);
|
|
316
|
+
}
|
|
317
|
+
if (!isRecord(candidate.owner)
|
|
318
|
+
|| (candidate.owner.kind !== 'service'
|
|
319
|
+
&& candidate.owner.kind !== 'secret-set')
|
|
320
|
+
|| (candidate.owner.kind === 'service'
|
|
321
|
+
&& !isSecretIdentifier(candidate.owner.serviceId))
|
|
322
|
+
|| (candidate.owner.kind === 'secret-set'
|
|
323
|
+
&& !isSecretIdentifier(candidate.owner.secretSetId))) {
|
|
324
|
+
errors.push(`secret manifest entries[${index}].owner must be canonical`);
|
|
325
|
+
}
|
|
326
|
+
else if (candidate.owner.kind === 'service'
|
|
327
|
+
&& isSecretIdentifier(manifestArg.serviceId)
|
|
328
|
+
&& candidate.owner.serviceId !== manifestArg.serviceId) {
|
|
329
|
+
errors.push(`secret manifest entries[${index}].owner serviceId must match the manifest serviceId`);
|
|
330
|
+
}
|
|
331
|
+
errors.push(...validateSecretDelivery(candidate.delivery).map((errorArg) => `secret manifest entries[${index}].${errorArg}`));
|
|
332
|
+
if (isRecord(candidate.delivery)) {
|
|
333
|
+
if (candidate.delivery.type === 'environment'
|
|
334
|
+
&& isSecretKey(candidate.delivery.variableName)) {
|
|
335
|
+
environmentDeliveryTargets.push(candidate.delivery.variableName);
|
|
336
|
+
}
|
|
337
|
+
else if (candidate.delivery.type === 'file'
|
|
338
|
+
&& typeof candidate.delivery.targetPath === 'string'
|
|
339
|
+
&& validateSecretDelivery(candidate.delivery).length === 0) {
|
|
340
|
+
fileDeliveryTargets.push(candidate.delivery.targetPath);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
if (isSecretKey(candidate.key) && isSecretEnvironment(candidate.environment)) {
|
|
344
|
+
const sortKey = `${candidate.environment}\0${candidate.key}`;
|
|
345
|
+
if (previousSortKey !== undefined && sortKey <= previousSortKey) {
|
|
346
|
+
errors.push('secret manifest entries must be uniquely sorted by environment and key');
|
|
347
|
+
}
|
|
348
|
+
previousSortKey = sortKey;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (new Set(keyScopes).size !== keyScopes.length) {
|
|
352
|
+
errors.push('secret manifest final keys must be unique per environment');
|
|
353
|
+
}
|
|
354
|
+
if (new Set(secretIds).size !== secretIds.length) {
|
|
355
|
+
errors.push('secret manifest logical secret references must be unique');
|
|
356
|
+
}
|
|
357
|
+
if (new Set(versionIds).size !== versionIds.length) {
|
|
358
|
+
errors.push('secret manifest version references must be unique');
|
|
359
|
+
}
|
|
360
|
+
if (new Set(environmentDeliveryTargets).size !== environmentDeliveryTargets.length) {
|
|
361
|
+
errors.push('secret manifest environment delivery targets must be globally unique');
|
|
362
|
+
}
|
|
363
|
+
if (new Set(fileDeliveryTargets).size !== fileDeliveryTargets.length) {
|
|
364
|
+
errors.push('secret manifest file delivery targets must be globally unique');
|
|
365
|
+
}
|
|
366
|
+
return errors;
|
|
367
|
+
};
|
|
368
|
+
const validateResolvedSecretManifestReference = (referenceArg, expectedClusterIdArg, pathArg) => {
|
|
369
|
+
if (!isRecord(referenceArg)
|
|
370
|
+
|| !isSecretIdentifier(referenceArg.manifestId)
|
|
371
|
+
|| typeof referenceArg.manifestDigest !== 'string'
|
|
372
|
+
|| !secretDigestRegex.test(referenceArg.manifestDigest)
|
|
373
|
+
|| referenceArg.clusterId !== expectedClusterIdArg
|
|
374
|
+
|| !isSecretIdentifier(referenceArg.secretRolloutId)
|
|
375
|
+
|| !Number.isSafeInteger(referenceArg.secretRolloutGeneration)
|
|
376
|
+
|| referenceArg.secretRolloutGeneration < 1) {
|
|
377
|
+
return [`${pathArg} must be canonical and match its cluster`];
|
|
378
|
+
}
|
|
379
|
+
return [];
|
|
380
|
+
};
|
|
381
|
+
export const validateServiceSecretDeploymentPlan = (planArg, expectedTargetClusterIdsArg) => {
|
|
382
|
+
if (!isRecord(planArg))
|
|
383
|
+
return ['secret deployment plan must be an object'];
|
|
384
|
+
const errors = [];
|
|
385
|
+
if (planArg.schemaVersion !== 1)
|
|
386
|
+
errors.push('secret deployment plan schemaVersion must be 1');
|
|
387
|
+
if (!Number.isSafeInteger(planArg.revision) || planArg.revision < 1) {
|
|
388
|
+
errors.push('secret deployment plan revision must be a positive integer');
|
|
389
|
+
}
|
|
390
|
+
if (!Number.isSafeInteger(planArg.updatedAt) || planArg.updatedAt < 0) {
|
|
391
|
+
errors.push('secret deployment plan updatedAt must be a non-negative integer');
|
|
392
|
+
}
|
|
393
|
+
if (!Array.isArray(planArg.clusterStates)
|
|
394
|
+
|| planArg.clusterStates.length === 0
|
|
395
|
+
|| planArg.clusterStates.length > 128) {
|
|
396
|
+
errors.push('secret deployment plan clusterStates must be a non-empty bounded array');
|
|
397
|
+
return errors;
|
|
398
|
+
}
|
|
399
|
+
const clusterIds = [];
|
|
400
|
+
const manifestReferencesById = new Map();
|
|
401
|
+
const validateAndTrackManifestReference = (referenceArg, expectedClusterIdArg, pathArg) => {
|
|
402
|
+
const referenceErrors = validateResolvedSecretManifestReference(referenceArg, expectedClusterIdArg, pathArg);
|
|
403
|
+
errors.push(...referenceErrors);
|
|
404
|
+
if (referenceErrors.length > 0)
|
|
405
|
+
return;
|
|
406
|
+
const reference = referenceArg;
|
|
407
|
+
const existingReference = manifestReferencesById.get(reference.manifestId);
|
|
408
|
+
if (existingReference
|
|
409
|
+
&& !resolvedSecretManifestReferencesEqual(existingReference, reference)) {
|
|
410
|
+
errors.push(`${pathArg}.manifestId must identify one immutable manifest reference throughout the plan`);
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
manifestReferencesById.set(reference.manifestId, reference);
|
|
414
|
+
};
|
|
415
|
+
for (const [index, candidate] of planArg.clusterStates.entries()) {
|
|
416
|
+
const path = `secret deployment plan clusterStates[${index}]`;
|
|
417
|
+
if (!isRecord(candidate) || !isSecretIdentifier(candidate.clusterId)) {
|
|
418
|
+
errors.push(`${path}.clusterId must be canonical`);
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
clusterIds.push(candidate.clusterId);
|
|
422
|
+
validateAndTrackManifestReference(candidate.desiredManifest, candidate.clusterId, `${path}.desiredManifest`);
|
|
423
|
+
if (candidate.appliedManifest !== undefined) {
|
|
424
|
+
validateAndTrackManifestReference(candidate.appliedManifest, candidate.clusterId, `${path}.appliedManifest`);
|
|
425
|
+
}
|
|
426
|
+
if (candidate.previousAcceptedManifest !== undefined) {
|
|
427
|
+
if (!isRecord(candidate.previousAcceptedManifest)
|
|
428
|
+
|| !Number.isSafeInteger(candidate.previousAcceptedManifest.acceptedUntil)
|
|
429
|
+
|| candidate.previousAcceptedManifest.acceptedUntil < 0) {
|
|
430
|
+
errors.push(`${path}.previousAcceptedManifest acceptedUntil must be non-negative`);
|
|
431
|
+
}
|
|
432
|
+
else {
|
|
433
|
+
validateAndTrackManifestReference(candidate.previousAcceptedManifest.manifest, candidate.clusterId, `${path}.previousAcceptedManifest.manifest`);
|
|
434
|
+
if (Number.isSafeInteger(candidate.updatedAt)
|
|
435
|
+
&& candidate.previousAcceptedManifest.acceptedUntil
|
|
436
|
+
< candidate.updatedAt) {
|
|
437
|
+
errors.push(`${path}.previousAcceptedManifest acceptedUntil predates its state`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (![
|
|
442
|
+
'pending',
|
|
443
|
+
'applying',
|
|
444
|
+
'applied',
|
|
445
|
+
'drifted',
|
|
446
|
+
'failed',
|
|
447
|
+
].includes(candidate.status)) {
|
|
448
|
+
errors.push(`${path}.status must be canonical`);
|
|
449
|
+
}
|
|
450
|
+
if (!Number.isSafeInteger(candidate.updatedAt) || candidate.updatedAt < 0) {
|
|
451
|
+
errors.push(`${path}.updatedAt must be a non-negative integer`);
|
|
452
|
+
}
|
|
453
|
+
if (candidate.status === 'applied'
|
|
454
|
+
&& !resolvedSecretManifestReferencesEqual(candidate.appliedManifest, candidate.desiredManifest)) {
|
|
455
|
+
errors.push(`${path} applied status requires the desired manifest to be applied`);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (new Set(clusterIds).size !== clusterIds.length) {
|
|
459
|
+
errors.push('secret deployment plan clusterStates must contain each cluster once');
|
|
460
|
+
}
|
|
461
|
+
if (expectedTargetClusterIdsArg) {
|
|
462
|
+
const expected = [...new Set(expectedTargetClusterIdsArg)].sort();
|
|
463
|
+
if (JSON.stringify([...clusterIds].sort()) !== JSON.stringify(expected)) {
|
|
464
|
+
errors.push('secret deployment plan target clusters do not match the service rollout scope');
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return errors;
|
|
468
|
+
};
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGF0YS9zZWNyZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBZ0I1RCxnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsaUJBQStDLEVBQ3RDLEVBQUUsQ0FBQyxpQkFBaUIsS0FBSyxRQUFRLElBQUksaUJBQWlCLEtBQUssU0FBUyxDQUFDO0FBeU9oRixNQUFNLENBQUMsTUFBTSxxQ0FBcUMsR0FBRyxDQUNuRCxPQUFxRCxFQUNyRCxRQUFzRCxFQUM3QyxFQUFFLENBQUMsQ0FDWixPQUFPLENBQUMsT0FBTyxDQUFDO09BQ2IsT0FBTyxDQUFDLFFBQVEsQ0FBQztPQUNqQixPQUFPLEVBQUUsVUFBVSxLQUFLLFFBQVEsRUFBRSxVQUFVO09BQzVDLE9BQU8sRUFBRSxjQUFjLEtBQUssUUFBUSxFQUFFLGNBQWM7T0FDcEQsT0FBTyxFQUFFLFNBQVMsS0FBSyxRQUFRLEVBQUUsU0FBUztPQUMxQyxPQUFPLEVBQUUsZUFBZSxLQUFLLFFBQVEsRUFBRSxlQUFlO09BQ3RELE9BQU8sRUFBRSx1QkFBdUIsS0FBSyxRQUFRLEVBQUUsdUJBQXVCLENBQzFFLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5Q0FBeUMsR0FBRyxDQUN2RCxRQUF1QyxFQUN2QyxZQUE4QyxFQUM5QyxNQUFjLEVBQ0wsRUFBRSxDQUFDLENBQ1oscUNBQXFDLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUM7T0FDMUUscUNBQXFDLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUM7T0FDN0UsQ0FDRCxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDO1dBQ3ZDLE1BQU0sR0FBRyxRQUFRLENBQUMsd0JBQXlCLENBQUMsYUFBYTtXQUN6RCxxQ0FBcUMsQ0FDdEMsUUFB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
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @deprecated Compatibility-only persisted shape. Migrate to ISecretMetadata
|
|
3
|
+
* and immutable SecretVersion records; do not create new SecretGroups.
|
|
4
|
+
*/
|
|
1
5
|
export interface ISecretGroup {
|
|
2
6
|
/**
|
|
3
7
|
* the insatnce id. This should be a random id, except for default
|
|
@@ -6,6 +6,7 @@ import type { IServiceMailConfig } from './mail.js';
|
|
|
6
6
|
import type { IServiceWebPushConfig } from './webpush.js';
|
|
7
7
|
import type { IImageRolloutStatus, IImmutableImageDeploymentPlan } from './immutableimage.js';
|
|
8
8
|
import type { IServiceDomainRoute, IServicePublicPortMapping, IServiceTargetPort } from './serviceports.js';
|
|
9
|
+
import type { IServiceSecretConfiguration, IServiceSecretDeploymentPlan } from './secret.js';
|
|
9
10
|
export interface IServiceVolume {
|
|
10
11
|
/** Stable Docker volume name. If omitted, Coreflow derives one from service id and mount path. */
|
|
11
12
|
name?: string;
|
|
@@ -118,14 +119,22 @@ export interface IService {
|
|
|
118
119
|
[key: string]: string;
|
|
119
120
|
};
|
|
120
121
|
/**
|
|
121
|
-
*
|
|
122
|
+
* Legacy main SecretBundle ID. New services use secretConfiguration and
|
|
123
|
+
* the server-managed secretDeployment manifest pointer.
|
|
124
|
+
*
|
|
125
|
+
* @deprecated Compatibility-only until the versioned SecretBundle migration completes.
|
|
122
126
|
*/
|
|
123
|
-
secretBundleId
|
|
127
|
+
secretBundleId?: string;
|
|
124
128
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
129
|
+
* Legacy additional SecretBundle IDs.
|
|
130
|
+
*
|
|
131
|
+
* @deprecated Use explicit same-organization SecretSet attachments.
|
|
127
132
|
*/
|
|
128
133
|
additionalSecretBundleIds?: string[];
|
|
134
|
+
/** Value-free, caller-managed SecretSet attachment configuration. */
|
|
135
|
+
secretConfiguration?: IServiceSecretConfiguration;
|
|
136
|
+
/** Server-managed immutable manifest authority pointer. */
|
|
137
|
+
secretDeployment?: IServiceSecretDeploymentPlan;
|
|
129
138
|
/** Exact OCI/Docker argument vector appended after the image entrypoint. */
|
|
130
139
|
containerArgs?: string[];
|
|
131
140
|
/** Secret keys mounted as files and excluded from Env and secret.json. */
|
|
@@ -193,8 +202,11 @@ export interface IService {
|
|
|
193
202
|
deploymentIds: string[];
|
|
194
203
|
};
|
|
195
204
|
}
|
|
196
|
-
/**
|
|
197
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Caller-writable service data. Immutable rollout state and SecretSet
|
|
207
|
+
* attachments are changed only through their dedicated fenced APIs.
|
|
208
|
+
*/
|
|
209
|
+
export type TServiceWritableData = Omit<IService['data'], 'organizationId' | 'immutableImageRequired' | 'imageDeployment' | 'imageRolloutStatus' | 'secretConfiguration' | 'secretDeployment'>;
|
|
198
210
|
/** Caller-writable update data. Null explicitly removes an existing argument vector. */
|
|
199
211
|
export type TServiceUpdateWritableData = Omit<TServiceWritableData, 'containerArgs'> & {
|
|
200
212
|
containerArgs?: string[] | null;
|
package/dist_ts/data/service.js
CHANGED
|
@@ -133,4 +133,4 @@ export const validateServiceContainerArgs = (containerArgsArg) => {
|
|
|
133
133
|
}
|
|
134
134
|
return [];
|
|
135
135
|
};
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFzREEsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUc7SUFDdkMsV0FBVyxFQUFFLEVBQUU7SUFDZixlQUFlLEVBQUUsSUFBSTtJQUNyQixpQkFBaUIsRUFBRSxFQUFFLEdBQUcsSUFBSTtDQUNwQixDQUFDO0FBRVgsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsWUFBWSxFQUFFLEVBQUU7SUFDaEIsaUJBQWlCLEVBQUUsR0FBRyxHQUFHLElBQUk7SUFDN0IsZUFBZSxFQUFFLGFBQWE7Q0FDdEIsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLENBQUMsT0FBZSxFQUFzQixFQUFFO0lBQ2xGLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtXQUMxQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1dBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1dBQ3RCLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDMUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUM5QixLQUFLLE1BQU0sT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxHQUFHO1lBQUUsU0FBUztRQUMxQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM1QyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZixTQUFTO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJ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
|
|
@@ -23,6 +23,7 @@ import * as networkRequests from './network.js';
|
|
|
23
23
|
import * as nodeRequests from './node.js';
|
|
24
24
|
import * as platformRequests from './platform.js';
|
|
25
25
|
import * as routingRequests from './routing.js';
|
|
26
|
+
import * as secretRequests from './secret.js';
|
|
26
27
|
import * as secretBundleRequests from './secretbundle.js';
|
|
27
28
|
import * as secretGroupRequests from './secretgroup.js';
|
|
28
29
|
import * as serverRequests from './server.js';
|
|
@@ -32,7 +33,7 @@ import * as statusRequests from './status.js';
|
|
|
32
33
|
import * as taskRequests from './task.js';
|
|
33
34
|
import * as versionRequests from './version.js';
|
|
34
35
|
import * as webPushRequests from './webpush.js';
|
|
35
|
-
export { adminRequests as admin, appStoreRequests as appstore, baremetalRequests as baremetal, baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster, configRequests as config, corestoreRequests as corestore, deploymentRequests as deployment, dnsRequests as dns, domainRequests as domain, externalRegistryRequests as externalRegistry, gatewayRequests as gateway, hostedAppRequests as hostedapp, identityRequests as identity, imageRequests as image, informRequests as inform, logRequests as log, mailRequests as mail, migrationRequests as migration, networkRequests as network, nodeRequests as node, platformRequests as platform, routingRequests as routing, secretBundleRequests as secretbundle, secretGroupRequests as secretgroup, serverRequests as server, serviceRequests as service, settingsRequests as settings, statusRequests as status, taskRequests as task, versionRequests as version, webPushRequests as webpush, };
|
|
36
|
+
export { adminRequests as admin, appStoreRequests as appstore, baremetalRequests as baremetal, baseOsRequests as baseos, backupRequests as backup, certificateRequests as certificate, clusterRequests as cluster, configRequests as config, corestoreRequests as corestore, deploymentRequests as deployment, dnsRequests as dns, domainRequests as domain, externalRegistryRequests as externalRegistry, gatewayRequests as gateway, hostedAppRequests as hostedapp, identityRequests as identity, imageRequests as image, informRequests as inform, logRequests as log, mailRequests as mail, migrationRequests as migration, networkRequests as network, nodeRequests as node, platformRequests as platform, routingRequests as routing, secretRequests as secret, secretBundleRequests as secretbundle, secretGroupRequests as secretgroup, serverRequests as server, serviceRequests as service, settingsRequests as settings, statusRequests as status, taskRequests as task, versionRequests as version, webPushRequests as webpush, };
|
|
36
37
|
export * from './inform.js';
|
|
37
38
|
export * from './hostedapp.js';
|
|
38
39
|
export * from './mail.js';
|