@mannyc1/ts-release 0.2.2 → 0.3.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/ARCHITECTURE.md +60 -0
- package/CHANGELOG.md +82 -0
- package/README.md +129 -6
- package/SPEC.md +51 -0
- package/apps/release-ts/README.md +7 -0
- package/apps/ts-release-agents/package.json +1 -1
- package/apps/ts-release-agents/src/check.ts +7 -2
- package/apps/ts-release-agents/test/contract.test.ts +2 -2
- package/dist/bin/ts-release.js +154 -47
- package/dist/drivers/archive.d.ts +2 -1
- package/dist/drivers/archive.d.ts.map +1 -1
- package/dist/drivers/archive.js +12 -8
- package/dist/drivers/archive.js.map +1 -1
- package/dist/drivers/process.d.ts.map +1 -1
- package/dist/drivers/process.js +4 -4
- package/dist/drivers/process.js.map +1 -1
- package/dist/drivers/python-wheel.d.ts +21 -0
- package/dist/drivers/python-wheel.d.ts.map +1 -0
- package/dist/drivers/python-wheel.js +109 -0
- package/dist/drivers/python-wheel.js.map +1 -0
- package/dist/drivers/workspace.d.ts +3 -0
- package/dist/drivers/workspace.d.ts.map +1 -1
- package/dist/drivers/workspace.js +5 -1
- package/dist/drivers/workspace.js.map +1 -1
- package/dist/operation-journal/authority.d.ts +3 -0
- package/dist/operation-journal/authority.d.ts.map +1 -0
- package/dist/operation-journal/authority.js +147 -0
- package/dist/operation-journal/authority.js.map +1 -0
- package/dist/operation-journal/aws/deadline.d.ts +12 -0
- package/dist/operation-journal/aws/deadline.d.ts.map +1 -0
- package/dist/operation-journal/aws/deadline.js +38 -0
- package/dist/operation-journal/aws/deadline.js.map +1 -0
- package/dist/operation-journal/aws/oidc.d.ts +27 -0
- package/dist/operation-journal/aws/oidc.d.ts.map +1 -0
- package/dist/operation-journal/aws/oidc.js +361 -0
- package/dist/operation-journal/aws/oidc.js.map +1 -0
- package/dist/operation-journal/aws/policy.d.ts +42 -0
- package/dist/operation-journal/aws/policy.d.ts.map +1 -0
- package/dist/operation-journal/aws/policy.js +404 -0
- package/dist/operation-journal/aws/policy.js.map +1 -0
- package/dist/operation-journal/aws/s3-boundary.d.ts +17 -0
- package/dist/operation-journal/aws/s3-boundary.d.ts.map +1 -0
- package/dist/operation-journal/aws/s3-boundary.js +417 -0
- package/dist/operation-journal/aws/s3-boundary.js.map +1 -0
- package/dist/operation-journal/aws.d.ts +11 -0
- package/dist/operation-journal/aws.d.ts.map +1 -0
- package/dist/operation-journal/aws.js +50 -0
- package/dist/operation-journal/aws.js.map +1 -0
- package/dist/operation-journal/canonical.d.ts +52 -0
- package/dist/operation-journal/canonical.d.ts.map +1 -0
- package/dist/operation-journal/canonical.js +282 -0
- package/dist/operation-journal/canonical.js.map +1 -0
- package/dist/operation-journal/model.d.ts +251 -0
- package/dist/operation-journal/model.d.ts.map +1 -0
- package/dist/operation-journal/model.js +56 -0
- package/dist/operation-journal/model.js.map +1 -0
- package/dist/operation-journal/reducer.d.ts +28 -0
- package/dist/operation-journal/reducer.d.ts.map +1 -0
- package/dist/operation-journal/reducer.js +73 -0
- package/dist/operation-journal/reducer.js.map +1 -0
- package/dist/operation-journal/s3.d.ts +7 -0
- package/dist/operation-journal/s3.d.ts.map +1 -0
- package/dist/operation-journal/s3.js +667 -0
- package/dist/operation-journal/s3.js.map +1 -0
- package/dist/operation-journal.d.ts +14 -0
- package/dist/operation-journal.d.ts.map +1 -0
- package/dist/operation-journal.js +12 -0
- package/dist/operation-journal.js.map +1 -0
- package/dist/platform/credentials.d.ts.map +1 -1
- package/dist/platform/credentials.js +65 -3
- package/dist/platform/credentials.js.map +1 -1
- package/dist/publication/github.d.ts.map +1 -1
- package/dist/publication/github.js +66 -15
- package/dist/publication/github.js.map +1 -1
- package/dist/release/capabilities.d.ts.map +1 -1
- package/dist/release/capabilities.js +2 -2
- package/dist/release/capabilities.js.map +1 -1
- package/dist/release/prepare.d.ts.map +1 -1
- package/dist/release/prepare.js +4 -5
- package/dist/release/prepare.js.map +1 -1
- package/dist/release/prepared-store.d.ts.map +1 -1
- package/dist/release/prepared-store.js +11 -9
- package/dist/release/prepared-store.js.map +1 -1
- package/package.json +19 -4
- package/src/drivers/archive.ts +17 -8
- package/src/drivers/process.ts +3 -4
- package/src/drivers/python-wheel.ts +145 -0
- package/src/drivers/workspace.ts +7 -1
- package/src/operation-journal/authority.ts +162 -0
- package/src/operation-journal/aws/deadline.ts +41 -0
- package/src/operation-journal/aws/oidc.ts +439 -0
- package/src/operation-journal/aws/policy.ts +491 -0
- package/src/operation-journal/aws/s3-boundary.ts +562 -0
- package/src/operation-journal/aws.ts +60 -0
- package/src/operation-journal/canonical.ts +373 -0
- package/src/operation-journal/model.ts +301 -0
- package/src/operation-journal/reducer.ts +112 -0
- package/src/operation-journal/s3.ts +884 -0
- package/src/operation-journal.ts +51 -0
- package/src/platform/credentials.ts +71 -3
- package/src/publication/github.ts +83 -15
- package/src/release/capabilities.ts +3 -2
- package/src/release/prepare.ts +3 -5
- package/src/release/prepared-store.ts +8 -7
- package/templates/README.md +2 -2
- package/templates/github-actions/release.yml +24 -7
- package/templates/github-actions/reviewed-release.yml +49 -14
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { AssumeRoleWithWebIdentityCommand, GetCallerIdentityCommand, STSClient } from "@aws-sdk/client-sts";
|
|
5
|
+
import * as Effect from "effect/Effect";
|
|
6
|
+
import { parseStrictJson } from "../../model/canonical.js";
|
|
7
|
+
import { validateS3JournalAuthority } from "../authority.js";
|
|
8
|
+
import { S3JournalBoundaryError } from "../model.js";
|
|
9
|
+
import { operationJournalNetworkDeadlineMilliseconds, withOperationJournalNetworkDeadline } from "./deadline.js";
|
|
10
|
+
const maximumOidcResponseBytes = 16_384;
|
|
11
|
+
const maximumOidcTokenCharacters = 12_000;
|
|
12
|
+
const maximumOidcHeaderCharacters = 2_048;
|
|
13
|
+
const maximumOidcPayloadCharacters = 8_192;
|
|
14
|
+
const maximumOidcSignatureCharacters = 2_048;
|
|
15
|
+
const fail = (reason) => {
|
|
16
|
+
throw S3JournalBoundaryError.make({
|
|
17
|
+
operation: "observe-authority",
|
|
18
|
+
commitment: "not-applicable",
|
|
19
|
+
reason
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
const boundaryError = (cause, reason) => cause instanceof S3JournalBoundaryError
|
|
23
|
+
? cause
|
|
24
|
+
: S3JournalBoundaryError.make({
|
|
25
|
+
operation: "observe-authority",
|
|
26
|
+
commitment: "not-applicable",
|
|
27
|
+
reason
|
|
28
|
+
});
|
|
29
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
30
|
+
const requireString = (object, field) => {
|
|
31
|
+
const value = object[field];
|
|
32
|
+
if (typeof value !== "string" || value.length === 0)
|
|
33
|
+
fail(`GitHub OIDC claim ${field} is missing or invalid.`);
|
|
34
|
+
return value;
|
|
35
|
+
};
|
|
36
|
+
const requireInteger = (object, field) => {
|
|
37
|
+
const value = object[field];
|
|
38
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value)) {
|
|
39
|
+
fail(`GitHub OIDC claim ${field} is missing or invalid.`);
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
};
|
|
43
|
+
const decodeBase64Url = (value, maximum, label) => {
|
|
44
|
+
if (value.length > maximum || !/^[A-Za-z0-9_-]+$/u.test(value)) {
|
|
45
|
+
fail(`${label} is not bounded canonical base64url.`);
|
|
46
|
+
}
|
|
47
|
+
const bytes = Buffer.from(value, "base64url");
|
|
48
|
+
if (bytes.toString("base64url") !== value)
|
|
49
|
+
fail(`${label} is not canonical base64url.`);
|
|
50
|
+
try {
|
|
51
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return fail(`${label} is not UTF-8.`);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const decodeOidcToken = (token, now) => {
|
|
58
|
+
if (token.length < 64 || token.length > maximumOidcTokenCharacters ||
|
|
59
|
+
!/^[A-Za-z0-9_.-]+$/u.test(token)) {
|
|
60
|
+
fail("GitHub OIDC response is not one bounded compact JWT.");
|
|
61
|
+
}
|
|
62
|
+
const segments = token.split(".");
|
|
63
|
+
if (segments.length !== 3 || segments.some((segment) => segment.length === 0)) {
|
|
64
|
+
fail("GitHub OIDC response is not one compact JWT.");
|
|
65
|
+
}
|
|
66
|
+
const signature = segments[2];
|
|
67
|
+
if (signature.length > maximumOidcSignatureCharacters ||
|
|
68
|
+
Buffer.from(signature, "base64url").toString("base64url") !== signature) {
|
|
69
|
+
fail("GitHub OIDC signature is not bounded canonical base64url.");
|
|
70
|
+
}
|
|
71
|
+
let header;
|
|
72
|
+
let payload;
|
|
73
|
+
try {
|
|
74
|
+
header = parseStrictJson(decodeBase64Url(segments[0], maximumOidcHeaderCharacters, "GitHub OIDC header"));
|
|
75
|
+
payload = parseStrictJson(decodeBase64Url(segments[1], maximumOidcPayloadCharacters, "GitHub OIDC payload"));
|
|
76
|
+
}
|
|
77
|
+
catch (cause) {
|
|
78
|
+
if (cause instanceof S3JournalBoundaryError)
|
|
79
|
+
throw cause;
|
|
80
|
+
return fail("GitHub OIDC JWT does not contain strict JSON.");
|
|
81
|
+
}
|
|
82
|
+
if (!isObject(header) || header.alg !== "RS256" || header.typ !== "JWT" ||
|
|
83
|
+
typeof header.kid !== "string" || header.kid.length === 0) {
|
|
84
|
+
fail("GitHub OIDC JWT header is not the admitted RS256 identity.");
|
|
85
|
+
}
|
|
86
|
+
if (!isObject(payload))
|
|
87
|
+
fail("GitHub OIDC JWT payload must be an object.");
|
|
88
|
+
const claimsPayload = payload;
|
|
89
|
+
const nowSeconds = Math.floor(now.getTime() / 1000);
|
|
90
|
+
const issuedAt = requireInteger(claimsPayload, "iat");
|
|
91
|
+
const notBefore = requireInteger(claimsPayload, "nbf");
|
|
92
|
+
const expiresAt = requireInteger(claimsPayload, "exp");
|
|
93
|
+
if (issuedAt > nowSeconds + 30 || notBefore > nowSeconds + 30 || expiresAt <= nowSeconds + 30 ||
|
|
94
|
+
expiresAt <= issuedAt || expiresAt - issuedAt > 900) {
|
|
95
|
+
fail("GitHub OIDC JWT validity window is not current and bounded.");
|
|
96
|
+
}
|
|
97
|
+
const claims = {
|
|
98
|
+
issuer: requireString(claimsPayload, "iss"),
|
|
99
|
+
audience: requireString(claimsPayload, "aud"),
|
|
100
|
+
subject: requireString(claimsPayload, "sub"),
|
|
101
|
+
repository: requireString(claimsPayload, "repository"),
|
|
102
|
+
repositoryId: requireString(claimsPayload, "repository_id"),
|
|
103
|
+
repositoryOwnerId: requireString(claimsPayload, "repository_owner_id"),
|
|
104
|
+
repositoryVisibility: requireString(claimsPayload, "repository_visibility"),
|
|
105
|
+
eventName: requireString(claimsPayload, "event_name"),
|
|
106
|
+
ref: requireString(claimsPayload, "ref"),
|
|
107
|
+
refType: requireString(claimsPayload, "ref_type"),
|
|
108
|
+
sha: requireString(claimsPayload, "sha"),
|
|
109
|
+
environment: requireString(claimsPayload, "environment"),
|
|
110
|
+
runnerEnvironment: requireString(claimsPayload, "runner_environment"),
|
|
111
|
+
runId: requireString(claimsPayload, "run_id"),
|
|
112
|
+
runAttempt: requireString(claimsPayload, "run_attempt"),
|
|
113
|
+
workflow: requireString(claimsPayload, "workflow"),
|
|
114
|
+
workflowRef: requireString(claimsPayload, "workflow_ref"),
|
|
115
|
+
workflowSha: requireString(claimsPayload, "workflow_sha"),
|
|
116
|
+
jobWorkflowRef: requireString(claimsPayload, "job_workflow_ref"),
|
|
117
|
+
jobWorkflowSha: requireString(claimsPayload, "job_workflow_sha")
|
|
118
|
+
};
|
|
119
|
+
if (claims.issuer !== "https://token.actions.githubusercontent.com" || claims.audience !== "sts.amazonaws.com") {
|
|
120
|
+
fail("GitHub OIDC issuer or audience is not the admitted AWS exchange identity.");
|
|
121
|
+
}
|
|
122
|
+
const immutableJobWorkflow = claims.jobWorkflowRef.match(/@([a-f0-9]{40})$/u);
|
|
123
|
+
if (immutableJobWorkflow?.[1] !== claims.jobWorkflowSha) {
|
|
124
|
+
fail("GitHub OIDC called-workflow ref is not pinned to its exact source SHA.");
|
|
125
|
+
}
|
|
126
|
+
return claims;
|
|
127
|
+
};
|
|
128
|
+
const sameClaims = (left, right) => {
|
|
129
|
+
const fields = Object.keys(left);
|
|
130
|
+
return fields.length === Object.keys(right).length && fields.every((field) => left[field] === right[field]);
|
|
131
|
+
};
|
|
132
|
+
const requireCleanAwsEnvironment = (environment, fileExists) => {
|
|
133
|
+
const forbiddenHostVariables = new Set([
|
|
134
|
+
"ALL_PROXY",
|
|
135
|
+
"HTTP_PROXY",
|
|
136
|
+
"HTTPS_PROXY",
|
|
137
|
+
"NO_PROXY",
|
|
138
|
+
"NODE_DEBUG",
|
|
139
|
+
"NODE_DEBUG_NATIVE",
|
|
140
|
+
"NODE_EXTRA_CA_CERTS",
|
|
141
|
+
"NODE_OPTIONS",
|
|
142
|
+
"NODE_PATH",
|
|
143
|
+
"NODE_TLS_REJECT_UNAUTHORIZED",
|
|
144
|
+
"NODE_USE_ENV_PROXY",
|
|
145
|
+
"OPENSSL_CONF",
|
|
146
|
+
"SSLKEYLOGFILE",
|
|
147
|
+
"SSL_CERT_DIR",
|
|
148
|
+
"SSL_CERT_FILE",
|
|
149
|
+
"all_proxy",
|
|
150
|
+
"http_proxy",
|
|
151
|
+
"https_proxy",
|
|
152
|
+
"no_proxy"
|
|
153
|
+
]);
|
|
154
|
+
const ambient = Object.entries(environment)
|
|
155
|
+
.filter(([key, value]) => value !== undefined && value !== "" &&
|
|
156
|
+
(key.startsWith("AWS_") || forbiddenHostVariables.has(key)))
|
|
157
|
+
.map(([key]) => key)
|
|
158
|
+
.sort();
|
|
159
|
+
if (ambient.length > 0) {
|
|
160
|
+
fail(`Ambient AWS configuration is forbidden (${ambient.join(", ")}).`);
|
|
161
|
+
}
|
|
162
|
+
const homeDirectories = [environment.HOME, environment.USERPROFILE]
|
|
163
|
+
.filter((value) => value !== undefined && value.length > 0);
|
|
164
|
+
const sharedFiles = [...new Set(homeDirectories)]
|
|
165
|
+
.flatMap((home) => [join(home, ".aws", "credentials"), join(home, ".aws", "config")]);
|
|
166
|
+
if (sharedFiles.some(fileExists)) {
|
|
167
|
+
fail("Ambient AWS shared credential or configuration files are forbidden.");
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const consumeGitHubOidcCoordinates = (environment) => {
|
|
171
|
+
const requestUrl = environment.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
172
|
+
const requestToken = environment.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
173
|
+
delete environment.ACTIONS_ID_TOKEN_REQUEST_URL;
|
|
174
|
+
delete environment.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
|
|
175
|
+
if (environment.ACTIONS_ID_TOKEN_REQUEST_URL !== undefined ||
|
|
176
|
+
environment.ACTIONS_ID_TOKEN_REQUEST_TOKEN !== undefined) {
|
|
177
|
+
return fail("GitHub OIDC request coordinates could not be consumed from the process environment.");
|
|
178
|
+
}
|
|
179
|
+
if (requestUrl === undefined || requestUrl === "" || requestToken === undefined || requestToken === "") {
|
|
180
|
+
return fail("GitHub OIDC request coordinates are unavailable.");
|
|
181
|
+
}
|
|
182
|
+
if (requestUrl.length > 4_096 || requestToken.length > 8_192 ||
|
|
183
|
+
!/^[!-~]+$/u.test(requestUrl) || !/^[!-~]+$/u.test(requestToken)) {
|
|
184
|
+
return fail("GitHub OIDC request coordinates exceed their canonical bounds.");
|
|
185
|
+
}
|
|
186
|
+
return { requestUrl, requestToken };
|
|
187
|
+
};
|
|
188
|
+
const readOidcResponse = async (response) => {
|
|
189
|
+
const rawLength = response.headers.get("content-length");
|
|
190
|
+
if (rawLength === null || !/^[1-9][0-9]{0,5}$/u.test(rawLength)) {
|
|
191
|
+
return fail("GitHub OIDC token response lacks one bounded Content-Length.");
|
|
192
|
+
}
|
|
193
|
+
const contentLength = Number(rawLength);
|
|
194
|
+
if (contentLength > maximumOidcResponseBytes || response.body === null) {
|
|
195
|
+
return fail("GitHub OIDC token response exceeds its byte bound.");
|
|
196
|
+
}
|
|
197
|
+
const bytes = new Uint8Array(contentLength);
|
|
198
|
+
const reader = response.body.getReader();
|
|
199
|
+
let offset = 0;
|
|
200
|
+
try {
|
|
201
|
+
while (true) {
|
|
202
|
+
const chunk = await reader.read();
|
|
203
|
+
if (chunk.done)
|
|
204
|
+
break;
|
|
205
|
+
if (offset + chunk.value.length > bytes.length) {
|
|
206
|
+
return fail("GitHub OIDC token response stream exceeded Content-Length.");
|
|
207
|
+
}
|
|
208
|
+
bytes.set(chunk.value, offset);
|
|
209
|
+
offset += chunk.value.length;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
reader.releaseLock();
|
|
214
|
+
}
|
|
215
|
+
if (offset !== bytes.length) {
|
|
216
|
+
return fail("GitHub OIDC token response stream disagrees with Content-Length.");
|
|
217
|
+
}
|
|
218
|
+
let text;
|
|
219
|
+
try {
|
|
220
|
+
text = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
221
|
+
return parseStrictJson(text);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return fail("GitHub OIDC token response is not strict UTF-8 JSON.");
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const requestGitHubOidcToken = async (requestUrl, requestToken, fetchImpl, deadlineMilliseconds) => {
|
|
228
|
+
let url;
|
|
229
|
+
try {
|
|
230
|
+
url = new URL(requestUrl);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return fail("GitHub OIDC request URL is invalid.");
|
|
234
|
+
}
|
|
235
|
+
const rawAuthority = requestUrl.slice(requestUrl.indexOf("//") + 2).split(/[/?#]/u, 1)[0] ?? "";
|
|
236
|
+
if (url.protocol !== "https:" ||
|
|
237
|
+
!/^[a-z0-9-]+\.actions\.githubusercontent\.com$/u.test(url.hostname) ||
|
|
238
|
+
rawAuthority.includes(":") || url.port !== "" ||
|
|
239
|
+
url.username !== "" || url.password !== "" || url.hash !== "") {
|
|
240
|
+
return fail("GitHub OIDC request URL is not one authenticated Actions HTTPS endpoint.");
|
|
241
|
+
}
|
|
242
|
+
url.searchParams.set("audience", "sts.amazonaws.com");
|
|
243
|
+
if (url.href.length > 4_096 || !/^[!-~]+$/u.test(url.href)) {
|
|
244
|
+
return fail("GitHub OIDC request URL exceeds its canonical bounds after audience binding.");
|
|
245
|
+
}
|
|
246
|
+
return withOperationJournalNetworkDeadline(async (signal) => {
|
|
247
|
+
const response = await fetchImpl(url, {
|
|
248
|
+
method: "GET",
|
|
249
|
+
headers: {
|
|
250
|
+
Accept: "application/json",
|
|
251
|
+
"Accept-Encoding": "identity",
|
|
252
|
+
Authorization: `bearer ${requestToken}`
|
|
253
|
+
},
|
|
254
|
+
redirect: "error",
|
|
255
|
+
signal
|
|
256
|
+
});
|
|
257
|
+
if (!response.ok || response.redirected || response.url !== url.href) {
|
|
258
|
+
fail("GitHub OIDC token request did not return the exact requested endpoint.");
|
|
259
|
+
}
|
|
260
|
+
const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
|
|
261
|
+
if (contentType !== "application/json")
|
|
262
|
+
fail("GitHub OIDC token response is not JSON.");
|
|
263
|
+
const body = await readOidcResponse(response);
|
|
264
|
+
if (!isObject(body) || Object.keys(body).length !== 1 || typeof body.value !== "string") {
|
|
265
|
+
return fail("GitHub OIDC token response fields are not the exact admitted set.");
|
|
266
|
+
}
|
|
267
|
+
return body.value;
|
|
268
|
+
}, deadlineMilliseconds);
|
|
269
|
+
};
|
|
270
|
+
const roleName = (roleArn) => roleArn.slice(roleArn.lastIndexOf("/") + 1);
|
|
271
|
+
export const defaultAwsJournalOidcRuntime = {
|
|
272
|
+
environment: process.env,
|
|
273
|
+
fileExists: existsSync,
|
|
274
|
+
fetch: globalThis.fetch,
|
|
275
|
+
now: () => new Date(),
|
|
276
|
+
makeAnonymousSts: (config) => new STSClient(config),
|
|
277
|
+
makeSessionSts: (config) => new STSClient(config)
|
|
278
|
+
};
|
|
279
|
+
export const acquireAwsJournalSession = (authority, runtime = defaultAwsJournalOidcRuntime) => Effect.tryPromise({
|
|
280
|
+
try: async () => {
|
|
281
|
+
try {
|
|
282
|
+
validateS3JournalAuthority(authority);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
fail("AWS journal activation contract is malformed.");
|
|
286
|
+
}
|
|
287
|
+
const coordinates = consumeGitHubOidcCoordinates(runtime.environment);
|
|
288
|
+
let runnerRequestToken = coordinates.requestToken;
|
|
289
|
+
let webIdentityToken = "";
|
|
290
|
+
try {
|
|
291
|
+
requireCleanAwsEnvironment(runtime.environment, runtime.fileExists);
|
|
292
|
+
const deadlineMilliseconds = runtime.networkDeadlineMilliseconds ??
|
|
293
|
+
operationJournalNetworkDeadlineMilliseconds;
|
|
294
|
+
webIdentityToken = await requestGitHubOidcToken(coordinates.requestUrl, runnerRequestToken, runtime.fetch, deadlineMilliseconds);
|
|
295
|
+
const observedClaims = decodeOidcToken(webIdentityToken, runtime.now());
|
|
296
|
+
if (!sameClaims(observedClaims, authority.oidc)) {
|
|
297
|
+
fail("GitHub OIDC claims drifted from the exact activation contract.");
|
|
298
|
+
}
|
|
299
|
+
const sessionName = `ts-release-journal-${observedClaims.runId}-${observedClaims.runAttempt}`;
|
|
300
|
+
if (!/^[A-Za-z0-9+=,.@-]{2,64}$/u.test(sessionName)) {
|
|
301
|
+
fail("Derived AWS journal session name is not canonical.");
|
|
302
|
+
}
|
|
303
|
+
const noAmbientCredentials = async () => {
|
|
304
|
+
throw new Error("Ambient AWS credential resolution is disabled.");
|
|
305
|
+
};
|
|
306
|
+
const anonymous = runtime.makeAnonymousSts({
|
|
307
|
+
region: authority.region,
|
|
308
|
+
maxAttempts: 1,
|
|
309
|
+
credentials: noAmbientCredentials
|
|
310
|
+
});
|
|
311
|
+
const assumed = await withOperationJournalNetworkDeadline((signal) => anonymous.send(new AssumeRoleWithWebIdentityCommand({
|
|
312
|
+
RoleArn: authority.roleArn,
|
|
313
|
+
RoleSessionName: sessionName,
|
|
314
|
+
WebIdentityToken: webIdentityToken,
|
|
315
|
+
DurationSeconds: 900
|
|
316
|
+
}), { abortSignal: signal }), deadlineMilliseconds);
|
|
317
|
+
const accessKeyId = assumed.Credentials?.AccessKeyId;
|
|
318
|
+
const secretAccessKey = assumed.Credentials?.SecretAccessKey;
|
|
319
|
+
const sessionToken = assumed.Credentials?.SessionToken;
|
|
320
|
+
const expiration = assumed.Credentials?.Expiration;
|
|
321
|
+
if (accessKeyId === undefined || secretAccessKey === undefined ||
|
|
322
|
+
sessionToken === undefined || expiration === undefined ||
|
|
323
|
+
accessKeyId.length === 0 || secretAccessKey.length === 0 || sessionToken.length === 0) {
|
|
324
|
+
fail("AWS STS did not return one complete temporary credential set.");
|
|
325
|
+
}
|
|
326
|
+
const now = runtime.now().getTime();
|
|
327
|
+
const validExpiration = expiration;
|
|
328
|
+
if (validExpiration.getTime() <= now + 5 * 60_000 || validExpiration.getTime() > now + 20 * 60_000) {
|
|
329
|
+
fail("AWS STS journal session expiration is not current and bounded.");
|
|
330
|
+
}
|
|
331
|
+
const sessionCredentials = {
|
|
332
|
+
accessKeyId: accessKeyId,
|
|
333
|
+
secretAccessKey: secretAccessKey,
|
|
334
|
+
sessionToken: sessionToken,
|
|
335
|
+
expiration: validExpiration
|
|
336
|
+
};
|
|
337
|
+
const authenticated = runtime.makeSessionSts({
|
|
338
|
+
region: authority.region,
|
|
339
|
+
maxAttempts: 1,
|
|
340
|
+
credentials: sessionCredentials
|
|
341
|
+
});
|
|
342
|
+
const caller = await withOperationJournalNetworkDeadline((signal) => authenticated.send(new GetCallerIdentityCommand({}), { abortSignal: signal }), deadlineMilliseconds);
|
|
343
|
+
const expectedArn = `arn:aws:sts::${authority.accountId}:assumed-role/${roleName(authority.roleArn)}/${sessionName}`;
|
|
344
|
+
if (caller.Account !== authority.accountId || caller.Arn !== expectedArn ||
|
|
345
|
+
assumed.AssumedRoleUser?.Arn !== expectedArn || caller.UserId === undefined || caller.UserId.length === 0) {
|
|
346
|
+
fail("AWS STS caller identity does not equal the exact admitted journal role session.");
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
credentials: sessionCredentials,
|
|
350
|
+
oidc: observedClaims,
|
|
351
|
+
callerArn: expectedArn
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
finally {
|
|
355
|
+
runnerRequestToken = "";
|
|
356
|
+
webIdentityToken = "";
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
catch: (cause) => boundaryError(cause, "GitHub OIDC to AWS STS journal authentication failed.")
|
|
360
|
+
});
|
|
361
|
+
//# sourceMappingURL=oidc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc.js","sourceRoot":"","sources":["../../../src/operation-journal/aws/oidc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type S3JournalAuthority, type S3JournalOidcTrustConditions } from "../model.js";
|
|
2
|
+
interface NormalizedPrincipal {
|
|
3
|
+
readonly AWS?: ReadonlyArray<string>;
|
|
4
|
+
readonly Federated?: ReadonlyArray<string>;
|
|
5
|
+
}
|
|
6
|
+
interface NormalizedStatement {
|
|
7
|
+
readonly Sid: string;
|
|
8
|
+
readonly Effect: "Allow" | "Deny";
|
|
9
|
+
readonly Principal?: "*" | NormalizedPrincipal;
|
|
10
|
+
readonly Action: ReadonlyArray<string>;
|
|
11
|
+
readonly Resource?: ReadonlyArray<string>;
|
|
12
|
+
readonly NotResource?: ReadonlyArray<string>;
|
|
13
|
+
readonly Condition?: Readonly<Record<string, Readonly<Record<string, ReadonlyArray<string>>>>>;
|
|
14
|
+
}
|
|
15
|
+
interface NormalizedPolicy {
|
|
16
|
+
readonly Version: "2012-10-17";
|
|
17
|
+
readonly Statement: ReadonlyArray<NormalizedStatement>;
|
|
18
|
+
}
|
|
19
|
+
export interface AwsJournalPolicyCoordinates {
|
|
20
|
+
readonly accountId: string;
|
|
21
|
+
readonly bucketArn: string;
|
|
22
|
+
readonly roleArn: string;
|
|
23
|
+
readonly rolePolicyName: string;
|
|
24
|
+
readonly oidcTrust: S3JournalOidcTrustConditions;
|
|
25
|
+
}
|
|
26
|
+
export interface AwsJournalObservedPolicyDigests {
|
|
27
|
+
readonly bucketPolicyDigest: string;
|
|
28
|
+
readonly rolePolicyDigest: string;
|
|
29
|
+
readonly oidcTrustPolicyDigest: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const makeAwsJournalTrustPolicy: (coordinates: AwsJournalPolicyCoordinates) => NormalizedPolicy;
|
|
32
|
+
export declare const makeAwsJournalRolePolicy: (coordinates: AwsJournalPolicyCoordinates) => NormalizedPolicy;
|
|
33
|
+
export declare const makeAwsJournalBucketPolicy: (coordinates: AwsJournalPolicyCoordinates) => NormalizedPolicy;
|
|
34
|
+
export declare const validateAwsJournalPolicies: (input: {
|
|
35
|
+
readonly coordinates: AwsJournalPolicyCoordinates;
|
|
36
|
+
readonly trustPolicyDocument: string;
|
|
37
|
+
readonly rolePolicyDocument: string;
|
|
38
|
+
readonly bucketPolicyDocument: string;
|
|
39
|
+
}) => AwsJournalObservedPolicyDigests;
|
|
40
|
+
export declare const assertAwsJournalPolicyDigests: (authority: S3JournalAuthority, observed: AwsJournalObservedPolicyDigests) => void;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/operation-journal/aws/policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EAClC,MAAM,aAAa,CAAA;AAMpB,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3C;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,GAAG,GAAG,mBAAmB,CAAA;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CAC/F;AAED,UAAU,gBAAgB;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;CACvD;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAA;CACjD;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;CACvC;AAuJD,eAAO,MAAM,yBAAyB,GACpC,aAAa,2BAA2B,KACvC,gBAwBF,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,aAAa,2BAA2B,KACvC,gBAsHD,CAAA;AAEF,eAAO,MAAM,0BAA0B,GACrC,aAAa,2BAA2B,KACvC,gBA4FD,CAAA;AAcF,eAAO,MAAM,0BAA0B,GAAI,OAAO;IAChD,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAA;IACjD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;CACtC,KAAG,+BAqBH,CAAA;AAED,eAAO,MAAM,6BAA6B,GACxC,WAAW,kBAAkB,EAC7B,UAAU,+BAA+B,KACxC,IAMF,CAAA"}
|