seamless-cli 0.11.0 → 0.13.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/README.md +99 -26
- package/dist/commands/check.js +67 -42
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/config.js +7 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/helpTopics.js +28 -11
- package/dist/commands/helpTopics.js.map +1 -1
- package/dist/commands/init.js +71 -42
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sessions.js +8 -3
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/users.js +20 -7
- package/dist/commands/users.js.map +1 -1
- package/dist/commands/verify.js +41 -11
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/whoami.js +21 -3
- package/dist/commands/whoami.js.map +1 -1
- package/dist/core/admin.js +9 -2
- package/dist/core/admin.js.map +1 -1
- package/dist/core/authClient.js +71 -5
- package/dist/core/authClient.js.map +1 -1
- package/dist/core/config.js +55 -3
- package/dist/core/config.js.map +1 -1
- package/dist/core/errors.js +32 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/fetch.js +17 -1
- package/dist/core/fetch.js.map +1 -1
- package/dist/core/images.js +11 -2
- package/dist/core/images.js.map +1 -1
- package/dist/core/interactiveLogin.js +16 -14
- package/dist/core/interactiveLogin.js.map +1 -1
- package/dist/core/jwksKid.js +40 -0
- package/dist/core/jwksKid.js.map +1 -0
- package/dist/core/keychain.js +13 -26
- package/dist/core/keychain.js.map +1 -1
- package/dist/core/loginFlow.js +49 -8
- package/dist/core/loginFlow.js.map +1 -1
- package/dist/core/output.js +9 -29
- package/dist/core/output.js.map +1 -1
- package/dist/core/redact.js +68 -0
- package/dist/core/redact.js.map +1 -0
- package/dist/core/secrets.js +0 -3
- package/dist/core/secrets.js.map +1 -1
- package/dist/core/systemConfig.js +39 -4
- package/dist/core/systemConfig.js.map +1 -1
- package/dist/core/templates.js +6 -4
- package/dist/core/templates.js.map +1 -1
- package/dist/generators/admin/admin.js +102 -1
- package/dist/generators/admin/admin.js.map +1 -1
- package/dist/generators/auth/auth.js +2 -59
- package/dist/generators/auth/auth.js.map +1 -1
- package/dist/generators/docker/docker.js +5 -21
- package/dist/generators/docker/docker.js.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/prompts/projectSetup.js +1 -12
- package/dist/prompts/projectSetup.js.map +1 -1
- package/package.json +2 -2
- package/verify/adapter-fastify-app/Dockerfile +14 -0
- package/verify/adapter-fastify-app/package.json +12 -0
- package/verify/adapter-fastify-app/server.mjs +64 -0
- package/verify/adapter-fastify-app/vendor/.gitignore +3 -0
- package/verify/adapter-fastify-app/vendor/.gitkeep +0 -0
- package/verify/docker-compose.cache.yml +43 -0
- package/verify/docker-compose.verify.yml +52 -21
- package/verify/harness/api/loginEnumeration.spec.ts +139 -0
- package/verify/harness/global-setup.ts +4 -1
- package/verify/harness/lib/client.ts +7 -3
- package/verify/harness/lib/env.ts +4 -0
- package/verify/harness/lib/fixtures.ts +12 -3
- package/verify/harness/lib/matrixReporter.ts +19 -6
- package/verify/harness/lib/reactFlows.ts +0 -2
- package/verify/harness/playwright.config.ts +11 -2
- package/dist/core/jwks.js +0 -19
- package/dist/core/jwks.js.map +0 -1
- package/dist/utils/writeEnv.js +0 -9
- package/dist/utils/writeEnv.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactiveLogin.js","sourceRoot":"","sources":["../../src/core/interactiveLogin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAoB,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAe9C,uEAAuE;AACvE,4EAA4E;AAC5E,oEAAoE;AACpE,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAA6B;IAE7B,IAAI,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAEzC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,kBAAkB,CAChB,gBAAgB,EAChB,iEAAiE,CAClE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;YACxB,OAAO,EAAE,gBAAgB;YACzB,WAAW,EAAE,IAAI,CAAC,UAAU,IAAI,iBAAiB;YACjD,YAAY,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;YACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B;SAClE,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,UAAU,GAAI,MAAiB,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,KAAK;QAC1C,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,OAAO,KAAK,OAAO,CAAC;YAClC,yEAAyE;YACzE,qEAAqE;YACrE,kBAAkB,CAChB,4BAA4B,EAC5B,kFAAkF,CACnF,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,4BAA4B;gBACrE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"interactiveLogin.js","sourceRoot":"","sources":["../../src/core/interactiveLogin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { apiRequest, joinUrl } from "./http.js";
|
|
2
|
+
/**
|
|
3
|
+
* The signing key id a managed instance is actually publishing.
|
|
4
|
+
*
|
|
5
|
+
* Instances pin their kid per tier (`trialkey1`, `paidkey1`), so a scaffold that
|
|
6
|
+
* hardcodes the dev default writes a value the instance never uses. Nothing verifies
|
|
7
|
+
* against it, adapters resolve the key from the token header's `kid` through the
|
|
8
|
+
* remote JWKS, but they also warn on boot when it is left at the dev default, so a
|
|
9
|
+
* managed scaffold otherwise ships an app that complains it is misconfigured.
|
|
10
|
+
*
|
|
11
|
+
* Returns undefined rather than throwing: the kid is cosmetic today, and an instance
|
|
12
|
+
* that is slow to come up should not fail a scaffold over it.
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchActiveJwksKid(instanceUrl) {
|
|
15
|
+
let res;
|
|
16
|
+
try {
|
|
17
|
+
res = await apiRequest(joinUrl(instanceUrl, "/.well-known/jwks.json"), { method: "GET" });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (!res.ok || !Array.isArray(res.data?.keys))
|
|
23
|
+
return undefined;
|
|
24
|
+
// Take the first RS256 signing key. The endpoint lists the active key first, and
|
|
25
|
+
// a set carrying a retired key alongside it keeps that one later in the array.
|
|
26
|
+
for (const key of res.data.keys) {
|
|
27
|
+
if (!key || typeof key !== "object")
|
|
28
|
+
continue;
|
|
29
|
+
const record = key;
|
|
30
|
+
if (typeof record.kid !== "string" || !record.kid)
|
|
31
|
+
continue;
|
|
32
|
+
if (record.use !== undefined && record.use !== "sig")
|
|
33
|
+
continue;
|
|
34
|
+
if (record.alg !== undefined && record.alg !== "RS256")
|
|
35
|
+
continue;
|
|
36
|
+
return record.kid;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=jwksKid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwksKid.js","sourceRoot":"","sources":["../../src/core/jwksKid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB;IAEnB,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,UAAU,CACpB,OAAO,CAAC,WAAW,EAAE,wBAAwB,CAAC,EAC9C,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhE,iFAAiF;IACjF,+EAA+E;IAC/E,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QAC9C,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,GAAG;YAAE,SAAS;QAC5D,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK;YAAE,SAAS;QAC/D,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO;YAAE,SAAS;QACjE,OAAO,MAAM,CAAC,GAAG,CAAC;IACpB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/dist/core/keychain.js
CHANGED
|
@@ -64,8 +64,20 @@ export async function saveTokens(profile, bundle) {
|
|
|
64
64
|
const b = await loadBackend();
|
|
65
65
|
b.set(accountKey(profile), JSON.stringify(bundle));
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* The refresh token supplied by the environment, for a run with no keychain (CI).
|
|
69
|
+
*
|
|
70
|
+
* Worth knowing about separately from `getTokens`, because it is read fresh on every
|
|
71
|
+
* run: the instance rotates the refresh token on every `/refresh` and treats a second
|
|
72
|
+
* use of a spent one as theft, revoking the whole session chain. So a rotated token
|
|
73
|
+
* cannot be persisted anywhere this will read it back, and a run that rotates leaves
|
|
74
|
+
* the environment holding a token that must not be sent again.
|
|
75
|
+
*/
|
|
76
|
+
export function headlessRefreshToken() {
|
|
77
|
+
return process.env.SEAMLESS_REFRESH_TOKEN?.trim() || undefined;
|
|
78
|
+
}
|
|
67
79
|
export async function getTokens(profile) {
|
|
68
|
-
const envRefresh =
|
|
80
|
+
const envRefresh = headlessRefreshToken();
|
|
69
81
|
if (envRefresh) {
|
|
70
82
|
return { accessToken: "", refreshToken: envRefresh };
|
|
71
83
|
}
|
|
@@ -84,29 +96,4 @@ export async function deleteTokens(profile) {
|
|
|
84
96
|
const b = await loadBackend();
|
|
85
97
|
return b.delete(accountKey(profile));
|
|
86
98
|
}
|
|
87
|
-
export function redactToken(value) {
|
|
88
|
-
return value ? "[redacted]" : "(none)";
|
|
89
|
-
}
|
|
90
|
-
const TOKEN_KEYS = new Set([
|
|
91
|
-
"token",
|
|
92
|
-
"accesstoken",
|
|
93
|
-
"refreshtoken",
|
|
94
|
-
"verificationtoken",
|
|
95
|
-
"authorization",
|
|
96
|
-
]);
|
|
97
|
-
export function scrubTokens(value) {
|
|
98
|
-
if (Array.isArray(value)) {
|
|
99
|
-
return value.map((item) => scrubTokens(item));
|
|
100
|
-
}
|
|
101
|
-
if (value && typeof value === "object") {
|
|
102
|
-
const out = {};
|
|
103
|
-
for (const [key, val] of Object.entries(value)) {
|
|
104
|
-
out[key] = TOKEN_KEYS.has(key.toLowerCase())
|
|
105
|
-
? redactToken(typeof val === "string" ? val : String(val))
|
|
106
|
-
: scrubTokens(val);
|
|
107
|
-
}
|
|
108
|
-
return out;
|
|
109
|
-
}
|
|
110
|
-
return value;
|
|
111
|
-
}
|
|
112
99
|
//# sourceMappingURL=keychain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/core/keychain.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,cAAc,CAAC;AAS/B,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,KAAe;QACzB,KAAK,CACH,+MAA+M,CAChN,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9C,CAAC;CACF;AAQD,MAAM,UAAU,UAAU,CACxB,OAA8C;IAE9C,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,IAAI,OAAO,GAA2B,IAAI,CAAC;AAE3C,KAAK,UAAU,WAAW;IACxB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,IAAI,KAA8C,CAAC;IACnD,IAAI,CAAC;QACH,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG;QACR,GAAG,CAAC,OAAO;YACT,IAAI,CAAC;gBACH,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,SAAS,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAChC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,MAAM;YACjB,IAAI,CAAC;gBACH,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,IAAI,CAAC;gBACH,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,SAAS,CAAC,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACjC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAA4B;IAC/D,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA8C,EAC9C,MAAmB;IAEnB,MAAM,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAA8C;IAE9C,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/core/keychain.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,cAAc,CAAC;AAS/B,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,KAAe;QACzB,KAAK,CACH,+MAA+M,CAChN,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9C,CAAC;CACF;AAQD,MAAM,UAAU,UAAU,CACxB,OAA8C;IAE9C,OAAO,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED,IAAI,OAAO,GAA2B,IAAI,CAAC;AAE3C,KAAK,UAAU,WAAW;IACxB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,IAAI,KAA8C,CAAC;IACnD,IAAI,CAAC;QACH,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,GAAG;QACR,GAAG,CAAC,OAAO;YACT,IAAI,CAAC;gBACH,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACnD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,SAAS,CAAC,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAChC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,GAAG,CAAC,OAAO,EAAE,MAAM;YACjB,IAAI,CAAC;gBACH,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,MAAM,CAAC,OAAO;YACZ,IAAI,CAAC;gBACH,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,SAAS,CAAC,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBACjC,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAA4B;IAC/D,OAAO,GAAG,IAAI,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAA8C,EAC9C,MAAmB;IAEnB,MAAM,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAA8C;IAE9C,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEtB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA8C;IAE9C,MAAM,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;IAC9B,OAAO,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;AACvC,CAAC"}
|
package/dist/core/loginFlow.js
CHANGED
|
@@ -28,6 +28,13 @@ function apiMessage(data) {
|
|
|
28
28
|
}
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
31
|
+
function lockedMessage(data, identifier) {
|
|
32
|
+
const retryAfter = data?.retryAfterSeconds;
|
|
33
|
+
const wait = typeof retryAfter === "number" && retryAfter > 0
|
|
34
|
+
? ` Try again in about ${Math.ceil(retryAfter / 60)} minute(s).`
|
|
35
|
+
: "";
|
|
36
|
+
return `Too many failed attempts for ${identifier}.${wait}`;
|
|
37
|
+
}
|
|
31
38
|
async function request(instanceUrl, url, init) {
|
|
32
39
|
try {
|
|
33
40
|
return await apiRequest(url, init);
|
|
@@ -41,16 +48,22 @@ async function startLogin(instanceUrl, identifier, now) {
|
|
|
41
48
|
if (isRateLimited(res)) {
|
|
42
49
|
throw new LoginError("The instance is rate limiting requests. Wait a few minutes and try again.");
|
|
43
50
|
}
|
|
51
|
+
// `/login` never answers 401. An identifier with no usable account (unknown,
|
|
52
|
+
// unverified, or with no permitted method) gets a 200 and a decoy pre-auth token, so
|
|
53
|
+
// no answer here can be used to test whether an account exists. Nothing to read means
|
|
54
|
+
// nothing to report: such a login fails at the code step, which `completeLogin` names.
|
|
55
|
+
// Do not add a branch that reads a status as "no such user"; there is not one.
|
|
44
56
|
if (!res.ok) {
|
|
45
|
-
const message = apiMessage(res.data) ?? "";
|
|
46
|
-
if (res.status === 401 && /verify/i.test(message)) {
|
|
47
|
-
throw new LoginError(`The account for ${identifier} is not verified yet. Finish registration, then log in.`);
|
|
48
|
-
}
|
|
49
57
|
if (res.status === 400) {
|
|
50
58
|
throw new LoginError(`"${identifier}" is not a valid email or phone number.`);
|
|
51
59
|
}
|
|
52
|
-
if (res.status ===
|
|
53
|
-
|
|
60
|
+
if (res.status === 423) {
|
|
61
|
+
// The one answer that does imply an account, and the one worth naming: it needs
|
|
62
|
+
// prior failed attempts against this identifier, and waiting resolves it.
|
|
63
|
+
throw new LoginError(lockedMessage(res.data, identifier));
|
|
64
|
+
}
|
|
65
|
+
if (res.status === 403) {
|
|
66
|
+
throw new LoginError(`Login is not permitted for ${identifier}.`);
|
|
54
67
|
}
|
|
55
68
|
throw new LoginError(`Login request failed (${res.status}).`);
|
|
56
69
|
}
|
|
@@ -107,6 +120,18 @@ async function verifyCode(instanceUrl, started, code) {
|
|
|
107
120
|
: "/otp/verify-login-phone-otp";
|
|
108
121
|
return request(instanceUrl, joinUrl(instanceUrl, path), jsonBody("POST", { verificationToken: code }, { Authorization: `Bearer ${started.ephemeralToken}` }));
|
|
109
122
|
}
|
|
123
|
+
function verifyFailure(res, identifier) {
|
|
124
|
+
const message = apiMessage(res.data);
|
|
125
|
+
if (res.status === 423)
|
|
126
|
+
return lockedMessage(res.data, identifier);
|
|
127
|
+
if (res.status === 403) {
|
|
128
|
+
return "That login method was turned off on the instance mid-login.";
|
|
129
|
+
}
|
|
130
|
+
if (res.status >= 500) {
|
|
131
|
+
return `The instance failed while verifying the code (${res.status}). This is not your code; try again shortly.${message ? ` It said: ${message}` : ""}`;
|
|
132
|
+
}
|
|
133
|
+
return `Could not verify the code (${res.status}).${message ? ` The instance said: ${message}` : ""}`;
|
|
134
|
+
}
|
|
110
135
|
export async function completeLogin(opts) {
|
|
111
136
|
const now = opts.now ?? (() => Date.now());
|
|
112
137
|
const maxAttempts = opts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
|
|
@@ -121,7 +146,9 @@ export async function completeLogin(opts) {
|
|
|
121
146
|
const channel = started.channel;
|
|
122
147
|
const required = channel === "email" ? "email_otp" : "phone_otp";
|
|
123
148
|
if (started.loginMethods.length > 0 && !started.loginMethods.includes(required)) {
|
|
124
|
-
|
|
149
|
+
// Deliberately not "this account cannot": the method list comes back for an unknown
|
|
150
|
+
// identifier too, so saying so would report an account that may not exist.
|
|
151
|
+
throw new LoginError(`${required.replace("_", " ")} login is not available for ${opts.identifier}. Offered: ${started.loginMethods.join(", ")}.`);
|
|
125
152
|
}
|
|
126
153
|
let autoCode = await sendCode(opts.instanceUrl, started, localDelivery);
|
|
127
154
|
notify({ type: "code_sent", channel });
|
|
@@ -142,6 +169,11 @@ export async function completeLogin(opts) {
|
|
|
142
169
|
if (code === null)
|
|
143
170
|
return null;
|
|
144
171
|
if (now() >= started.deadline) {
|
|
172
|
+
// The code just typed is dropped rather than sent: the pre-auth token it would
|
|
173
|
+
// travel under has lapsed, so the instance would answer 401 and spend an attempt
|
|
174
|
+
// on a code that may well have been right. Say so, because from the outside this
|
|
175
|
+
// looks like the code being ignored.
|
|
176
|
+
notify({ type: "code_expired", channel });
|
|
145
177
|
started = await startLogin(opts.instanceUrl, opts.identifier, now);
|
|
146
178
|
autoCode = await sendCode(opts.instanceUrl, started, localDelivery);
|
|
147
179
|
resent = true;
|
|
@@ -167,9 +199,18 @@ export async function completeLogin(opts) {
|
|
|
167
199
|
if (isRateLimited(res)) {
|
|
168
200
|
throw new LoginError("Too many attempts. The instance limits OTP to 10 per 15 minutes per IP. Wait and try again.");
|
|
169
201
|
}
|
|
202
|
+
// Only a 401 is worth another try. The instance answers 401 both for a wrong code
|
|
203
|
+
// and for a lapsed pre-auth token, so it stays an attempt; every other answer means
|
|
204
|
+
// retyping the code cannot help, and spending the remaining attempts on it would
|
|
205
|
+
// bury the real reason under "Could not verify a code".
|
|
206
|
+
if (res.status !== 401) {
|
|
207
|
+
throw new LoginError(verifyFailure(res, opts.identifier));
|
|
208
|
+
}
|
|
170
209
|
attempt++;
|
|
171
210
|
notify({ type: "incorrect", attemptsLeft: maxAttempts - attempt });
|
|
172
211
|
}
|
|
173
|
-
|
|
212
|
+
// The instance does not say whether the identifier has an account, so neither can this.
|
|
213
|
+
// A wrong code and an identifier nobody has registered both land here.
|
|
214
|
+
throw new LoginError(`Could not verify a code for ${opts.identifier}. If that address or number has no account yet, register it first. Otherwise run seamless login to try again.`);
|
|
174
215
|
}
|
|
175
216
|
//# sourceMappingURL=loginFlow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loginFlow.js","sourceRoot":"","sources":["../../src/core/loginFlow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,wBAAwB,GAAG,+BAA+B,CAAC;AAIjE,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"loginFlow.js","sourceRoot":"","sources":["../../src/core/loginFlow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAEtC,MAAM,wBAAwB,GAAG,+BAA+B,CAAC;AAIjE,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AA4CD,SAAS,YAAY,CAAC,IAAoC;IACxD,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;IAChC,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAI,QAAoC,CAAC,KAAK,CAAC;QAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAA+B,CAAC;QAC/C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;QAC1D,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IAChE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CACpB,IAAoC,EACpC,UAAkB;IAElB,MAAM,UAAU,GAAG,IAAI,EAAE,iBAAiB,CAAC;IAC3C,MAAM,IAAI,GACR,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,GAAG,CAAC;QAC9C,CAAC,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,aAAa;QAChE,CAAC,CAAC,EAAE,CAAC;IACT,OAAO,gCAAgC,UAAU,IAAI,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,WAAmB,EACnB,GAAW,EACX,IAAiB;IAEjB,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAA0B,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAClB,mBAAmB,WAAW,+CAA+C,CAC9E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,WAAmB,EACnB,UAAkB,EAClB,GAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,WAAW,EACX,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,EAC9B,QAAQ,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CACjC,CAAC;IAEF,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,UAAU,CAClB,2EAA2E,CAC5E,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,qFAAqF;IACrF,sFAAsF;IACtF,uFAAuF;IACvF,+EAA+E;IAC/E,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAClB,IAAI,UAAU,yCAAyC,CACxD,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,gFAAgF;YAChF,0EAA0E;YAC1E,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,8BAA8B,UAAU,GAAG,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,4CAA4C,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;QACnD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;QACrE,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GACX,IAAI,CAAC,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACtD,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,OAAO;QACL,cAAc;QACd,YAAY;QACZ,OAAO;QACP,GAAG;QACH,QAAQ,EAAE,GAAG,EAAE,GAAG,mBAAmB;KACtC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,WAAmB,EACnB,OAAqB,EACrB,aAAsB;IAEtB,MAAM,IAAI,GACR,OAAO,CAAC,OAAO,KAAK,OAAO;QACzB,CAAC,CAAC,+BAA+B;QACjC,CAAC,CAAC,+BAA+B,CAAC;IAEtC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,OAAO,CAAC,cAAc,EAAE;KAClD,CAAC;IACF,IAAI,aAAa;QAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,UAAU,CAAC;IAElE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE;QACjE,MAAM,EAAE,KAAK;QACb,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,UAAU,CAClB,kGAAkG,CACnG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9D,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,0CAA0C,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,UAAU,CAClB,OAAO,CAAC,CAAC,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC,CAAC,8BAA8B,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,SAAS;QAAE,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAElD,OAAO,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,WAAmB,EACnB,OAAqB,EACrB,IAAY;IAEZ,MAAM,IAAI,GACR,OAAO,CAAC,OAAO,KAAK,OAAO;QACzB,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,6BAA6B,CAAC;IAEpC,OAAO,OAAO,CACZ,WAAW,EACX,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,EAC1B,QAAQ,CACN,MAAM,EACN,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAC3B,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,cAAc,EAAE,EAAE,CACtD,CACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,GAA6D,EAC7D,UAAkB;IAElB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACnE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,6DAA6D,CAAC;IACvE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACtB,OAAO,iDAAiD,GAAG,CAAC,MAAM,+CAChE,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC,CAAC,EACrC,EAAE,CAAC;IACL,CAAC;IACD,OAAO,8BAA8B,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACxG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAA0B;IAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,oBAAoB,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC;IAElD,MAAM,gBAAgB,GAAG,CAAC,IAAwB,EAAQ,EAAE;QAC1D,IAAI,aAAa,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAClB,gMAAgM,CACjM,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,QAAQ,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;IACjE,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChF,oFAAoF;QACpF,2EAA2E;QAC3E,MAAM,IAAI,UAAU,CAClB,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,+BAA+B,IAAI,CAAC,UAAU,cAAc,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC5H,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IACxE,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,OAAO,GAAG,WAAW,EAAE,CAAC;QAC7B,IAAI,IAAmB,CAAC;QACxB,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,GAAG,QAAQ,CAAC;YAChB,QAAQ,GAAG,SAAS,CAAC;YACrB,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,GAAG,KAAK,CAAC;QACf,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE/B,IAAI,GAAG,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC9B,+EAA+E;YAC/E,iFAAiF;YACjF,iFAAiF;YACjF,qCAAqC;YACrC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1C,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YACnE,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;YACpE,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;YACzC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,UAAU,CAClB,4DAA4D,CAC7D,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9E,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YAC1E,OAAO;gBACL,MAAM;gBACN,QAAQ,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE;gBACjD,OAAO;aACR,CAAC;QACJ,CAAC;QAED,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAClB,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QAED,kFAAkF;QAClF,oFAAoF;QACpF,iFAAiF;QACjF,wDAAwD;QACxD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,EAAE,CAAC;QACV,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,wFAAwF;IACxF,uEAAuE;IACvE,MAAM,IAAI,UAAU,CAClB,+BAA+B,IAAI,CAAC,UAAU,+GAA+G,CAC9J,CAAC;AACJ,CAAC"}
|
package/dist/core/output.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import kleur from "kleur";
|
|
2
2
|
export function printSuccessOutput(config) {
|
|
3
|
-
const { projectName, webFramework, apiFramework, authMode,
|
|
3
|
+
const { projectName, webFramework, apiFramework, authMode, adminMode, ownerEmail, } = config;
|
|
4
4
|
// Where the admin console lives: proxied by the app API at /console, or a
|
|
5
5
|
// standalone container on 5174. "none" scaffolds no console at all.
|
|
6
6
|
const consoleUrl = adminMode === "api"
|
|
@@ -40,34 +40,10 @@ export function printSuccessOutput(config) {
|
|
|
40
40
|
}
|
|
41
41
|
console.log("");
|
|
42
42
|
console.log(kleur.bold("Next steps:\n"));
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
console.log(kleur.dim(" That address is the owner, so it becomes an admin\n"));
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
if (authMode === "local") {
|
|
51
|
-
console.log(kleur.dim(" # Auth server"));
|
|
52
|
-
console.log(kleur.yellow(" Requires a local PostgreSQL instance running on localhost:5432\n"));
|
|
53
|
-
console.log(" cd auth");
|
|
54
|
-
console.log(" npm install\n");
|
|
55
|
-
console.log(kleur.dim(" # Initialize database"));
|
|
56
|
-
console.log(" npm run db:create");
|
|
57
|
-
console.log(" npm run db:migrate\n");
|
|
58
|
-
console.log(kleur.dim(" # Start auth server"));
|
|
59
|
-
console.log(" npm run dev\n");
|
|
60
|
-
}
|
|
61
|
-
if (apiFramework) {
|
|
62
|
-
console.log(kleur.dim(" # API server"));
|
|
63
|
-
console.log(" cd api && npm install && npm run dev\n");
|
|
64
|
-
}
|
|
65
|
-
if (webFramework) {
|
|
66
|
-
console.log(kleur.dim(" # Web app"));
|
|
67
|
-
console.log(" cd web && npm install && npm run dev\n");
|
|
68
|
-
}
|
|
69
|
-
console.log(" Register with " + kleur.bold(ownerEmail) + " to become an admin.\n");
|
|
70
|
-
}
|
|
43
|
+
console.log(" 1. Start services");
|
|
44
|
+
console.log(kleur.cyan(" docker compose up\n"));
|
|
45
|
+
console.log(" 2. Register in the browser with " + kleur.bold(ownerEmail));
|
|
46
|
+
console.log(kleur.dim(" That address is the owner, so it becomes an admin\n"));
|
|
71
47
|
console.log(kleur.bold("Available services:\n"));
|
|
72
48
|
console.log(" Auth: " + kleur.cyan("http://localhost:5312"));
|
|
73
49
|
if (apiFramework) {
|
|
@@ -88,6 +64,10 @@ export function printSuccessOutput(config) {
|
|
|
88
64
|
? " • Admin console is served by the API at /console"
|
|
89
65
|
: " • Admin console uses the same auth system"));
|
|
90
66
|
}
|
|
67
|
+
if (adminMode === "source") {
|
|
68
|
+
console.log(kleur.dim(" • Admin console source is in admin/, yours to edit and commit"));
|
|
69
|
+
console.log(kleur.dim(" • docker compose builds it from that directory, not an image"));
|
|
70
|
+
}
|
|
91
71
|
console.log(kleur.dim(` • ${ownerEmail} is the owner: registering with it grants the admin role`));
|
|
92
72
|
console.log(kleur.dim(" • The grant happens at signup, so change OWNER_EMAIL in auth before registering"));
|
|
93
73
|
console.log(kleur.dim(" • All secrets and keys are pre-configured\n"));
|
package/dist/core/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Masking for anything the CLI is about to print. Every caller is a log path, not
|
|
3
|
+
* a credential path: these helpers never touch what is stored or sent, only what
|
|
4
|
+
* is shown, so over-masking costs legibility rather than correctness.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately not applied to `--json` output. That is a machine-readable contract
|
|
7
|
+
* meant to be piped into `jq`, and rewriting values there would break scripts and
|
|
8
|
+
* hide data the caller explicitly asked for.
|
|
9
|
+
*/
|
|
10
|
+
export function redactToken(value) {
|
|
11
|
+
return value ? "[redacted]" : "(none)";
|
|
12
|
+
}
|
|
13
|
+
const REDACTED = "[redacted]";
|
|
14
|
+
// Matched against the lowercased key with separators stripped, so `clientSecret`,
|
|
15
|
+
// `client_secret`, and `CLIENT-SECRET` are one entry rather than three.
|
|
16
|
+
const SECRET_KEYS = new Set([
|
|
17
|
+
"token",
|
|
18
|
+
"accesstoken",
|
|
19
|
+
"refreshtoken",
|
|
20
|
+
"verificationtoken",
|
|
21
|
+
"authorization",
|
|
22
|
+
"secret",
|
|
23
|
+
"clientsecret",
|
|
24
|
+
"password",
|
|
25
|
+
"apikey",
|
|
26
|
+
"otp",
|
|
27
|
+
"code",
|
|
28
|
+
]);
|
|
29
|
+
// A JWT: three dot-separated base64url runs, the first opening `eyJ` because every
|
|
30
|
+
// JOSE header starts `{"`. Long enough a run that ordinary prose cannot trip it.
|
|
31
|
+
const JWT = /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+/g;
|
|
32
|
+
const BEARER = /\bBearer\s+[A-Za-z0-9._~+/=-]{8,}/gi;
|
|
33
|
+
function isSecretKey(key) {
|
|
34
|
+
return SECRET_KEYS.has(key.toLowerCase().replace(/[-_\s]/g, ""));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Masks secrets in a value about to be logged, by key name and by shape.
|
|
38
|
+
*
|
|
39
|
+
* Key matching alone is not enough: a server's validation error commonly quotes the
|
|
40
|
+
* offending value back inside a message string, where it has no key of its own. So
|
|
41
|
+
* strings are scanned for JWT and `Bearer ...` shapes wherever they appear,
|
|
42
|
+
* including a bare string body.
|
|
43
|
+
*/
|
|
44
|
+
export function scrubTokens(value) {
|
|
45
|
+
return scrub(value, false);
|
|
46
|
+
}
|
|
47
|
+
function scrub(value, keyed) {
|
|
48
|
+
if (typeof value === "string") {
|
|
49
|
+
return keyed ? redactToken(value) : scrubString(value);
|
|
50
|
+
}
|
|
51
|
+
if (Array.isArray(value)) {
|
|
52
|
+
return value.map((item) => scrub(item, keyed));
|
|
53
|
+
}
|
|
54
|
+
if (value && typeof value === "object") {
|
|
55
|
+
const out = {};
|
|
56
|
+
for (const [key, val] of Object.entries(value)) {
|
|
57
|
+
out[key] = scrub(val, keyed || isSecretKey(key));
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
// A secret-keyed non-string still reveals nothing useful once masked, and leaving
|
|
62
|
+
// it would let `{ token: 123 }` through.
|
|
63
|
+
return keyed && value !== null && value !== undefined ? REDACTED : value;
|
|
64
|
+
}
|
|
65
|
+
function scrubString(value) {
|
|
66
|
+
return value.replace(JWT, REDACTED).replace(BEARER, `Bearer ${REDACTED}`);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/core/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,UAAU,WAAW,CAAC,KAAqB;IAC/C,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzC,CAAC;AAED,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,kFAAkF;AAClF,wEAAwE;AACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,OAAO;IACP,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,eAAe;IACf,QAAQ;IACR,cAAc;IACd,UAAU;IACV,QAAQ;IACR,KAAK;IACL,MAAM;CACP,CAAC,CAAC;AAEH,mFAAmF;AACnF,iFAAiF;AACjF,MAAM,GAAG,GAAG,4DAA4D,CAAC;AAEzE,MAAM,MAAM,GAAG,qCAAqC,CAAC;AAErD,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAI,KAAQ;IACrC,OAAO,KAAK,CAAC,KAAK,EAAE,KAAK,CAAM,CAAC;AAClC,CAAC;AAED,SAAS,KAAK,CAAC,KAAc,EAAE,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,KAAK,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,kFAAkF;IAClF,yCAAyC;IACzC,OAAO,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
package/dist/core/secrets.js
CHANGED
package/dist/core/secrets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/core/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,MAAM,GAAG,EAAE;IACxC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/core/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,MAAM,GAAG,EAAE;IACxC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import { scrubTokens } from "./redact.js";
|
|
2
|
+
// Mirrors the instance's patch schema, which is strict: a key missing here is one
|
|
3
|
+
// `config apply` silently drops and `config set` refuses, so the two lists have to
|
|
4
|
+
// stay in step.
|
|
5
|
+
//
|
|
6
|
+
// `magic_link_redirect_uris` is the one entry ahead of it. The key is defined in
|
|
7
|
+
// @seamless-auth/types but not yet released there, and the auth API still treats the
|
|
8
|
+
// configured origins as the magic-link allowlist, so an instance rejects it today.
|
|
9
|
+
// Leave it listed (a released API accepts it without a CLI change) but expect the
|
|
10
|
+
// rejection until that release lands.
|
|
1
11
|
export const WRITABLE_KEYS = [
|
|
2
12
|
"app_name",
|
|
3
13
|
"default_roles",
|
|
@@ -6,12 +16,16 @@ export const WRITABLE_KEYS = [
|
|
|
6
16
|
"passkey_login_fallback_enabled",
|
|
7
17
|
"oauth_providers",
|
|
8
18
|
"lockout_policy",
|
|
19
|
+
"authenticator_policy",
|
|
9
20
|
"access_token_ttl",
|
|
21
|
+
"session_idle_ttl",
|
|
10
22
|
"refresh_token_ttl",
|
|
23
|
+
"max_concurrent_sessions",
|
|
11
24
|
"rate_limit",
|
|
12
25
|
"delay_after",
|
|
13
26
|
"rpid",
|
|
14
27
|
"origins",
|
|
28
|
+
"magic_link_redirect_uris",
|
|
15
29
|
];
|
|
16
30
|
const WRITABLE = new Set(WRITABLE_KEYS);
|
|
17
31
|
export class PermissionError extends Error {
|
|
@@ -57,7 +71,7 @@ export async function patchSystemConfig(client, patch) {
|
|
|
57
71
|
if (res.status === 400) {
|
|
58
72
|
const reason = res.data?.error ?? "Invalid configuration";
|
|
59
73
|
const details = res.data?.details
|
|
60
|
-
? ` ${JSON.stringify(res.data.details)}`
|
|
74
|
+
? ` ${JSON.stringify(scrubTokens(res.data.details))}`
|
|
61
75
|
: "";
|
|
62
76
|
throw new ConfigApiError(`${reason}.${details}`);
|
|
63
77
|
}
|
|
@@ -85,7 +99,7 @@ function providerMutationError(res, action, id) {
|
|
|
85
99
|
if (res.status === 400) {
|
|
86
100
|
const reason = res.data?.error ?? "Invalid OAuth provider";
|
|
87
101
|
const details = res.data?.details
|
|
88
|
-
? ` ${JSON.stringify(res.data.details)}`
|
|
102
|
+
? ` ${JSON.stringify(scrubTokens(res.data.details))}`
|
|
89
103
|
: "";
|
|
90
104
|
throw new ConfigApiError(`${reason}.${details}`);
|
|
91
105
|
}
|
|
@@ -128,14 +142,35 @@ export async function deleteOAuthProvider(client, id) {
|
|
|
128
142
|
return;
|
|
129
143
|
throw providerMutationError(res, "remove", id);
|
|
130
144
|
}
|
|
131
|
-
|
|
145
|
+
// The writable keys the instance types as a plain string. Their values are never
|
|
146
|
+
// JSON-parsed, so `config set app_name 123` sends the string "123" rather than the
|
|
147
|
+
// number 123, and `config set rpid true` sends "true". Everything else is parsed as
|
|
148
|
+
// JSON, falling back to the raw string, which is what makes `access_token_ttl 15m`
|
|
149
|
+
// work: a TTL is string-typed, but the fallback would have carried it anyway.
|
|
150
|
+
const STRING_KEYS = new Set([
|
|
151
|
+
"app_name",
|
|
152
|
+
"access_token_ttl",
|
|
153
|
+
"session_idle_ttl",
|
|
154
|
+
"refresh_token_ttl",
|
|
155
|
+
"rpid",
|
|
156
|
+
]);
|
|
157
|
+
export function isStringKey(key) {
|
|
158
|
+
return STRING_KEYS.has(key);
|
|
159
|
+
}
|
|
160
|
+
export function parseValue(raw, key) {
|
|
161
|
+
const trimmed = raw.trim();
|
|
162
|
+
if (key !== undefined && STRING_KEYS.has(key))
|
|
163
|
+
return trimmed;
|
|
132
164
|
try {
|
|
133
|
-
return JSON.parse(
|
|
165
|
+
return JSON.parse(trimmed);
|
|
134
166
|
}
|
|
135
167
|
catch {
|
|
136
168
|
return raw;
|
|
137
169
|
}
|
|
138
170
|
}
|
|
171
|
+
export function isWritableKey(key) {
|
|
172
|
+
return WRITABLE.has(key);
|
|
173
|
+
}
|
|
139
174
|
export function filterWritable(config) {
|
|
140
175
|
const patch = {};
|
|
141
176
|
const dropped = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"systemConfig.js","sourceRoot":"","sources":["../../src/core/systemConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"systemConfig.js","sourceRoot":"","sources":["../../src/core/systemConfig.ts"],"names":[],"mappings":"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"}
|
package/dist/core/templates.js
CHANGED
|
@@ -3,6 +3,7 @@ import path from "path";
|
|
|
3
3
|
import AdmZip from "adm-zip";
|
|
4
4
|
import { VERSION } from "../index.js";
|
|
5
5
|
import { parseEnvString, writeEnv } from "./env.js";
|
|
6
|
+
import { fetchRemote } from "./fetch.js";
|
|
6
7
|
import { generateSecret } from "./secrets.js";
|
|
7
8
|
import { SEAMLESS_TEMPLATES_REF, SEAMLESS_TEMPLATES_REPO } from "./images.js";
|
|
8
9
|
// The command-line spellings for a template, longest-lived first. The id always
|
|
@@ -61,7 +62,7 @@ function openLocalSource(dir) {
|
|
|
61
62
|
}
|
|
62
63
|
async function openRemoteSource(repo, ref) {
|
|
63
64
|
const registryUrl = `https://raw.githubusercontent.com/${repo}/${ref}/registry.json`;
|
|
64
|
-
const res = await
|
|
65
|
+
const res = await fetchRemote(registryUrl, "read the template registry");
|
|
65
66
|
if (!res.ok) {
|
|
66
67
|
throw new Error(`Failed to fetch the template registry (${res.status}) from ${registryUrl}.`);
|
|
67
68
|
}
|
|
@@ -73,7 +74,7 @@ async function openRemoteSource(repo, ref) {
|
|
|
73
74
|
if (archive)
|
|
74
75
|
return archive;
|
|
75
76
|
const url = `https://github.com/${repo}/archive/${ref}.zip`;
|
|
76
|
-
const zipRes = await
|
|
77
|
+
const zipRes = await fetchRemote(url, "download the project templates");
|
|
77
78
|
if (!zipRes.ok) {
|
|
78
79
|
throw new Error(`Failed to download templates (${zipRes.status}) from ${url}.`);
|
|
79
80
|
}
|
|
@@ -137,8 +138,9 @@ export function assertCliSupports(manifest, label) {
|
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
// Copies the template's example env to .env (if declared), then applies the
|
|
140
|
-
// manifest's env.set, resolving {{placeholders}} against the scaffold context.
|
|
141
|
-
//
|
|
141
|
+
// manifest's env.set, resolving {{placeholders}} against the scaffold context. This
|
|
142
|
+
// is the whole per-template configuration contract: a starter that needs a new value
|
|
143
|
+
// declares it in template.json rather than earning a branch here.
|
|
142
144
|
export function applyTemplateEnv(destDir, manifest, ctx) {
|
|
143
145
|
const env = manifest.env ?? {};
|
|
144
146
|
const envPath = path.join(destDir, ".env");
|