seamless-cli 0.12.1 → 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.
Files changed (63) hide show
  1. package/README.md +98 -26
  2. package/dist/commands/check.js +67 -42
  3. package/dist/commands/check.js.map +1 -1
  4. package/dist/commands/config.js +7 -2
  5. package/dist/commands/config.js.map +1 -1
  6. package/dist/commands/helpTopics.js +28 -11
  7. package/dist/commands/helpTopics.js.map +1 -1
  8. package/dist/commands/init.js +71 -42
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/sessions.js +8 -3
  11. package/dist/commands/sessions.js.map +1 -1
  12. package/dist/commands/users.js +20 -7
  13. package/dist/commands/users.js.map +1 -1
  14. package/dist/commands/verify.js +3 -2
  15. package/dist/commands/verify.js.map +1 -1
  16. package/dist/commands/whoami.js +21 -3
  17. package/dist/commands/whoami.js.map +1 -1
  18. package/dist/core/admin.js +9 -2
  19. package/dist/core/admin.js.map +1 -1
  20. package/dist/core/authClient.js +71 -5
  21. package/dist/core/authClient.js.map +1 -1
  22. package/dist/core/config.js +55 -3
  23. package/dist/core/config.js.map +1 -1
  24. package/dist/core/errors.js +32 -0
  25. package/dist/core/errors.js.map +1 -0
  26. package/dist/core/fetch.js +17 -1
  27. package/dist/core/fetch.js.map +1 -1
  28. package/dist/core/images.js +6 -0
  29. package/dist/core/images.js.map +1 -1
  30. package/dist/core/interactiveLogin.js +12 -13
  31. package/dist/core/interactiveLogin.js.map +1 -1
  32. package/dist/core/jwksKid.js +40 -0
  33. package/dist/core/jwksKid.js.map +1 -0
  34. package/dist/core/keychain.js +13 -26
  35. package/dist/core/keychain.js.map +1 -1
  36. package/dist/core/loginFlow.js +39 -14
  37. package/dist/core/loginFlow.js.map +1 -1
  38. package/dist/core/output.js +9 -29
  39. package/dist/core/output.js.map +1 -1
  40. package/dist/core/redact.js +68 -0
  41. package/dist/core/redact.js.map +1 -0
  42. package/dist/core/secrets.js +0 -3
  43. package/dist/core/secrets.js.map +1 -1
  44. package/dist/core/systemConfig.js +39 -4
  45. package/dist/core/systemConfig.js.map +1 -1
  46. package/dist/core/templates.js +6 -4
  47. package/dist/core/templates.js.map +1 -1
  48. package/dist/generators/admin/admin.js +102 -1
  49. package/dist/generators/admin/admin.js.map +1 -1
  50. package/dist/generators/auth/auth.js +2 -59
  51. package/dist/generators/auth/auth.js.map +1 -1
  52. package/dist/generators/docker/docker.js +0 -20
  53. package/dist/generators/docker/docker.js.map +1 -1
  54. package/dist/index.js +4 -3
  55. package/dist/index.js.map +1 -1
  56. package/dist/prompts/projectSetup.js +1 -12
  57. package/dist/prompts/projectSetup.js.map +1 -1
  58. package/package.json +2 -2
  59. package/verify/docker-compose.verify.yml +22 -20
  60. package/dist/core/jwks.js +0 -19
  61. package/dist/core/jwks.js.map +0 -1
  62. package/dist/utils/writeEnv.js +0 -9
  63. package/dist/utils/writeEnv.js.map +0 -1
@@ -3,8 +3,10 @@ import { extractFlag } from "../core/args.js";
3
3
  import { createAuthClient, createPortalClient, ReauthRequiredError, } from "../core/authClient.js";
4
4
  import { fetchIdentity } from "../core/session.js";
5
5
  import { getPortalSession } from "../core/config.js";
