@serve.zone/interfaces 16.7.0 → 17.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 +17 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/data/deploymentoperation.d.ts +4 -0
- package/dist_ts/data/deploymentoperation.js +1 -1
- package/dist_ts/data/gateway.d.ts +123 -6
- package/dist_ts/data/settings.d.ts +0 -2
- package/dist_ts/requests/gateway.d.ts +76 -1
- package/dist_ts/requests/mail.d.ts +3 -3
- package/package.json +1 -1
- package/readme.md +41 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/data/deploymentoperation.ts +4 -0
- package/ts/data/gateway.ts +150 -6
- package/ts/data/settings.ts +0 -4
- package/ts/requests/gateway.ts +96 -0
- package/ts/requests/mail.ts +3 -3
package/changelog.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-21 - 17.0.0
|
|
4
|
+
|
|
5
|
+
### Breaking Changes
|
|
6
|
+
|
|
7
|
+
- make gateway-client credential handover explicitly two-phase (gateway)
|
|
8
|
+
- Provisioning now returns an unfinalized candidate credential without revoking existing credentials.
|
|
9
|
+
- Add candidate-authenticated finalization to activate credentials and revoke superseded client-bound credentials.
|
|
10
|
+
- Remove caller-selected gateway client finalization and provisioning-time revocation counts from the gateway API contract.
|
|
11
|
+
|
|
12
|
+
## 2026-07-21 - 16.8.0
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- add explicit gateway-route DNS modes, reconciliation outcomes, replaced-record evidence, and deployment verification retry metadata
|
|
17
|
+
- add canonical gateway-client policy, provisioning credential, and mail-overview contracts
|
|
18
|
+
- remove the legacy dedicated dcrouter ops-token setting from the Cloudly settings contract
|
|
19
|
+
|
|
3
20
|
## 2026-07-21 - 16.7.0
|
|
4
21
|
|
|
5
22
|
### Features
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/interfaces',
|
|
6
|
-
version: '
|
|
6
|
+
version: '17.0.0',
|
|
7
7
|
description: 'Shared TypeScript interfaces and TypedRequest contracts for the serve.zone ecosystem.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHVGQUF1RjtDQUNyRyxDQUFBIn0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IDeploymentPreflightProposedConfiguration, IDeploymentPreflightRuntimeTask } from './deploymentpreflight.js';
|
|
2
|
+
import type { IGatewayRouteDnsResult } from './gateway.js';
|
|
2
3
|
import type { IImageRolloutStatus, IImmutableImageDeploymentPlan, TSha256Digest } from './immutableimage.js';
|
|
3
4
|
import type { IRegistryTarget } from './registry.js';
|
|
4
5
|
import type { TServiceTargetPortRef } from './serviceports.js';
|
|
@@ -58,6 +59,9 @@ interface IDeploymentRouteVerificationEvidenceBase {
|
|
|
58
59
|
rolloutId: string;
|
|
59
60
|
rolloutGeneration: number;
|
|
60
61
|
expectedDigest: TSha256Digest;
|
|
62
|
+
gatewayDns?: IGatewayRouteDnsResult;
|
|
63
|
+
verificationAttemptCount?: number;
|
|
64
|
+
verificationStartedAt?: number;
|
|
61
65
|
}
|
|
62
66
|
export interface IDeploymentRouteVerificationSuccessEvidence extends IDeploymentRouteVerificationEvidenceBase {
|
|
63
67
|
outcome: 'succeeded';
|
|
@@ -226,4 +226,4 @@ export const validateDeploymentReservationInput = (inputArg) => {
|
|
|
226
226
|
}
|
|
227
227
|
return errors;
|
|
228
228
|
};
|
|
229
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudG9wZXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZGVwbG95bWVudG9wZXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsNEJBQTRCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFxRXRILE1BQU0sc0JBQXNCLEdBQUcsNEZBQTRGLENBQUM7QUFFNUgsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxXQUFvQixFQUFzQixFQUFFO0lBQ3pGLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwRSxDQUFDLENBQUMsUUFBUTtRQUNWLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsQ0FDM0MsV0FBbUIsRUFDc0IsRUFBRTtJQUMzQyxNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxL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
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudG9wZXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RhdGEvZGVwbG95bWVudG9wZXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsNEJBQTRCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFxRXRILE1BQU0sc0JBQXNCLEdBQUcsNEZBQTRGLENBQUM7QUFFNUgsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxXQUFvQixFQUFzQixFQUFFO0lBQ3pGLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sUUFBUSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNwRSxDQUFDLENBQUMsUUFBUTtRQUNWLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsQ0FDM0MsV0FBbUIsRUFDc0IsRUFBRTtJQUMzQyxNQUFNLFFBQVEsR0FBRyw4QkFBOEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxL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
|
|
@@ -7,6 +7,55 @@ export type TGatewayClientType = 'onebox' | 'cloudly' | 'custom';
|
|
|
7
7
|
* Canonical managed route purposes understood by gateways.
|
|
8
8
|
*/
|
|
9
9
|
export type TManagedRouteKind = 'letsencrypt-http01-forward';
|
|
10
|
+
/**
|
|
11
|
+
* DNS handling requested alongside a gateway route synchronization.
|
|
12
|
+
*
|
|
13
|
+
* - 'reconcile' claims or replaces exact-host manual A, AAAA, and CNAME
|
|
14
|
+
* records, including already-correct records, with gateway-managed state.
|
|
15
|
+
* - 'observe' reports DNS state without mutating it.
|
|
16
|
+
* - 'skip' bypasses DNS inspection and mutation and is the default when omitted.
|
|
17
|
+
*/
|
|
18
|
+
export type TGatewayRouteDnsMode = 'reconcile' | 'observe' | 'skip';
|
|
19
|
+
/**
|
|
20
|
+
* Detailed DNS outcome reported by a gateway route synchronization.
|
|
21
|
+
*/
|
|
22
|
+
export type TGatewayRouteDnsStatus = 'not-applicable' | 'skipped' | 'managed-created' | 'managed-updated' | 'managed-overwrote-manual' | 'managed-unchanged' | 'observed-satisfied' | 'managed-deleted' | 'managed-orphan-deleted' | 'record-missing' | 'target-invalid' | 'zone-unmanaged' | 'zone-unavailable' | 'record-conflict' | 'mutation-failed' | 'compensation-failed';
|
|
23
|
+
/**
|
|
24
|
+
* DNS record evidence attached to a gateway route synchronization result.
|
|
25
|
+
*/
|
|
26
|
+
export interface IGatewayRouteDnsRecord {
|
|
27
|
+
id?: string;
|
|
28
|
+
type: 'A' | 'AAAA' | 'CNAME';
|
|
29
|
+
name: string;
|
|
30
|
+
value: string;
|
|
31
|
+
ttl: number;
|
|
32
|
+
proxied?: boolean;
|
|
33
|
+
managed: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* DNS reconciliation or observation result for a gateway route.
|
|
37
|
+
*/
|
|
38
|
+
export interface IGatewayRouteDnsResult {
|
|
39
|
+
success: boolean;
|
|
40
|
+
retryable: boolean;
|
|
41
|
+
mode: TGatewayRouteDnsMode;
|
|
42
|
+
status: TGatewayRouteDnsStatus;
|
|
43
|
+
hostname?: string;
|
|
44
|
+
targetIp?: string;
|
|
45
|
+
/** Desired gateway-managed address record type. CNAME appears only in record evidence. */
|
|
46
|
+
recordType?: 'A' | 'AAAA';
|
|
47
|
+
zoneId?: string;
|
|
48
|
+
zoneName?: string;
|
|
49
|
+
nameservers?: string[];
|
|
50
|
+
records?: IGatewayRouteDnsRecord[];
|
|
51
|
+
/** Prior manual records replaced by this reconciliation, preserved as evidence. */
|
|
52
|
+
overwrittenRecords?: IGatewayRouteDnsRecord[];
|
|
53
|
+
/** Time at which the gateway checked the DNS state, as Unix epoch milliseconds. */
|
|
54
|
+
checkedAt: number;
|
|
55
|
+
/** Time at which authoritative DNS verified the desired state, as Unix epoch milliseconds. */
|
|
56
|
+
authoritativeVerifiedAt?: number;
|
|
57
|
+
message?: string;
|
|
58
|
+
}
|
|
10
59
|
/**
|
|
11
60
|
* Identity attached to gateway requests. Gateways run their own user/auth
|
|
12
61
|
* domain (e.g. dcrouter operator accounts), so role/type stay open strings;
|
|
@@ -64,8 +113,12 @@ export interface IGatewayCapabilities {
|
|
|
64
113
|
export interface IGatewayTokenCapabilities {
|
|
65
114
|
readDomains?: boolean;
|
|
66
115
|
readDnsRecords?: boolean;
|
|
116
|
+
readRoutes?: boolean;
|
|
67
117
|
syncRoutes?: boolean;
|
|
68
118
|
syncDnsRecords?: boolean;
|
|
119
|
+
readMail?: boolean;
|
|
120
|
+
manageMail?: boolean;
|
|
121
|
+
readCertificates?: boolean;
|
|
69
122
|
requestCertificates?: boolean;
|
|
70
123
|
}
|
|
71
124
|
/**
|
|
@@ -74,22 +127,84 @@ export interface IGatewayTokenCapabilities {
|
|
|
74
127
|
export interface IGatewayRouteTargetAllowance {
|
|
75
128
|
host: string;
|
|
76
129
|
ports: number[];
|
|
130
|
+
/** Allows every port for this host only; it never broadens another host allowance. */
|
|
131
|
+
allowAnyPort?: boolean;
|
|
132
|
+
}
|
|
133
|
+
/** Public gateway-client policy and lifecycle state. */
|
|
134
|
+
export interface IGatewayClient {
|
|
135
|
+
id: string;
|
|
136
|
+
type: TGatewayClientType;
|
|
137
|
+
name: string;
|
|
138
|
+
description?: string;
|
|
139
|
+
/** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
|
|
140
|
+
hostnamePatterns: string[];
|
|
141
|
+
allowedRouteTargets: IGatewayRouteTargetAllowance[];
|
|
142
|
+
capabilities: IGatewayTokenCapabilities;
|
|
143
|
+
enabled: boolean;
|
|
144
|
+
tokenCount?: number;
|
|
145
|
+
/** Generation of the durable live policy document. */
|
|
146
|
+
policyGeneration: number;
|
|
147
|
+
createdAt: number;
|
|
148
|
+
updatedAt: number;
|
|
149
|
+
createdBy: string;
|
|
150
|
+
}
|
|
151
|
+
/** Complete desired state used for idempotent gateway-client provisioning. */
|
|
152
|
+
export interface IGatewayClientProvisioningSpec {
|
|
153
|
+
id: string;
|
|
154
|
+
type: TGatewayClientType;
|
|
155
|
+
name: string;
|
|
156
|
+
description?: string;
|
|
157
|
+
/** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
|
|
158
|
+
hostnamePatterns: string[];
|
|
159
|
+
allowedRouteTargets: IGatewayRouteTargetAllowance[];
|
|
160
|
+
capabilities: IGatewayTokenCapabilities;
|
|
161
|
+
enabled?: boolean;
|
|
77
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* One-time credential material returned after durable token creation.
|
|
165
|
+
*
|
|
166
|
+
* Provisioning creates a candidate only. Existing client-bound credentials
|
|
167
|
+
* remain active until the candidate authenticates the explicit finalization
|
|
168
|
+
* request, preventing a lost provisioning response from locking out the
|
|
169
|
+
* gateway client.
|
|
170
|
+
*/
|
|
171
|
+
export interface IGatewayClientCredential {
|
|
172
|
+
tokenId: string;
|
|
173
|
+
tokenValue: string;
|
|
174
|
+
issuedAt: number;
|
|
175
|
+
state: 'candidate';
|
|
176
|
+
finalizationRequired: true;
|
|
177
|
+
}
|
|
178
|
+
export type TGatewayClientProvisioningAction = 'created' | 'updated' | 'unchanged';
|
|
78
179
|
/**
|
|
79
180
|
* Resolved auth context for a gateway client token, as reported by the gateway.
|
|
80
181
|
* Scopes are gateway-defined strings; the closed scope list lives in the gateway.
|
|
81
182
|
*/
|
|
82
|
-
|
|
83
|
-
role: TGatewayTokenRole;
|
|
183
|
+
interface IGatewayClientContextBase {
|
|
84
184
|
scopes: string[];
|
|
85
|
-
|
|
86
|
-
type: TGatewayClientType;
|
|
87
|
-
id: string;
|
|
88
|
-
};
|
|
185
|
+
/** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
|
|
89
186
|
hostnamePatterns: string[];
|
|
90
187
|
allowedRouteTargets: IGatewayRouteTargetAllowance[];
|
|
91
188
|
capabilities: IGatewayTokenCapabilities;
|
|
92
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Resolved authorization context. A gateway-client role always proves the
|
|
192
|
+
* concrete credential, bound client, and current live policy generation.
|
|
193
|
+
* Admin/operator contexts remain unbound for backward compatibility.
|
|
194
|
+
*/
|
|
195
|
+
export type IGatewayClientContext = IGatewayClientContextBase & ({
|
|
196
|
+
role: 'gatewayClient';
|
|
197
|
+
credentialId: string;
|
|
198
|
+
gatewayClient: {
|
|
199
|
+
type: TGatewayClientType;
|
|
200
|
+
id: string;
|
|
201
|
+
policyGeneration: number;
|
|
202
|
+
};
|
|
203
|
+
} | {
|
|
204
|
+
role: 'admin' | 'operator';
|
|
205
|
+
credentialId?: never;
|
|
206
|
+
gatewayClient?: never;
|
|
207
|
+
});
|
|
93
208
|
/**
|
|
94
209
|
* Where a gateway-managed domain is sourced from.
|
|
95
210
|
*
|
|
@@ -260,5 +375,7 @@ export interface IGatewayRouteSyncResult {
|
|
|
260
375
|
success: boolean;
|
|
261
376
|
action?: 'created' | 'updated' | 'deleted' | 'unchanged';
|
|
262
377
|
routeId?: string;
|
|
378
|
+
dns?: IGatewayRouteDnsResult;
|
|
263
379
|
message?: string;
|
|
264
380
|
}
|
|
381
|
+
export {};
|
|
@@ -11,7 +11,6 @@ export interface ICloudlySettings {
|
|
|
11
11
|
backupNodeCacheKeepDays?: string;
|
|
12
12
|
dcrouterGatewayUrl?: string;
|
|
13
13
|
dcrouterGatewayApiToken?: string;
|
|
14
|
-
dcrouterOpsApiToken?: string;
|
|
15
14
|
dcrouterGatewayClientId?: string;
|
|
16
15
|
dcrouterTargetHost?: string;
|
|
17
16
|
dcrouterTargetPort?: string;
|
|
@@ -43,7 +42,6 @@ export interface ICloudlySettings {
|
|
|
43
42
|
scalewayAccessKey?: string;
|
|
44
43
|
scalewaySecretKey?: string;
|
|
45
44
|
scalewayOrganizationId?: string;
|
|
46
|
-
[key: string]: string | undefined;
|
|
47
45
|
}
|
|
48
46
|
/**
|
|
49
47
|
* Interface for masked settings (used in API responses)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
-
import type { IGatewayCapabilities, IGatewayClientContext, IGatewayClientOwnership, IGatewayClientRoute, IGatewayDnsRecord, IGatewayDomain, IGatewayIdentity, IGatewayRouteConfig, IGatewayRouteSyncResult } from '../data/gateway.js';
|
|
2
|
+
import type { IGatewayCapabilities, IGatewayClient, IGatewayClientCredential, IGatewayClientProvisioningSpec, IGatewayClientContext, IGatewayClientOwnership, IGatewayClientRoute, IGatewayDnsRecord, IGatewayDomain, IGatewayIdentity, IGatewayRouteConfig, IGatewayRouteSyncResult, TGatewayRouteDnsMode, TGatewayClientProvisioningAction } from '../data/gateway.js';
|
|
3
|
+
import type { IMailOverviewDomain, IMailOverviewEmail } from './mail.js';
|
|
3
4
|
/**
|
|
4
5
|
* Gateway client contracts: the machine-facing API a gateway (dcrouter)
|
|
5
6
|
* serves to gateway clients (Onebox, Cloudly/Coreflow).
|
|
@@ -31,6 +32,74 @@ export interface IReq_GetGatewayClientContext extends plugins.typedrequestInterf
|
|
|
31
32
|
capabilities: IGatewayCapabilities;
|
|
32
33
|
};
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Admin-only gateway-client upsert and candidate credential issue.
|
|
37
|
+
* Provisioning never revokes prior client-bound credentials. The returned
|
|
38
|
+
* candidate must prove possession through finalizeGatewayClientCredential
|
|
39
|
+
* before the gateway activates it and revokes superseded siblings.
|
|
40
|
+
*/
|
|
41
|
+
export interface IReq_ProvisionGatewayClientCredential extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_ProvisionGatewayClientCredential> {
|
|
42
|
+
method: 'provisionGatewayClientCredential';
|
|
43
|
+
request: {
|
|
44
|
+
/** Admin authentication is intentionally kept at the deployed top level. */
|
|
45
|
+
identity?: IGatewayIdentity;
|
|
46
|
+
apiToken?: string;
|
|
47
|
+
provisioning: IGatewayClientProvisioningSpec;
|
|
48
|
+
credentialName?: string;
|
|
49
|
+
expiresInDays?: number | null;
|
|
50
|
+
};
|
|
51
|
+
response: {
|
|
52
|
+
success: true;
|
|
53
|
+
action: TGatewayClientProvisioningAction;
|
|
54
|
+
gatewayClient: IGatewayClient;
|
|
55
|
+
/** One-time, unfinalized credential material returned after durable creation. */
|
|
56
|
+
credential: IGatewayClientCredential;
|
|
57
|
+
message?: string;
|
|
58
|
+
} | {
|
|
59
|
+
success: false;
|
|
60
|
+
message: string;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Candidate-authenticated completion of a gateway-client credential handover.
|
|
65
|
+
* The gateway resolves client ownership from the candidate token itself; the
|
|
66
|
+
* caller cannot select a gateway client or finalize another credential.
|
|
67
|
+
*/
|
|
68
|
+
export interface IReq_FinalizeGatewayClientCredential extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_FinalizeGatewayClientCredential> {
|
|
69
|
+
method: 'finalizeGatewayClientCredential';
|
|
70
|
+
request: {
|
|
71
|
+
/** The one-time candidate token value returned by provisioning. */
|
|
72
|
+
apiToken: string;
|
|
73
|
+
/** Must identify the same candidate credential as apiToken. */
|
|
74
|
+
tokenId: string;
|
|
75
|
+
/** Admin/operator identities cannot finalize a candidate by substitution. */
|
|
76
|
+
identity?: never;
|
|
77
|
+
};
|
|
78
|
+
response: {
|
|
79
|
+
success: true;
|
|
80
|
+
gatewayClientId: string;
|
|
81
|
+
tokenId: string;
|
|
82
|
+
revokedCredentialCount: number;
|
|
83
|
+
finalizedAt: number;
|
|
84
|
+
message?: string;
|
|
85
|
+
} | {
|
|
86
|
+
success: false;
|
|
87
|
+
message: string;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Gateway-client-scoped read-only email-domain and recent-email overview. */
|
|
91
|
+
export interface IReq_GetGatewayClientMailOverview extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetGatewayClientMailOverview> {
|
|
92
|
+
method: 'getGatewayClientMailOverview';
|
|
93
|
+
request: {
|
|
94
|
+
identity?: IGatewayIdentity;
|
|
95
|
+
apiToken?: string;
|
|
96
|
+
limit?: number;
|
|
97
|
+
};
|
|
98
|
+
response: {
|
|
99
|
+
domains: IMailOverviewDomain[];
|
|
100
|
+
emails: IMailOverviewEmail[];
|
|
101
|
+
};
|
|
102
|
+
}
|
|
34
103
|
export interface IReq_GetGatewayClientDomains extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetGatewayClientDomains> {
|
|
35
104
|
method: 'getGatewayClientDomains';
|
|
36
105
|
request: {
|
|
@@ -73,6 +142,12 @@ export interface IReq_SyncGatewayClientRoute extends plugins.typedrequestInterfa
|
|
|
73
142
|
route?: IGatewayRouteConfig;
|
|
74
143
|
enabled?: boolean;
|
|
75
144
|
delete?: boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Omission means 'skip' for backward wire compatibility. Reconciliation
|
|
147
|
+
* claims or replaces exact-host manual A, AAAA, and CNAME records even
|
|
148
|
+
* when their current value already satisfies the desired address.
|
|
149
|
+
*/
|
|
150
|
+
dnsMode?: TGatewayRouteDnsMode;
|
|
76
151
|
/**
|
|
77
152
|
* Gateway source profile to bind the route to (by ref or name).
|
|
78
153
|
* Defaults to the gateway's public profile when omitted.
|
|
@@ -216,8 +216,8 @@ export interface IReq_EnqueueMail extends plugins.typedrequestInterfaces.impleme
|
|
|
216
216
|
};
|
|
217
217
|
}
|
|
218
218
|
/**
|
|
219
|
-
*
|
|
220
|
-
*
|
|
219
|
+
* Shared read-only mail overview used by the gateway-client API and Cloudly UI:
|
|
220
|
+
* configured email domains and recent queue entries.
|
|
221
221
|
*/
|
|
222
222
|
export interface IMailOverviewDomain {
|
|
223
223
|
domain: string;
|
|
@@ -239,7 +239,7 @@ export interface IReq_Any_Cloudly_GetMailOverview extends plugins.typedrequestIn
|
|
|
239
239
|
identity: IIdentity;
|
|
240
240
|
};
|
|
241
241
|
response: {
|
|
242
|
-
/** False when no dcrouter
|
|
242
|
+
/** False when no dcrouter gateway-client credential is configured. */
|
|
243
243
|
configured: boolean;
|
|
244
244
|
gatewayUrl?: string;
|
|
245
245
|
domains: IMailOverviewDomain[];
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -156,6 +156,46 @@ The immutable deployment workflow is:
|
|
|
156
156
|
|
|
157
157
|
Gateway request contracts include `getGatewayClientRoutes` (`requests.gateway.IReq_GetGatewayClientRoutes`) for listing owned `IGatewayClientRoute[]` route views, and `syncGatewayClientRoute` for idempotently syncing or deleting hostname-owned, routeRef-owned, and combined hostname-plus-routeRef routes. A client can label canonical intent with `managedRouteKind: 'letsencrypt-http01-forward'` and set a higher `priority` for a path-specific HTTP-01 route while retaining a separate normal route for the same hostname. Mail request contracts include `syncMailAddressBinding`, `deleteMailAddressBinding`, `rotateMailCredential`, and `getMailDeliveryStatus`. `IReq_GetMailDeliveryStatus` looks up a delivery spool item by `spoolItemId`, returns `data.IMailDeliveryStatus`, and accepts `IMailSubmissionRequestAuth` so service-mail credentials can query their own accepted, queued, deferred, delivered, or failed status. `TMailAddressBindingSync.outboundEnabled` explicitly controls whether a gateway should maintain a managed outbound SMTP credential for an address binding. Binding credential metadata is public; `rotateMailCredential` returns the new secret only in its one-time `IMailCredentialOneTimeSecret` response.
|
|
158
158
|
|
|
159
|
+
### Gateway Client Lifecycle and DNS
|
|
160
|
+
|
|
161
|
+
`syncGatewayClientRoute` accepts an optional `dnsMode`. Omission means `skip` for older clients. `observe` reports DNS without changing it. `reconcile` makes the gateway authoritative for the exact route hostname: it claims or replaces manual A, AAAA, and CNAME records, including already-correct manual values. Its optional `dns` result contains a closed status, retryability, the desired A/AAAA target, overwritten-record evidence, `checkedAt`, and `authoritativeVerifiedAt` once the provider or authoritative server confirms the state. Consumers can carry that evidence while retrying public propagation instead of treating an immediate recursive lookup miss as permanent.
|
|
162
|
+
|
|
163
|
+
Use `requests.gateway.IReq_ProvisionGatewayClientCredential` to replace an admin/bootstrap token with a first-class gateway-client credential. The admin-authenticated request idempotently upserts a `data.IGatewayClient`, durably creates a new bound credential, returns its raw value once, and then revokes older credentials bound to that client. It never revokes the bootstrap/admin credential. A successful response is discriminated with `success: true` and always includes the action, durable client, one-time credential, and revocation count.
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
import { requests } from '@serve.zone/interfaces';
|
|
167
|
+
|
|
168
|
+
const provisioning: requests.gateway.IReq_ProvisionGatewayClientCredential['request'] = {
|
|
169
|
+
apiToken: 'admin-bootstrap-token',
|
|
170
|
+
provisioning: {
|
|
171
|
+
id: 'cloudly-main',
|
|
172
|
+
type: 'cloudly',
|
|
173
|
+
name: 'Cloudly main',
|
|
174
|
+
hostnamePatterns: ['*'],
|
|
175
|
+
allowedRouteTargets: [
|
|
176
|
+
{
|
|
177
|
+
host: 'coretraffic.internal',
|
|
178
|
+
ports: [],
|
|
179
|
+
allowAnyPort: true,
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
capabilities: {
|
|
183
|
+
readDomains: true,
|
|
184
|
+
readDnsRecords: true,
|
|
185
|
+
readRoutes: true,
|
|
186
|
+
syncRoutes: true,
|
|
187
|
+
syncDnsRecords: true,
|
|
188
|
+
readMail: true,
|
|
189
|
+
manageMail: true,
|
|
190
|
+
readCertificates: true,
|
|
191
|
+
requestCertificates: true,
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
`getGatewayClientContext` returns effective live policy. A `gatewayClient` role necessarily includes the credential ID, bound client ID/type, and `policyGeneration`; consumers should reject admin/operator or mismatched contexts rather than falling back to a caller-supplied owner ID. `getGatewayClientMailOverview` provides an owner-scoped domain and recent-message summary. Cloudly therefore uses only `dcrouterGatewayApiToken`; the former `dcrouterOpsApiToken` setting is not part of `data.ICloudlySettings`.
|
|
198
|
+
|
|
159
199
|
Request groups are exported by product area:
|
|
160
200
|
|
|
161
201
|
- `requests.admin`
|
|
@@ -267,7 +307,7 @@ Use of these trademarks must comply with Task Venture Capital GmbH's Trademark G
|
|
|
267
307
|
|
|
268
308
|
### Company Information
|
|
269
309
|
|
|
270
|
-
Task Venture Capital GmbH
|
|
310
|
+
Task Venture Capital GmbH<br>
|
|
271
311
|
Registered at District Court Bremen HRB 35230 HB, Germany
|
|
272
312
|
|
|
273
313
|
For any legal inquiries or further information, please contact us via email at hello@task.vc.
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IDeploymentPreflightProposedConfiguration, IDeploymentPreflightRuntimeTask } from './deploymentpreflight.js';
|
|
2
|
+
import type { IGatewayRouteDnsResult } from './gateway.js';
|
|
2
3
|
import type { IImageRolloutStatus, IImmutableImageDeploymentPlan, TSha256Digest } from './immutableimage.js';
|
|
3
4
|
import { normalizeImmutableReleaseTag, normalizeSha256Digest } from './immutableimage.js';
|
|
4
5
|
import type { IRegistryTarget } from './registry.js';
|
|
@@ -342,6 +343,9 @@ interface IDeploymentRouteVerificationEvidenceBase {
|
|
|
342
343
|
rolloutId: string;
|
|
343
344
|
rolloutGeneration: number;
|
|
344
345
|
expectedDigest: TSha256Digest;
|
|
346
|
+
gatewayDns?: IGatewayRouteDnsResult;
|
|
347
|
+
verificationAttemptCount?: number;
|
|
348
|
+
verificationStartedAt?: number;
|
|
345
349
|
}
|
|
346
350
|
|
|
347
351
|
export interface IDeploymentRouteVerificationSuccessEvidence
|
package/ts/data/gateway.ts
CHANGED
|
@@ -10,6 +10,75 @@ export type TGatewayClientType = 'onebox' | 'cloudly' | 'custom';
|
|
|
10
10
|
*/
|
|
11
11
|
export type TManagedRouteKind = 'letsencrypt-http01-forward';
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* DNS handling requested alongside a gateway route synchronization.
|
|
15
|
+
*
|
|
16
|
+
* - 'reconcile' claims or replaces exact-host manual A, AAAA, and CNAME
|
|
17
|
+
* records, including already-correct records, with gateway-managed state.
|
|
18
|
+
* - 'observe' reports DNS state without mutating it.
|
|
19
|
+
* - 'skip' bypasses DNS inspection and mutation and is the default when omitted.
|
|
20
|
+
*/
|
|
21
|
+
export type TGatewayRouteDnsMode = 'reconcile' | 'observe' | 'skip';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Detailed DNS outcome reported by a gateway route synchronization.
|
|
25
|
+
*/
|
|
26
|
+
export type TGatewayRouteDnsStatus =
|
|
27
|
+
| 'not-applicable'
|
|
28
|
+
| 'skipped'
|
|
29
|
+
| 'managed-created'
|
|
30
|
+
| 'managed-updated'
|
|
31
|
+
| 'managed-overwrote-manual'
|
|
32
|
+
| 'managed-unchanged'
|
|
33
|
+
| 'observed-satisfied'
|
|
34
|
+
| 'managed-deleted'
|
|
35
|
+
| 'managed-orphan-deleted'
|
|
36
|
+
| 'record-missing'
|
|
37
|
+
| 'target-invalid'
|
|
38
|
+
| 'zone-unmanaged'
|
|
39
|
+
| 'zone-unavailable'
|
|
40
|
+
| 'record-conflict'
|
|
41
|
+
| 'mutation-failed'
|
|
42
|
+
| 'compensation-failed';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* DNS record evidence attached to a gateway route synchronization result.
|
|
46
|
+
*/
|
|
47
|
+
export interface IGatewayRouteDnsRecord {
|
|
48
|
+
id?: string;
|
|
49
|
+
type: 'A' | 'AAAA' | 'CNAME';
|
|
50
|
+
name: string;
|
|
51
|
+
value: string;
|
|
52
|
+
ttl: number;
|
|
53
|
+
proxied?: boolean;
|
|
54
|
+
managed: boolean;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* DNS reconciliation or observation result for a gateway route.
|
|
59
|
+
*/
|
|
60
|
+
export interface IGatewayRouteDnsResult {
|
|
61
|
+
success: boolean;
|
|
62
|
+
retryable: boolean;
|
|
63
|
+
mode: TGatewayRouteDnsMode;
|
|
64
|
+
status: TGatewayRouteDnsStatus;
|
|
65
|
+
hostname?: string;
|
|
66
|
+
targetIp?: string;
|
|
67
|
+
/** Desired gateway-managed address record type. CNAME appears only in record evidence. */
|
|
68
|
+
recordType?: 'A' | 'AAAA';
|
|
69
|
+
zoneId?: string;
|
|
70
|
+
zoneName?: string;
|
|
71
|
+
nameservers?: string[];
|
|
72
|
+
records?: IGatewayRouteDnsRecord[];
|
|
73
|
+
/** Prior manual records replaced by this reconciliation, preserved as evidence. */
|
|
74
|
+
overwrittenRecords?: IGatewayRouteDnsRecord[];
|
|
75
|
+
/** Time at which the gateway checked the DNS state, as Unix epoch milliseconds. */
|
|
76
|
+
checkedAt: number;
|
|
77
|
+
/** Time at which authoritative DNS verified the desired state, as Unix epoch milliseconds. */
|
|
78
|
+
authoritativeVerifiedAt?: number;
|
|
79
|
+
message?: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
13
82
|
/**
|
|
14
83
|
* Identity attached to gateway requests. Gateways run their own user/auth
|
|
15
84
|
* domain (e.g. dcrouter operator accounts), so role/type stay open strings;
|
|
@@ -70,8 +139,12 @@ export interface IGatewayCapabilities {
|
|
|
70
139
|
export interface IGatewayTokenCapabilities {
|
|
71
140
|
readDomains?: boolean;
|
|
72
141
|
readDnsRecords?: boolean;
|
|
142
|
+
readRoutes?: boolean;
|
|
73
143
|
syncRoutes?: boolean;
|
|
74
144
|
syncDnsRecords?: boolean;
|
|
145
|
+
readMail?: boolean;
|
|
146
|
+
manageMail?: boolean;
|
|
147
|
+
readCertificates?: boolean;
|
|
75
148
|
requestCertificates?: boolean;
|
|
76
149
|
}
|
|
77
150
|
|
|
@@ -81,24 +154,94 @@ export interface IGatewayTokenCapabilities {
|
|
|
81
154
|
export interface IGatewayRouteTargetAllowance {
|
|
82
155
|
host: string;
|
|
83
156
|
ports: number[];
|
|
157
|
+
/** Allows every port for this host only; it never broadens another host allowance. */
|
|
158
|
+
allowAnyPort?: boolean;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** Public gateway-client policy and lifecycle state. */
|
|
162
|
+
export interface IGatewayClient {
|
|
163
|
+
id: string;
|
|
164
|
+
type: TGatewayClientType;
|
|
165
|
+
name: string;
|
|
166
|
+
description?: string;
|
|
167
|
+
/** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
|
|
168
|
+
hostnamePatterns: string[];
|
|
169
|
+
allowedRouteTargets: IGatewayRouteTargetAllowance[];
|
|
170
|
+
capabilities: IGatewayTokenCapabilities;
|
|
171
|
+
enabled: boolean;
|
|
172
|
+
tokenCount?: number;
|
|
173
|
+
/** Generation of the durable live policy document. */
|
|
174
|
+
policyGeneration: number;
|
|
175
|
+
createdAt: number;
|
|
176
|
+
updatedAt: number;
|
|
177
|
+
createdBy: string;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** Complete desired state used for idempotent gateway-client provisioning. */
|
|
181
|
+
export interface IGatewayClientProvisioningSpec {
|
|
182
|
+
id: string;
|
|
183
|
+
type: TGatewayClientType;
|
|
184
|
+
name: string;
|
|
185
|
+
description?: string;
|
|
186
|
+
/** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
|
|
187
|
+
hostnamePatterns: string[];
|
|
188
|
+
allowedRouteTargets: IGatewayRouteTargetAllowance[];
|
|
189
|
+
capabilities: IGatewayTokenCapabilities;
|
|
190
|
+
enabled?: boolean;
|
|
84
191
|
}
|
|
85
192
|
|
|
193
|
+
/**
|
|
194
|
+
* One-time credential material returned after durable token creation.
|
|
195
|
+
*
|
|
196
|
+
* Provisioning creates a candidate only. Existing client-bound credentials
|
|
197
|
+
* remain active until the candidate authenticates the explicit finalization
|
|
198
|
+
* request, preventing a lost provisioning response from locking out the
|
|
199
|
+
* gateway client.
|
|
200
|
+
*/
|
|
201
|
+
export interface IGatewayClientCredential {
|
|
202
|
+
tokenId: string;
|
|
203
|
+
tokenValue: string;
|
|
204
|
+
issuedAt: number;
|
|
205
|
+
state: 'candidate';
|
|
206
|
+
finalizationRequired: true;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export type TGatewayClientProvisioningAction = 'created' | 'updated' | 'unchanged';
|
|
210
|
+
|
|
86
211
|
/**
|
|
87
212
|
* Resolved auth context for a gateway client token, as reported by the gateway.
|
|
88
213
|
* Scopes are gateway-defined strings; the closed scope list lives in the gateway.
|
|
89
214
|
*/
|
|
90
|
-
|
|
91
|
-
role: TGatewayTokenRole;
|
|
215
|
+
interface IGatewayClientContextBase {
|
|
92
216
|
scopes: string[];
|
|
93
|
-
|
|
94
|
-
type: TGatewayClientType;
|
|
95
|
-
id: string;
|
|
96
|
-
};
|
|
217
|
+
/** `*` matches any hostname under a managed zone; `*.zone` matches exactly one label. */
|
|
97
218
|
hostnamePatterns: string[];
|
|
98
219
|
allowedRouteTargets: IGatewayRouteTargetAllowance[];
|
|
99
220
|
capabilities: IGatewayTokenCapabilities;
|
|
100
221
|
}
|
|
101
222
|
|
|
223
|
+
/**
|
|
224
|
+
* Resolved authorization context. A gateway-client role always proves the
|
|
225
|
+
* concrete credential, bound client, and current live policy generation.
|
|
226
|
+
* Admin/operator contexts remain unbound for backward compatibility.
|
|
227
|
+
*/
|
|
228
|
+
export type IGatewayClientContext = IGatewayClientContextBase & (
|
|
229
|
+
| {
|
|
230
|
+
role: 'gatewayClient';
|
|
231
|
+
credentialId: string;
|
|
232
|
+
gatewayClient: {
|
|
233
|
+
type: TGatewayClientType;
|
|
234
|
+
id: string;
|
|
235
|
+
policyGeneration: number;
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
| {
|
|
239
|
+
role: 'admin' | 'operator';
|
|
240
|
+
credentialId?: never;
|
|
241
|
+
gatewayClient?: never;
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
|
|
102
245
|
/**
|
|
103
246
|
* Where a gateway-managed domain is sourced from.
|
|
104
247
|
*
|
|
@@ -280,5 +423,6 @@ export interface IGatewayRouteSyncResult {
|
|
|
280
423
|
success: boolean;
|
|
281
424
|
action?: 'created' | 'updated' | 'deleted' | 'unchanged';
|
|
282
425
|
routeId?: string;
|
|
426
|
+
dns?: IGatewayRouteDnsResult;
|
|
283
427
|
message?: string;
|
|
284
428
|
}
|
package/ts/data/settings.ts
CHANGED
|
@@ -29,7 +29,6 @@ export interface ICloudlySettings {
|
|
|
29
29
|
// static dcrouterTargetHost (e.g. {"worker-a":"192.0.2.10"}).
|
|
30
30
|
dcrouterGatewayUrl?: string;
|
|
31
31
|
dcrouterGatewayApiToken?: string;
|
|
32
|
-
dcrouterOpsApiToken?: string;
|
|
33
32
|
dcrouterGatewayClientId?: string;
|
|
34
33
|
dcrouterTargetHost?: string;
|
|
35
34
|
dcrouterTargetPort?: string;
|
|
@@ -84,9 +83,6 @@ export interface ICloudlySettings {
|
|
|
84
83
|
scalewayAccessKey?: string;
|
|
85
84
|
scalewaySecretKey?: string;
|
|
86
85
|
scalewayOrganizationId?: string;
|
|
87
|
-
|
|
88
|
-
// Other settings that might be added in the future
|
|
89
|
-
[key: string]: string | undefined;
|
|
90
86
|
}
|
|
91
87
|
|
|
92
88
|
/**
|
package/ts/requests/gateway.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import type {
|
|
3
3
|
IGatewayCapabilities,
|
|
4
|
+
IGatewayClient,
|
|
5
|
+
IGatewayClientCredential,
|
|
6
|
+
IGatewayClientProvisioningSpec,
|
|
4
7
|
IGatewayClientContext,
|
|
5
8
|
IGatewayClientOwnership,
|
|
6
9
|
IGatewayClientRoute,
|
|
@@ -9,7 +12,10 @@ import type {
|
|
|
9
12
|
IGatewayIdentity,
|
|
10
13
|
IGatewayRouteConfig,
|
|
11
14
|
IGatewayRouteSyncResult,
|
|
15
|
+
TGatewayRouteDnsMode,
|
|
16
|
+
TGatewayClientProvisioningAction,
|
|
12
17
|
} from '../data/gateway.js';
|
|
18
|
+
import type { IMailOverviewDomain, IMailOverviewEmail } from './mail.js';
|
|
13
19
|
|
|
14
20
|
/**
|
|
15
21
|
* Gateway client contracts: the machine-facing API a gateway (dcrouter)
|
|
@@ -51,6 +57,90 @@ export interface IReq_GetGatewayClientContext extends plugins.typedrequestInterf
|
|
|
51
57
|
};
|
|
52
58
|
}
|
|
53
59
|
|
|
60
|
+
/**
|
|
61
|
+
* Admin-only gateway-client upsert and candidate credential issue.
|
|
62
|
+
* Provisioning never revokes prior client-bound credentials. The returned
|
|
63
|
+
* candidate must prove possession through finalizeGatewayClientCredential
|
|
64
|
+
* before the gateway activates it and revokes superseded siblings.
|
|
65
|
+
*/
|
|
66
|
+
export interface IReq_ProvisionGatewayClientCredential extends plugins.typedrequestInterfaces.implementsTR<
|
|
67
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
68
|
+
IReq_ProvisionGatewayClientCredential
|
|
69
|
+
> {
|
|
70
|
+
method: 'provisionGatewayClientCredential';
|
|
71
|
+
request: {
|
|
72
|
+
/** Admin authentication is intentionally kept at the deployed top level. */
|
|
73
|
+
identity?: IGatewayIdentity;
|
|
74
|
+
apiToken?: string;
|
|
75
|
+
provisioning: IGatewayClientProvisioningSpec;
|
|
76
|
+
credentialName?: string;
|
|
77
|
+
expiresInDays?: number | null;
|
|
78
|
+
};
|
|
79
|
+
response:
|
|
80
|
+
| {
|
|
81
|
+
success: true;
|
|
82
|
+
action: TGatewayClientProvisioningAction;
|
|
83
|
+
gatewayClient: IGatewayClient;
|
|
84
|
+
/** One-time, unfinalized credential material returned after durable creation. */
|
|
85
|
+
credential: IGatewayClientCredential;
|
|
86
|
+
message?: string;
|
|
87
|
+
}
|
|
88
|
+
| {
|
|
89
|
+
success: false;
|
|
90
|
+
message: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Candidate-authenticated completion of a gateway-client credential handover.
|
|
96
|
+
* The gateway resolves client ownership from the candidate token itself; the
|
|
97
|
+
* caller cannot select a gateway client or finalize another credential.
|
|
98
|
+
*/
|
|
99
|
+
export interface IReq_FinalizeGatewayClientCredential extends plugins.typedrequestInterfaces.implementsTR<
|
|
100
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
101
|
+
IReq_FinalizeGatewayClientCredential
|
|
102
|
+
> {
|
|
103
|
+
method: 'finalizeGatewayClientCredential';
|
|
104
|
+
request: {
|
|
105
|
+
/** The one-time candidate token value returned by provisioning. */
|
|
106
|
+
apiToken: string;
|
|
107
|
+
/** Must identify the same candidate credential as apiToken. */
|
|
108
|
+
tokenId: string;
|
|
109
|
+
/** Admin/operator identities cannot finalize a candidate by substitution. */
|
|
110
|
+
identity?: never;
|
|
111
|
+
};
|
|
112
|
+
response:
|
|
113
|
+
| {
|
|
114
|
+
success: true;
|
|
115
|
+
gatewayClientId: string;
|
|
116
|
+
tokenId: string;
|
|
117
|
+
revokedCredentialCount: number;
|
|
118
|
+
finalizedAt: number;
|
|
119
|
+
message?: string;
|
|
120
|
+
}
|
|
121
|
+
| {
|
|
122
|
+
success: false;
|
|
123
|
+
message: string;
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Gateway-client-scoped read-only email-domain and recent-email overview. */
|
|
128
|
+
export interface IReq_GetGatewayClientMailOverview extends plugins.typedrequestInterfaces.implementsTR<
|
|
129
|
+
plugins.typedrequestInterfaces.ITypedRequest,
|
|
130
|
+
IReq_GetGatewayClientMailOverview
|
|
131
|
+
> {
|
|
132
|
+
method: 'getGatewayClientMailOverview';
|
|
133
|
+
request: {
|
|
134
|
+
identity?: IGatewayIdentity;
|
|
135
|
+
apiToken?: string;
|
|
136
|
+
limit?: number;
|
|
137
|
+
};
|
|
138
|
+
response: {
|
|
139
|
+
domains: IMailOverviewDomain[];
|
|
140
|
+
emails: IMailOverviewEmail[];
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
54
144
|
export interface IReq_GetGatewayClientDomains extends plugins.typedrequestInterfaces.implementsTR<
|
|
55
145
|
plugins.typedrequestInterfaces.ITypedRequest,
|
|
56
146
|
IReq_GetGatewayClientDomains
|
|
@@ -108,6 +198,12 @@ export interface IReq_SyncGatewayClientRoute extends plugins.typedrequestInterfa
|
|
|
108
198
|
route?: IGatewayRouteConfig;
|
|
109
199
|
enabled?: boolean;
|
|
110
200
|
delete?: boolean;
|
|
201
|
+
/**
|
|
202
|
+
* Omission means 'skip' for backward wire compatibility. Reconciliation
|
|
203
|
+
* claims or replaces exact-host manual A, AAAA, and CNAME records even
|
|
204
|
+
* when their current value already satisfies the desired address.
|
|
205
|
+
*/
|
|
206
|
+
dnsMode?: TGatewayRouteDnsMode;
|
|
111
207
|
/**
|
|
112
208
|
* Gateway source profile to bind the route to (by ref or name).
|
|
113
209
|
* Defaults to the gateway's public profile when omitted.
|
package/ts/requests/mail.ts
CHANGED
|
@@ -310,8 +310,8 @@ export interface IReq_EnqueueMail extends plugins.typedrequestInterfaces.impleme
|
|
|
310
310
|
}
|
|
311
311
|
|
|
312
312
|
/**
|
|
313
|
-
*
|
|
314
|
-
*
|
|
313
|
+
* Shared read-only mail overview used by the gateway-client API and Cloudly UI:
|
|
314
|
+
* configured email domains and recent queue entries.
|
|
315
315
|
*/
|
|
316
316
|
export interface IMailOverviewDomain {
|
|
317
317
|
domain: string;
|
|
@@ -338,7 +338,7 @@ export interface IReq_Any_Cloudly_GetMailOverview extends plugins.typedrequestIn
|
|
|
338
338
|
identity: IIdentity;
|
|
339
339
|
};
|
|
340
340
|
response: {
|
|
341
|
-
/** False when no dcrouter
|
|
341
|
+
/** False when no dcrouter gateway-client credential is configured. */
|
|
342
342
|
configured: boolean;
|
|
343
343
|
gatewayUrl?: string;
|
|
344
344
|
domains: IMailOverviewDomain[];
|