@serve.zone/interfaces 32.59.0 → 32.61.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.
Files changed (37) hide show
  1. package/.smartconfig.json +4 -2
  2. package/changelog.md +87 -0
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/data/delegatedadmintoken.d.ts +142 -0
  5. package/dist_ts/data/delegatedadmintoken.js +197 -0
  6. package/dist_ts/data/externalregistry.d.ts +37 -1
  7. package/dist_ts/data/gateway.d.ts +23 -4
  8. package/dist_ts/data/gateway.js +1 -1
  9. package/dist_ts/data/index.d.ts +2 -0
  10. package/dist_ts/data/index.js +3 -1
  11. package/dist_ts/data/launchersecretowner.d.ts +60 -0
  12. package/dist_ts/data/launchersecretowner.js +94 -0
  13. package/dist_ts/data/secret.d.ts +67 -1
  14. package/dist_ts/data/secret.js +59 -6
  15. package/dist_ts/data/serviceruntime.d.ts +9 -2
  16. package/dist_ts/data/serviceruntime.js +2 -1
  17. package/dist_ts/platform/objectstorageenvironment.d.ts +12 -3
  18. package/dist_ts/platform/objectstorageenvironment.js +22 -6
  19. package/dist_ts/requests/admin.d.ts +52 -0
  20. package/dist_ts/requests/externalregistry.d.ts +12 -6
  21. package/dist_ts/requests/identity.d.ts +4 -0
  22. package/dist_ts/requests/service.d.ts +16 -1
  23. package/package.json +5 -8
  24. package/readme.md +76 -12
  25. package/ts/00_commitinfo_data.ts +1 -1
  26. package/ts/data/delegatedadmintoken.ts +282 -0
  27. package/ts/data/externalregistry.ts +60 -2
  28. package/ts/data/gateway.ts +24 -3
  29. package/ts/data/index.ts +2 -0
  30. package/ts/data/launchersecretowner.ts +145 -0
  31. package/ts/data/secret.ts +103 -7
  32. package/ts/data/serviceruntime.ts +9 -1
  33. package/ts/platform/objectstorageenvironment.ts +26 -8
  34. package/ts/requests/admin.ts +51 -0
  35. package/ts/requests/externalregistry.ts +12 -6
  36. package/ts/requests/identity.ts +4 -0
  37. package/ts/requests/service.ts +16 -1
@@ -9,6 +9,7 @@ export * from './config.js';
9
9
  export * from './corestore.js';
10
10
  export * from './corestorecontroltoken.js';
11
11
  export * from './corestorelegacyadoption.js';
12
+ export * from './delegatedadmintoken.js';
12
13
  export * from './coremail.js';
13
14
  export * from './coremail.runtime.js';
14
15
  export * from './deployment.js';
@@ -81,6 +82,7 @@ export * from './servicecredential.js';
81
82
  export * from './serviceplatformownership.js';
82
83
  export * from './serviceports.js';
83
84
  export * from './serviceruntime.js';
85
+ export * from './launchersecretowner.js';
84
86
  export * from './servicevolumeinitialization.js';
85
87
  export * from './status.js';
86
88
  export * from './taskexecution.js';
@@ -9,6 +9,7 @@ export * from './config.js';
9
9
  export * from './corestore.js';
10
10
  export * from './corestorecontroltoken.js';
11
11
  export * from './corestorelegacyadoption.js';
12
+ export * from './delegatedadmintoken.js';
12
13
  export * from './coremail.js';
13
14
  export * from './coremail.runtime.js';
14
15
  export * from './deployment.js';
@@ -77,6 +78,7 @@ export * from './servicecredential.js';
77
78
  export * from './serviceplatformownership.js';
78
79
  export * from './serviceports.js';
79
80
  export * from './serviceruntime.js';
81
+ export * from './launchersecretowner.js';
80
82
  export * from './servicevolumeinitialization.js';
81
83
  export * from './status.js';
82
84
  export * from './taskexecution.js';
@@ -84,4 +86,4 @@ export * from './traffic.js';
84
86
  export * from './user.js';
85
87
  export * from './version.js';