6
+ import { errorMessage } from "../core/errors.js";
6
7
  export async function runWhoami(args) {
7
- const { value: profileFlag } = extractFlag(args, "profile");
8
+ const { value: profileFlag, rest } = extractFlag(args, "profile");
9
+ const json = rest.includes("--json");
8
10
  try {
9
11
  // Without --profile this reports the portal account. An instance profile is
10
12
  // still a useful answer when there is no portal session (a local-only or
@@ -15,17 +17,33 @@ export async function runWhoami(args) {
15
17
  ? await createAuthClient({ profileFlag })
16
18
  : await createPortalClient();
17
19
  const identity = await fetchIdentity(client);
18
- printIdentity(portal ? "Seamless portal" : client.profile.name, client.profile, identity);
20
+ const account = portal ? "Seamless portal" : client.profile.name;
21
+ if (json) {
22
+ printIdentityJson(account, client.profile, identity);
23
+ return;
24
+ }
25
+ printIdentity(account, client.profile, identity);
19
26
  }
20
27
  catch (err) {
21
28
  if (err instanceof ReauthRequiredError) {
22
29
  console.log(kleur.yellow(err.message));
23
30
  process.exit(1);
24
31
  }
25
- console.error(kleur.red(err.message));
32
+ console.error(kleur.red(errorMessage(err)));
26
33
  process.exit(1);
27
34
  }
28
35
  }
36
+ // The same fields the table shows, as null rather than "(unknown)" when absent: a
37
+ // script asking for JSON wants a missing value it can test, not prose.
38
+ function printIdentityJson(account, profile, identity) {
39
+ console.log(JSON.stringify({
40
+ account,
41
+ instanceUrl: profile.instanceUrl,
42
+ sub: identity.sub ?? profile.sub ?? null,
43
+ email: identity.email ?? profile.email ?? null,
44
+ roles: identity.roles,
45
+ }, null, 2));
46
+ }
29
47
  function printIdentity(target, profile, identity) {
30
48
  const line = (label, value) => console.log(kleur.dim(`${label}:`.padEnd(11)) + value);
31
49
  line("Account", target);
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAiB,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,mBAAmB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,4EAA4E;QAC5E,yEAAyE;QACzE,2EAA2E;QAC3E,uCAAuC;QACvC,MAAM,MAAM,GAAG,CAAC,WAAW,IAAI,gBAAgB,EAAE,KAAK,SAAS,CAAC;QAChE,MAAM,MAAM,GACV,WAAW,IAAI,CAAC,MAAM;YACpB,CAAC,CAAC,MAAM,gBAAgB,CAAC,EAAE,WAAW,EAAE,CAAC;YACzC,CAAC,CAAC,MAAM,kBAAkB,EAAE,CAAC;QAEjC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,MAAc,EACd,OAAgB,EAChB,QAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE,CAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAEzD,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
@@ -26,10 +26,17 @@ async function call(client, method, path, body) {
26
26
  throw new PermissionError();
27
27
  return res;
28
28
  }
29
- export async function listUsers(client) {
30
- const res = await call(client, "GET", "/admin/users");
29
+ export async function listUsers(client, opts = {}) {
30
+ const query = new URLSearchParams();
31
+ if (opts.limit !== undefined)
32
+ query.set("limit", String(opts.limit));
33
+ if (opts.offset !== undefined)
34
+ query.set("offset", String(opts.offset));
35
+ const suffix = query.size ? `?${query}` : "";
36
+ const res = await call(client, "GET", `/admin/users${suffix}`);
31
37
  if (!res.ok)
32
38
  throw new AdminApiError(`Could not list users (${res.status}).`);
39
+ // `total` counts every user, not just this page, so callers can report position.
33
40
  return { users: arr(res.data?.users), total: res.data?.total ?? 0 };
34
41
  }
35
42
  export async function deleteUser(client, id) {
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/core/admin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin.js","sourceRoot":"","sources":["../../src/core/admin.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { getActiveProfile, getPortalSession, } from "./config.js";
2
- import { deleteTokens, getTokens, KeychainUnavailableError, saveTokens, } from "./keychain.js";
2
+ import { deleteTokens, getTokens, headlessRefreshToken, KeychainUnavailableError, saveTokens, } from "./keychain.js";
3
3
  import { apiRequest, joinUrl } from "./http.js";
4
4
  export class ReauthRequiredError extends Error {
5
5
  constructor(message) {
@@ -24,6 +24,40 @@ export function tokensFromAuthResponse(data) {
24
24
  refreshTokenExpiresAt: refreshTtl !== undefined ? now + refreshTtl * 1000 : undefined,
25
25
  };
26
26
  }
27
+ /**
28
+ * Reads a `/refresh` response, keeping the current refresh token when the instance
29
+ * did not send a new one.
30
+ *
31
+ * Separate from `tokensFromAuthResponse` because the two answer different questions.
32
+ * A login must establish both tokens, and a response missing either is unusable. A
33
+ * refresh only has to produce a usable access token: the response schema marks both
34
+ * fields optional, so requiring the pair would wipe a session that is still valid
35
+ * the first time an instance rotates only the access token.
36
+ */
37
+ export function tokensFromRefreshResponse(data, current) {
38
+ if (!data)
39
+ return null;
40
+ const accessToken = typeof data.token === "string" ? data.token : undefined;
41
+ if (!accessToken)
42
+ return null;
43
+ const rotated = typeof data.refreshToken === "string" && data.refreshToken
44
+ ? data.refreshToken
45
+ : undefined;
46
+ const now = Date.now();
47
+ const ttl = typeof data.ttl === "number" ? data.ttl : undefined;
48
+ const refreshTtl = typeof data.refreshTtl === "number" ? data.refreshTtl : undefined;
49
+ return {
50
+ accessToken,
51
+ refreshToken: rotated ?? current.refreshToken,
52
+ accessTokenExpiresAt: ttl !== undefined ? now + ttl * 1000 : undefined,
53
+ refreshTokenExpiresAt: refreshTtl !== undefined
54
+ ? now + refreshTtl * 1000
55
+ : // An unrotated token keeps the expiry it already had.
56
+ rotated
57
+ ? undefined
58
+ : current.refreshTokenExpiresAt,
59
+ };
60
+ }
27
61
  // A client for an auth instance a developer administers, resolved from the active
28
62
  // profile. Portal calls use createPortalClient instead: the two sessions are
29
63
  // different accounts on different hosts and must never be interchanged.
@@ -57,11 +91,16 @@ async function createClientForProfile(profile, copy) {
57
91
  throw new ReauthRequiredError(`No session for ${copy.label}. Run: ${copy.reauthCommand}.`);
58
92
  }
59
93
  const session = tokens;
94
+ // A headless run reads SEAMLESS_REFRESH_TOKEN fresh every time, so the keychain is
95
+ // never consulted and writing a rotated token there only makes it look preserved.
96
+ const headless = headlessRefreshToken() !== undefined;
60
97
  const persist = async (next) => {
61
98
  session.accessToken = next.accessToken;
62
99
  session.refreshToken = next.refreshToken;
63
100
  session.accessTokenExpiresAt = next.accessTokenExpiresAt;
64
101
  session.refreshTokenExpiresAt = next.refreshTokenExpiresAt;
102
+ if (headless)
103
+ return;
65
104
  try {
66
105
  await saveTokens(profile, next);
67
106
  }
@@ -79,22 +118,37 @@ async function createClientForProfile(profile, copy) {
79
118
  throw err;
80
119
  }
81
120
  };
82
- const refresh = async () => {
121
+ const expiredMessage = () => headless
122
+ ? `The refresh token in SEAMLESS_REFRESH_TOKEN was rejected by ${copy.label}. The instance rotates the refresh token on every refresh and revokes the session if a spent one is sent again, so a token that has already been refreshed once cannot be reused on a later run. Issue a fresh one with: ${copy.reauthCommand}.`
123
+ : `Your session for ${copy.label} has expired or was revoked. Run: ${copy.reauthCommand}.`;
124
+ const runRefresh = async () => {
83
125
  const res = await apiRequest(joinUrl(profile.instanceUrl, "/refresh"), {
84
126
  method: "POST",
85
127
  headers: { Authorization: `Bearer ${session.refreshToken}` },
86
128
  });
87
129
  if (!res.ok) {
88
130
  await clearSession();
89
- throw new ReauthRequiredError(`Your session for ${copy.label} has expired or was revoked. Run: ${copy.reauthCommand}.`);
131
+ throw new ReauthRequiredError(expiredMessage());
90
132
  }
91
- const next = tokensFromAuthResponse(res.data);
133
+ const next = tokensFromRefreshResponse(res.data, session);
92
134
  if (!next) {
93
135
  await clearSession();
94
136
  throw new ReauthRequiredError(`Received an unexpected refresh response from ${profile.instanceUrl}. Run: ${copy.reauthCommand}.`);
95
137
  }
96
138
  await persist(next);
97
139
  };
140
+ // Single-flight. The instance rotates the refresh token on every call and reads a
141
+ // second use of the old one as theft, revoking the whole session chain, so two
142
+ // concurrent refreshes would not merely race: they would log the developer out.
143
+ let inFlight = null;
144
+ const refresh = () => {
145
+ if (!inFlight) {
146
+ inFlight = runRefresh().finally(() => {
147
+ inFlight = null;
148
+ });
149
+ }
150
+ return inFlight;
151
+ };
98
152
  const authedFetch = async (path, init = {}) => {
99
153
  const build = () => ({
100
154
  ...init,
@@ -104,10 +158,22 @@ async function createClientForProfile(profile, copy) {
104
158
  },
105
159
  });
106
160
  const url = joinUrl(profile.instanceUrl, path);
161
+ const sentWith = session.accessToken;
107
162
  let res = await apiRequest(url, build());
108
163
  if (res.status === 401 && session.refreshToken) {
109
- await refresh();
164
+ // Only refresh if nothing else already did while this request was in flight.
165
+ // Otherwise a burst of 401s against one stale token would each rotate again.
166
+ if (session.accessToken === sentWith) {
167
+ await refresh();
168
+ }
110
169
  res = await apiRequest(url, build());
170
+ // A 401 on a freshly refreshed token is not something a caller can act on by
171
+ // retrying, and returning it verbatim left commands reporting an opaque failure
172
+ // instead of saying the session is gone.
173
+ if (res.status === 401) {
174
+ await clearSession();
175
+ throw new ReauthRequiredError(`Your session for ${copy.label} was rejected after refreshing it. Run: ${copy.reauthCommand}.`);
176
+ }
111
177
  }
112
178
  return res;
113
179
  };
@@ -1 +1 @@
1
- {"version":3,"file":"authClient.js","sourceRoot":"","sources":["../../src/core/authClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authClient.js","sourceRoot":"","sources":["../../src/core/authClient.ts"],"names":[],"mappings":"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"}
@@ -162,7 +162,54 @@ export function clearPortalSession() {
162
162
  saveConfig(config);
163
163
  return config;
164
164
  }
165
- const LOCAL_HOSTS = new Set(["localhost", "127.0.0.1", "::1", "[::1]"]);
165
+ const LOCAL_HOSTS = new Set(["localhost", "::1", "[::1]", "::", "[::]"]);
166
+ /** An IPv4 dotted quad, as four numbers, or null when the host is not one. */
167
+ function ipv4Octets(host) {
168
+ const parts = host.split(".");
169
+ if (parts.length !== 4)
170
+ return null;
171
+ const octets = parts.map((part) => /^\d{1,3}$/.test(part) ? Number(part) : NaN);
172
+ return octets.every((n) => n >= 0 && n <= 255) ? octets : null;
173
+ }
174
+ function isPrivateIpv4(host) {
175
+ const octets = ipv4Octets(host);
176
+ if (!octets)
177
+ return false;
178
+ const [a, b] = octets;
179
+ if (a === 127)
180
+ return true; // loopback, the whole /8 rather than just .0.1
181
+ if (a === 0)
182
+ return true; // 0.0.0.0, what a dev server binds to for "every interface"
183
+ if (a === 10)
184
+ return true;
185
+ if (a === 172 && b >= 16 && b <= 31)
186
+ return true; // /12, so not 172.32+
187
+ if (a === 192 && b === 168)
188
+ return true;
189
+ if (a === 169 && b === 254)
190
+ return true; // link-local
191
+ return false;
192
+ }
193
+ function isPrivateIpv6(host) {
194
+ // URL.hostname keeps the brackets on an IPv6 literal.
195
+ const inner = host.startsWith("[") && host.endsWith("]")
196
+ ? host.slice(1, -1).toLowerCase()
197
+ : null;
198
+ if (!inner)
199
+ return false;
200
+ // fc00::/7 unique-local and fe80::/10 link-local. Matching on the leading group
201
+ // is enough here: a global address never opens with one of these.
202
+ return /^f[cd]/.test(inner) || /^fe[89ab]/.test(inner);
203
+ }
204
+ /**
205
+ * Whether a URL points at something on the developer's own machine or network.
206
+ *
207
+ * Gates two things: allowing plaintext http, and `--local` OTP delivery, which asks
208
+ * the instance to return the code in the response body. A dev instance is commonly
209
+ * reached at something other than localhost, a container bound to `0.0.0.0`, a LAN
210
+ * address from a phone on the same network, or an mDNS `.local` name, and refusing
211
+ * those forced https onto a box that has no certificate.
212
+ */
166
213
  export function isLocalInstanceUrl(input) {
167
214
  let url;
168
215
  try {
@@ -171,8 +218,13 @@ export function isLocalInstanceUrl(input) {
171
218
  catch {
172
219
  return false;
173
220
  }
174
- const host = url.hostname;
175
- return LOCAL_HOSTS.has(host) || host.endsWith(".localhost");
221
+ const host = url.hostname.toLowerCase();
222
+ return (LOCAL_HOSTS.has(host) ||
223
+ host.endsWith(".localhost") ||
224
+ host === "local" ||
225
+ host.endsWith(".local") ||
226
+ isPrivateIpv4(host) ||
227
+ isPrivateIpv6(host));
176
228
  }
177
229
  export function normalizeInstanceUrl(input) {
178
230
  const trimmed = (input ?? "").trim();
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { scrubTokens } from "./redact.js";
2
+ /**
3
+ * Renders a thrown value for display.
4
+ *
5
+ * `throw` accepts anything, so reading `.message` off it is a guess. When the guess
6
+ * was wrong the CLI printed "Error: undefined", which names neither the failure nor
7
+ * the fact that something unexpected was thrown.
8
+ *
9
+ * A thrown object is scrubbed before it is shown: it reaches here from a rejected
10
+ * request as often as from our own code, and a response body can carry a token.
11
+ */
12
+ export function errorMessage(err) {
13
+ if (err instanceof Error)
14
+ return err.message || err.name;
15
+ if (typeof err === "string")
16
+ return err;
17
+ if (err && typeof err === "object") {
18
+ const message = err.message;
19
+ if (typeof message === "string" && message)
20
+ return message;
21
+ try {
22
+ return JSON.stringify(scrubTokens(err));
23
+ }
24
+ catch {
25
+ // Circular, or something JSON cannot represent.
26
+ return String(err);
27
+ }
28
+ }
29
+ // null, undefined, and the other primitives, none of which say much on their own.
30
+ return `Unexpected error: ${String(err)}`;
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC;IACzD,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IAExC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAI,GAA6B,CAAC,OAAO,CAAC;QACvD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;YAChD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,OAAO,qBAAqB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5C,CAAC"}
@@ -1,7 +1,23 @@
1
1
  import { SEAMLESS_AUTH_API_VERSION } from "./images.js";
2
+ /**
3
+ * A GET whose connection-level failure says what it could not reach.
4
+ *
5
+ * When `fetch` never gets a response at all (offline, DNS, TLS, no route) it rejects
6
+ * with a bare `TypeError: fetch failed`, which reaches the top-level handler as
7
+ * "Error: fetch failed" and names neither the host nor what the CLI wanted from it.
8
+ * A non-ok response is left to the caller, which knows what its status means.
9
+ */
10
+ export async function fetchRemote(url, purpose) {
11
+ try {
12
+ return await fetch(url);
13
+ }
14
+ catch (err) {
15
+ throw new Error(`Could not reach ${url} to ${purpose}. Check your network connection.`, { cause: err });
16
+ }
17
+ }
2
18
  export async function fetchEnvExample() {
3
19
  const url = `https://raw.githubusercontent.com/fells-code/seamless-auth-api/${SEAMLESS_AUTH_API_VERSION}/.env.example`;
4
- const res = await fetch(url);
20
+ const res = await fetchRemote(url, "read the auth server's env.example");
5
21
  if (!res.ok) {
6
22
  throw new Error("Failed to fetch auth env.example");
7
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/core/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GACP,kEAAkE,yBAAyB,eAAe,CAAC;IAE7G,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/core/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,OAAe;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,OAAO,OAAO,kCAAkC,EACtE,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GACP,kEAAkE,yBAAyB,eAAe,CAAC;IAE7G,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,oCAAoC,CAAC,CAAC;IAEzE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -6,6 +6,12 @@ export const SEAMLESS_AUTH_API_VERSION = "v0.7.1";
6
6
  export const SEAMLESS_AUTH_API_IMAGE = `ghcr.io/fells-code/seamless-auth-api:${SEAMLESS_AUTH_API_VERSION}`;
7
7
  export const SEAMLESS_AUTH_ADMIN_DASHBOARD_VERSION = "v0.4.0";
8
8
  export const SEAMLESS_AUTH_ADMIN_DASHBOARD_IMAGE = `ghcr.io/fells-code/seamless-auth-admin-dashboard:${SEAMLESS_AUTH_ADMIN_DASHBOARD_VERSION}`;
9
+ // `--admin=source` unpacks the dashboard from this repo at the same tag the image
10
+ // above is built from, so both admin modes scaffold the same dashboard. Override
11
+ // the ref with SEAMLESS_ADMIN_DASHBOARD_REF, or point at a local checkout with
12
+ // SEAMLESS_ADMIN_DASHBOARD_DIR.
13
+ export const SEAMLESS_AUTH_ADMIN_DASHBOARD_REPO = "fells-code/seamless-auth-admin-dashboard";
14
+ export const SEAMLESS_AUTH_ADMIN_DASHBOARD_REF = SEAMLESS_AUTH_ADMIN_DASHBOARD_VERSION;
9
15
  // The starter templates monorepo the CLI scaffolds from. Pinned to a tag so a given
10
16
  // CLI version always produces the same project. Override the ref with
11
17
  // SEAMLESS_TEMPLATES_REF, or point at a local checkout with SEAMLESS_TEMPLATES_DIR.
@@ -1 +1 @@
1
- {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/core/images.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,kFAAkF;AAClF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,wCAAwC,yBAAyB,EAAE,CAAC;AAE3G,MAAM,CAAC,MAAM,qCAAqC,GAAG,QAAQ,CAAC;AAE9D,MAAM,CAAC,MAAM,mCAAmC,GAAG,oDAAoD,qCAAqC,EAAE,CAAC;AAE/I,oFAAoF;AACpF,sEAAsE;AACtE,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAEvE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC"}
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/core/images.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,kFAAkF;AAClF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAElD,MAAM,CAAC,MAAM,uBAAuB,GAAG,wCAAwC,yBAAyB,EAAE,CAAC;AAE3G,MAAM,CAAC,MAAM,qCAAqC,GAAG,QAAQ,CAAC;AAE9D,MAAM,CAAC,MAAM,mCAAmC,GAAG,oDAAoD,qCAAqC,EAAE,CAAC;AAE/I,kFAAkF;AAClF,iFAAiF;AACjF,+EAA+E;AAC/E,gCAAgC;AAChC,MAAM,CAAC,MAAM,kCAAkC,GAC7C,0CAA0C,CAAC;AAE7C,MAAM,CAAC,MAAM,iCAAiC,GAAG,qCAAqC,CAAC;AAEvF,oFAAoF;AACpF,sEAAsE;AACtE,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,+BAA+B,CAAC;AAEvE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC"}
@@ -32,23 +32,19 @@ export async function promptLogin(opts) {
32
32
  requireInteractive("Enter the code we sent you", "A one-time code cannot be supplied ahead of time, so this step needs a terminal.");
33
33
  const answer = await text({
34
34
  message: resent ? "Enter the new code" : "Enter the code we sent you",
35
+ // A hint, not a rule: the code format belongs to the instance, so the
36
+ // prompt only refuses an empty answer and lets the server judge the rest.
37
+ // Encoding today's shape here would reject a valid code from an instance
38
+ // that ever issues a different one, with no way to override it.
35
39
  placeholder: email ? "ABCDEF" : "123456",
36
- validate: (value) => {
37
- const code = (value ?? "").trim();
38
- if (email) {
39
- return /^[A-Za-z]{6}$/.test(code)
40
- ? undefined
41
- : "Enter the 6-letter code from the email.";
42
- }
43
- return /^\d{4,8}$/.test(code)
44
- ? undefined
45
- : "Enter the numeric code from the message.";
46
- },
40
+ validate: (value) => (value ?? "").trim() ? undefined : "A code is required",
47
41
  });
48
42
  if (isCancel(answer))
49
43
  return null;
50
- const code = answer.trim();
51
- return email ? code.toUpperCase() : code;
44
+ // Sent as typed apart from surrounding whitespace. The instance normalizes
45
+ // case for email codes itself, so uppercasing here would only corrupt a
46
+ // case-sensitive one.
47
+ return answer.trim();
52
48
  },
53
49
  notify: (event) => {
54
50
  switch (event.type) {
@@ -58,6 +54,9 @@ export async function promptLogin(opts) {
58
54
  // know.
59
55
  console.log(kleur.dim(`If an account exists for ${resolved}, a code is on its way.`));
60
56
  break;
57
+ case "code_expired":
58
+ console.log(kleur.yellow("That code was not sent: the five minute login window lapsed while you were typing."));
59
+ break;
61
60
  case "code_resent":
62
61
  console.log(kleur.dim("Your previous code expired, so we sent a new one."));
63
62
  break;
@@ -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;oBAClB,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClC,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;4BAC/B,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,yCAAyC,CAAC;oBAChD,CAAC;oBACD,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC3B,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,0CAA0C,CAAC;gBACjD,CAAC;aACF,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClC,MAAM,IAAI,GAAI,MAAiB,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,CAAC;QACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,WAAW;oBACd,yEAAyE;oBACzE,8EAA8E;oBAC9E,QAAQ;oBACR,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,4BAA4B,QAAQ,yBAAyB,CAAC,CACzE,CAAC;oBACF,MAAM;gBACR,KAAK,aAAa;oBAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAC/D,CAAC;oBACF,MAAM;gBACR,KAAK,iBAAiB;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBACpE,MAAM;gBACR,KAAK,WAAW;oBACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,+BAA+B,KAAK,CAAC,YAAY,WAC/C,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAClC,QAAQ,CACT,CACF,CAAC;oBACF,MAAM;YACV,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC"}
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"}
@@ -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 = process.env.SEAMLESS_REFRESH_TOKEN?.trim();
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