86
88
  export * from './webpush.js';
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHdCQUF3QixDQUFDO0FBR3ZDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRzlELE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRXBGLE9BQU8sRUFBRSwwQ0FBMEMsRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFJLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFdBQVcsQ0FBQztBQUMxQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQyJ9
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsd0JBQXdCLENBQUM7QUFHdkMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHOUQsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFcEYsT0FBTyxFQUFFLDBDQUEwQyxFQUFFLDBDQUEwQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUksY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUMifQ==
@@ -0,0 +1,60 @@
1
+ import type { ISecretLauncherEnvironmentDelivery } from './secret.js';
2
+ import type { IServiceRuntimeProfile, TServiceRuntimeRefusal } from './serviceruntime.js';
3
+ /** What the owner of a workload's launcher-environment secret files derives from. */
4
+ export interface ILauncherSecretDeliveryOwnerInput {
5
+ /** The runtime spec's `profile.runAs`; null runs the image's own OCI user. */
6
+ runAs: IServiceRuntimeProfile['runAs'];
7
+ /**
8
+ * The unresolved OCI `config.User` of the pinned digest's image config in Cloudly's canonical
9
+ * form (what its registry manager's `parseCanonicalImageUser` answers, never the raw registry
10
+ * value): `user` or `user:group`, each part a numeric identity or a name, and null for an image
11
+ * that states none or an empty `User`. One entry for a single-platform manifest, one per
12
+ * platform of a multi-platform index; never empty.
13
+ */
14
+ imageUsers: (string | null)[];
15
+ /**
16
+ * Every launcher-environment delivery the workload receives, as its caller states it. A `0o440`
17
+ * delivery grants the derived group, so that group has to be one the image states numerically.
18
+ */
19
+ launcherDeliveries: Pick<ISecretLauncherEnvironmentDelivery, 'variableName' | 'mode'>[];
20
+ }
21
+ /**
22
+ * The numeric owner of a workload's launcher-environment secret files, or why it derives none.
23
+ *
24
+ * `not-required` is a workload without launcher-environment deliveries: no file needs an owner, so
25
+ * nothing about the image refuses it.
26
+ *
27
+ * `launcher-secret-ownership-unknown` is a runtime spec that runs the image's own user
28
+ * (`runAs: null`) while that user's numeric owner is not known: a named user other than `root`, a
29
+ * numeric part above the runtime identity bound, a group-readable (`0o440`) delivery whose group
30
+ * the image does not state numerically, or platforms of a multi-platform index that derive
31
+ * different owners. `variableName` names the group-readable delivery that caused it (the first by
32
+ * name), null for the others; `message` states the cause.
33
+ */
34
+ export type TLauncherSecretDeliveryOwner = {
35
+ status: 'derived';
36
+ uid: number;
37
+ gid: number;
38
+ } | {
39
+ status: 'not-required';
40
+ } | {
41
+ status: 'refused';
42
+ reason: Extract<TServiceRuntimeRefusal, 'launcher-secret-ownership-unknown'>;
43
+ variableName: string | null;
44
+ message: string;
45
+ };
46
+ /**
47
+ * The owner Cloudly gives every launcher-environment secret file of a workload, which WorkloadInit
48
+ * reads as the workload's own process identity before it starts the image.
49
+ *
50
+ * Without launcher deliveries it is `not-required`. A `runAs` pair wins over the image. Under
51
+ * `runAs: null` an image without a user runs as root (`0:0`, the runtime config's own default), a
52
+ * numeric `user:group` is taken as stated and `root` stands for `0` in either part. A numeric user
53
+ * without a group, or with a named group, is `user:0` while every delivery is owner-readable
54
+ * (`0o400`), which grants the group nothing; a `0o440` delivery would grant it, so it refuses and
55
+ * names that delivery. A named user, or a numeric part above the runtime identity bound, refuses.
56
+ * Every platform of a multi-platform index must derive
57
+ * the same owner, or it refuses: a workload gets one delivery, never one per platform. Nothing is
58
+ * guessed. A structurally malformed input throws, whatever it would answer.
59
+ */
60
+ export declare const deriveLauncherSecretDeliveryOwner: (inputArg: ILauncherSecretDeliveryOwnerInput) => TLauncherSecretDeliveryOwner;
@@ -0,0 +1,94 @@
1
+ import { hasExactKeys, isPlainRecord } from '../private/dataproperties.js';
2
+ import { isRuntimeIdentityNumber, runtimePolicyLimits } from '../private/runtimepolicy.js';
3
+ const imageUserPartPattern = /^[^:\u0000-\u001f\u007f]+$/;
4
+ const imageUserPart = (partArg) => {
5
+ if (partArg === 'root')
6
+ return 0;
7
+ if (!/^[0-9]+$/.test(partArg))
8
+ return 'named';
9
+ const identity = Number(partArg);
10
+ return isRuntimeIdentityNumber(identity) ? identity : 'unbounded';
11
+ };
12
+ /** One platform's user and group; an absent group is `undefined`. A malformed image user throws. */
13
+ const imageUserParts = (imageUserArg) => {
14
+ if (imageUserArg === null)
15
+ return { user: 0, group: 0 };
16
+ const parts = typeof imageUserArg === 'string' ? imageUserArg.split(':') : [];
17
+ if (parts.length === 0 || parts.length > 2 || !parts.every((partArg) => imageUserPartPattern.test(partArg))) {
18
+ throw new Error('image user must be null, user or user:group');
19
+ }
20
+ return { user: imageUserPart(parts[0]), group: parts[1] === undefined ? undefined : imageUserPart(parts[1]) };
21
+ };
22
+ /** The names of the group-readable (`0o440`) deliveries, sorted; a malformed delivery throws. */
23
+ const groupReadableVariableNames = (deliveriesArg) => {
24
+ if (!Array.isArray(deliveriesArg))
25
+ throw new Error('launcherDeliveries must list the launcher deliveries');
26
+ const names = [];
27
+ for (const delivery of deliveriesArg) {
28
+ if (!isPlainRecord(delivery) || typeof delivery.variableName !== 'string' || delivery.variableName === ''
29
+ || (delivery.mode !== 0o400 && delivery.mode !== 0o440)) {
30
+ throw new Error('a launcher delivery must state its variableName and a 0400 or 0440 mode');
31
+ }
32
+ if (delivery.mode === 0o440)
33
+ names.push(delivery.variableName);
34
+ }
35
+ return names.sort();
36
+ };
37
+ const refusal = (variableNameArg, messageArg) => ({
38
+ status: 'refused', reason: 'launcher-secret-ownership-unknown', variableName: variableNameArg, message: messageArg,
39
+ });
40
+ /**
41
+ * The owner Cloudly gives every launcher-environment secret file of a workload, which WorkloadInit
42
+ * reads as the workload's own process identity before it starts the image.
43
+ *
44
+ * Without launcher deliveries it is `not-required`. A `runAs` pair wins over the image. Under
45
+ * `runAs: null` an image without a user runs as root (`0:0`, the runtime config's own default), a
46
+ * numeric `user:group` is taken as stated and `root` stands for `0` in either part. A numeric user
47
+ * without a group, or with a named group, is `user:0` while every delivery is owner-readable
48
+ * (`0o400`), which grants the group nothing; a `0o440` delivery would grant it, so it refuses and
49
+ * names that delivery. A named user, or a numeric part above the runtime identity bound, refuses.
50
+ * Every platform of a multi-platform index must derive
51
+ * the same owner, or it refuses: a workload gets one delivery, never one per platform. Nothing is
52
+ * guessed. A structurally malformed input throws, whatever it would answer.
53
+ */
54
+ export const deriveLauncherSecretDeliveryOwner = (inputArg) => {
55
+ const { runAs, imageUsers, launcherDeliveries } = inputArg;
56
+ if (runAs !== null && !(isPlainRecord(runAs) && hasExactKeys(runAs, ['user', 'group'])
57
+ && isRuntimeIdentityNumber(runAs.user) && isRuntimeIdentityNumber(runAs.group))) {
58
+ throw new Error('runAs must be null or an exact user and group');
59
+ }
60
+ if (!Array.isArray(imageUsers) || imageUsers.length === 0) {
61
+ throw new Error('imageUsers must name the user of every platform');
62
+ }
63
+ const platforms = imageUsers.map(imageUserParts);
64
+ const groupReadable = groupReadableVariableNames(launcherDeliveries);
65
+ if (launcherDeliveries.length === 0)
66
+ return { status: 'not-required' };
67
+ if (runAs !== null)
68
+ return { status: 'derived', uid: runAs.user, gid: runAs.group };
69
+ const userOf = (predicateArg) => (imageUsers.find((_imageUserArg, indexArg) => predicateArg(platforms[indexArg])));
70
+ const unbounded = userOf((platformArg) => platformArg.user === 'unbounded' || platformArg.group === 'unbounded');
71
+ if (unbounded !== undefined) {
72
+ return refusal(null, `image user '${unbounded}' states an identity above `
73
+ + `${runtimePolicyLimits.maximumIdentityNumber}`);
74
+ }
75
+ const namedUser = userOf((platformArg) => platformArg.user === 'named');
76
+ if (namedUser !== undefined) {
77
+ return refusal(null, `image user '${namedUser}' names a user only the image's root filesystem resolves`);
78
+ }
79
+ const ungrouped = userOf((platformArg) => typeof platformArg.group !== 'number');
80
+ if (ungrouped !== undefined && groupReadable.length > 0) {
81
+ return refusal(groupReadable[0], `launcher-environment secret ${groupReadable.join(', ')} is group-readable `
82
+ + `(0440), but image user '${ungrouped}' states no numeric group`);
83
+ }
84
+ // Every part is now a bounded number, or a group that an owner-readable file does not grant.
85
+ const [first, ...rest] = platforms.map((platformArg) => ({
86
+ uid: platformArg.user, gid: typeof platformArg.group === 'number' ? platformArg.group : 0,
87
+ }));
88
+ if (rest.some((ownerArg) => ownerArg.uid !== first.uid || ownerArg.gid !== first.gid)) {
89
+ const users = imageUsers.map((userArg) => userArg === null ? 'none' : `'${userArg}'`).join(', ');
90
+ return refusal(null, `the platforms' image users ${users} derive different owners`);
91
+ }
92
+ return { status: 'derived', uid: first.uid, gid: first.gid };
93
+ };
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF1bmNoZXJzZWNyZXRvd25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvbGF1bmNoZXJzZWNyZXRvd25lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBNEMzRixNQUFNLG9CQUFvQixHQUFHLDRCQUE0QixDQUFDO0FBUTFELE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZSxFQUFrQixFQUFFO0lBQ3hELElBQUksT0FBTyxLQUFLLE1BQU07UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsT0FBTyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDcEUsQ0FBQyxDQUFDO0FBRUYsb0dBQW9HO0FBQ3BHLE1BQU0sY0FBYyxHQUFHLENBQUMsWUFBcUIsRUFBK0QsRUFBRTtJQUM1RyxJQUFJLFlBQVksS0FBSyxJQUFJO1FBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLE9BQU8sWUFBWSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FB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
@@ -151,7 +151,32 @@ export interface ISecretSetConsumerRolloutStatus {
151
151
  errorCode?: string;
152
152
  updatedAt: number;
153
153
  }
154
+ /**
155
+ * A launcher-environment delivery as a caller states it: on a Secret's `defaultDelivery`, a
156
+ * SecretSet attachment override, a create request or an App Store declaration. The owner of the
157
+ * file WorkloadInit reads is not the caller's to state; the resolver derives it.
158
+ */
154
159
  export interface ISecretLauncherEnvironmentDelivery {
160
+ type: 'launcher-environment';
161
+ variableName: string;
162
+ /**
163
+ * @deprecated Derived by the resolver from the workload identity
164
+ * (`deriveLauncherSecretDeliveryOwner`); ignored; removed in the next major.
165
+ */
166
+ uid?: number;
167
+ /**
168
+ * @deprecated Derived by the resolver from the workload identity
169
+ * (`deriveLauncherSecretDeliveryOwner`); ignored; removed in the next major.
170
+ */
171
+ gid?: number;
172
+ mode: 0o400 | 0o440;
173
+ }
174
+ /**
175
+ * A launcher-environment delivery of a resolved secret manifest. `uid` and `gid` are the owner the
176
+ * resolver derived from the workload identity (`deriveLauncherSecretDeliveryOwner`), written by
177
+ * `createResolvedSecretDelivery`; the node mounts the file with them.
178
+ */
179
+ export interface ISecretResolvedLauncherEnvironmentDelivery {
155
180
  type: 'launcher-environment';
156
181
  variableName: string;
157
182
  uid: number;
@@ -165,7 +190,33 @@ export interface ISecretFileDelivery {
165
190
  gid: number;
166
191
  mode: 0o400 | 0o440;
167
192
  }
193
+ /** A delivery as a caller states it. */
168
194
  export type TSecretDelivery = ISecretLauncherEnvironmentDelivery | ISecretFileDelivery;
195
+ /** A delivery of a resolved secret manifest: every owner is stated. */
196
+ export type TSecretResolvedDelivery = ISecretResolvedLauncherEnvironmentDelivery | ISecretFileDelivery;
197
+ /**
198
+ * Prefixes of the names the platform injects into a workload itself (`SERVEZONE_*`): a secret of
199
+ * such a name would replace what the platform delivers.
200
+ */
201
+ export declare const platformReservedSecretKeyPrefixes: readonly ["SERVEZONE_"];
202
+ /**
203
+ * Prefixes of the names a loader, language runtime, package manager or library reads to change
204
+ * what a process loads, runs or trusts (`LD_PRELOAD`, `NODE_OPTIONS`, `PYTHONPATH`, `OPENSSL_CONF`,
205
+ * `DOTNET_STARTUP_HOOKS`, `NPM_CONFIG_REGISTRY`, …). Matched as plain prefixes, so `PYTHON`, `PERL`,
206
+ * `RUBY` and `PHP` cover every name that starts with them.
207
+ */
208
+ export declare const runtimeInjectionSecretKeyPrefixes: readonly ["LD_", "DYLD_", "NODE_", "DENO_", "BUN_", "PYTHON", "PERL", "RUBY", "PHP", "JAVA_", "JDK_", "_JAVA_", "DOTNET_", "CORECLR_", "LUA_", "GEM_", "BUNDLE_", "NPM_CONFIG_", "PIP_", "GLIBC_", "MALLOC_", "GCONV_", "OPENSSL_", "SSL_", "CURL_", "REQUESTS_", "GIT_"];
209
+ /**
210
+ * Exact names a shell, loader, runtime or HTTP client reads to change where a process looks,
211
+ * connects or what it trusts or records (`CLASSPATH`, `AWS_CA_BUNDLE`, `SSLKEYLOGFILE`).
212
+ */
213
+ export declare const runtimeInjectionSecretKeys: readonly ["PATH", "HOME", "SHELL", "ENV", "BASH_ENV", "IFS", "TMPDIR", "LOCPATH", "NLSPATH", "CLASSPATH", "HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "NO_PROXY", "FTP_PROXY", "AWS_CA_BUNDLE", "SSLKEYLOGFILE"];
214
+ /**
215
+ * Whether a secret key, or a name a secret is delivered under, is reserved: one of
216
+ * `runtimeInjectionSecretKeys`, or starting with an entry of `platformReservedSecretKeyPrefixes`
217
+ * or `runtimeInjectionSecretKeyPrefixes`. A delegated administrator token never writes such a name.
218
+ */
219
+ export declare const isReservedSecretKey: (keyArg: string) => boolean;
169
220
  export declare const secretValueLimits: Readonly<{
170
221
  maximumBytes: number;
171
222
  minimumGeneratedBytes: 16;
@@ -211,7 +262,7 @@ export interface IResolvedSecretManifestEntry {
211
262
  key: string;
212
263
  environment: TSecretEnvironment;
213
264
  owner: TWorkloadSecretOwner;
214
- delivery: TSecretDelivery;
265
+ delivery: TSecretResolvedDelivery;
215
266
  }
216
267
  /** Immutable, value-free runtime snapshot. */
217
268
  export interface IResolvedSecretManifest {
@@ -272,7 +323,22 @@ export declare const verifySecretVersionPurgeIntentDigest: (intentArg: ISecretVe
272
323
  export declare const validateSecretVersionPurgeOperation: (operationArg: unknown) => Promise<string[]>;
273
324
  export declare const validateSecretOwner: (ownerArg: unknown) => string[];
274
325
  export declare const validateSecretManagementScope: (sourceArg: TSecretManagementSource, scopeArg: unknown) => string[];
326
+ /**
327
+ * Validates a delivery as a caller states it. A launcher delivery should state no owner; one that
328
+ * states the deprecated `uid` and `gid` (both, bounded) is tolerated until the next major.
329
+ */
275
330
  export declare const validateSecretDelivery: (deliveryArg: unknown) => string[];
331
+ /** Validates a resolved manifest's delivery: a launcher delivery states its derived owner. */
332
+ export declare const validateSecretResolvedDelivery: (deliveryArg: unknown) => string[];
333
+ /**
334
+ * The resolved manifest delivery of a caller's delivery: a launcher delivery takes the owner the
335
+ * resolver derived (`deriveLauncherSecretDeliveryOwner`) and drops any deprecated owner the caller
336
+ * stated; a file delivery keeps its own.
337
+ */
338
+ export declare const createResolvedSecretDelivery: (deliveryArg: TSecretDelivery, ownerArg: {
339
+ uid: number;
340
+ gid: number;
341
+ }) => TSecretResolvedDelivery;
276
342
  export declare const validateSecretMetadata: (secretArg: unknown) => string[];
277
343
  export declare const validateSecretValueInput: (valueInputArg: unknown) => string[];
278
344
  /** Checks the SmartCrypto context digest without opening or decrypting the envelope. */