@authrim/setup 0.1.140 → 0.1.142

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 (122) hide show
  1. package/dist/__tests__/keys.test.js +73 -2
  2. package/dist/__tests__/keys.test.js.map +1 -1
  3. package/dist/__tests__/migrate.test.js +4 -4
  4. package/dist/__tests__/migrate.test.js.map +1 -1
  5. package/dist/__tests__/paths.test.js +163 -1
  6. package/dist/__tests__/paths.test.js.map +1 -1
  7. package/dist/__tests__/source-context.test.d.ts +2 -0
  8. package/dist/__tests__/source-context.test.d.ts.map +1 -0
  9. package/dist/__tests__/source-context.test.js +72 -0
  10. package/dist/__tests__/source-context.test.js.map +1 -0
  11. package/dist/cli/commands/deploy.d.ts.map +1 -1
  12. package/dist/cli/commands/deploy.js +65 -37
  13. package/dist/cli/commands/deploy.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts.map +1 -1
  15. package/dist/cli/commands/init.js +277 -198
  16. package/dist/cli/commands/init.js.map +1 -1
  17. package/dist/core/admin.d.ts +6 -1
  18. package/dist/core/admin.d.ts.map +1 -1
  19. package/dist/core/admin.js +45 -20
  20. package/dist/core/admin.js.map +1 -1
  21. package/dist/core/cloudflare.d.ts +38 -1
  22. package/dist/core/cloudflare.d.ts.map +1 -1
  23. package/dist/core/cloudflare.js +729 -115
  24. package/dist/core/cloudflare.js.map +1 -1
  25. package/dist/core/config.d.ts +164 -34
  26. package/dist/core/config.d.ts.map +1 -1
  27. package/dist/core/config.js +72 -18
  28. package/dist/core/config.js.map +1 -1
  29. package/dist/core/deploy.d.ts +18 -0
  30. package/dist/core/deploy.d.ts.map +1 -1
  31. package/dist/core/deploy.js +126 -25
  32. package/dist/core/deploy.js.map +1 -1
  33. package/dist/core/keys.d.ts +20 -4
  34. package/dist/core/keys.d.ts.map +1 -1
  35. package/dist/core/keys.js +77 -17
  36. package/dist/core/keys.js.map +1 -1
  37. package/dist/core/login-ui-client.d.ts +42 -0
  38. package/dist/core/login-ui-client.d.ts.map +1 -0
  39. package/dist/core/login-ui-client.js +173 -0
  40. package/dist/core/login-ui-client.js.map +1 -0
  41. package/dist/core/migrate.d.ts +37 -0
  42. package/dist/core/migrate.d.ts.map +1 -1
  43. package/dist/core/migrate.js +92 -2
  44. package/dist/core/migrate.js.map +1 -1
  45. package/dist/core/paths.d.ts +78 -13
  46. package/dist/core/paths.d.ts.map +1 -1
  47. package/dist/core/paths.js +135 -17
  48. package/dist/core/paths.js.map +1 -1
  49. package/dist/core/source-context.d.ts +22 -0
  50. package/dist/core/source-context.d.ts.map +1 -0
  51. package/dist/core/source-context.js +46 -0
  52. package/dist/core/source-context.js.map +1 -0
  53. package/dist/core/tenant-mode.d.ts +4 -0
  54. package/dist/core/tenant-mode.d.ts.map +1 -0
  55. package/dist/core/tenant-mode.js +17 -0
  56. package/dist/core/tenant-mode.js.map +1 -0
  57. package/dist/core/ui-deployment.d.ts +21 -0
  58. package/dist/core/ui-deployment.d.ts.map +1 -0
  59. package/dist/core/ui-deployment.js +90 -0
  60. package/dist/core/ui-deployment.js.map +1 -0
  61. package/dist/core/ui-env.d.ts +28 -0
  62. package/dist/core/ui-env.d.ts.map +1 -1
  63. package/dist/core/ui-env.js +16 -0
  64. package/dist/core/ui-env.js.map +1 -1
  65. package/dist/core/url-config.d.ts +16 -0
  66. package/dist/core/url-config.d.ts.map +1 -0
  67. package/dist/core/url-config.js +46 -0
  68. package/dist/core/url-config.js.map +1 -0
  69. package/dist/core/wrangler.d.ts +50 -1
  70. package/dist/core/wrangler.d.ts.map +1 -1
  71. package/dist/core/wrangler.js +171 -57
  72. package/dist/core/wrangler.js.map +1 -1
  73. package/dist/i18n/locales/de.d.ts.map +1 -1
  74. package/dist/i18n/locales/de.js +38 -1
  75. package/dist/i18n/locales/de.js.map +1 -1
  76. package/dist/i18n/locales/en.d.ts.map +1 -1
  77. package/dist/i18n/locales/en.js +38 -1
  78. package/dist/i18n/locales/en.js.map +1 -1
  79. package/dist/i18n/locales/es.d.ts.map +1 -1
  80. package/dist/i18n/locales/es.js +38 -1
  81. package/dist/i18n/locales/es.js.map +1 -1
  82. package/dist/i18n/locales/fr.d.ts.map +1 -1
  83. package/dist/i18n/locales/fr.js +38 -1
  84. package/dist/i18n/locales/fr.js.map +1 -1
  85. package/dist/i18n/locales/id.d.ts.map +1 -1
  86. package/dist/i18n/locales/id.js +38 -1
  87. package/dist/i18n/locales/id.js.map +1 -1
  88. package/dist/i18n/locales/ja.d.ts.map +1 -1
  89. package/dist/i18n/locales/ja.js +38 -1
  90. package/dist/i18n/locales/ja.js.map +1 -1
  91. package/dist/i18n/locales/ko.d.ts.map +1 -1
  92. package/dist/i18n/locales/ko.js +38 -1
  93. package/dist/i18n/locales/ko.js.map +1 -1
  94. package/dist/i18n/locales/pt.d.ts.map +1 -1
  95. package/dist/i18n/locales/pt.js +38 -1
  96. package/dist/i18n/locales/pt.js.map +1 -1
  97. package/dist/i18n/locales/ru.d.ts.map +1 -1
  98. package/dist/i18n/locales/ru.js +38 -1
  99. package/dist/i18n/locales/ru.js.map +1 -1
  100. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  101. package/dist/i18n/locales/zh-CN.js +38 -1
  102. package/dist/i18n/locales/zh-CN.js.map +1 -1
  103. package/dist/i18n/locales/zh-TW.d.ts.map +1 -1
  104. package/dist/i18n/locales/zh-TW.js +38 -1
  105. package/dist/i18n/locales/zh-TW.js.map +1 -1
  106. package/dist/i18n/types.d.ts +8 -0
  107. package/dist/i18n/types.d.ts.map +1 -1
  108. package/dist/index.d.ts +8 -1
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +46 -30
  111. package/dist/index.js.map +1 -1
  112. package/dist/web/api.d.ts.map +1 -1
  113. package/dist/web/api.js +243 -116
  114. package/dist/web/api.js.map +1 -1
  115. package/dist/web/ui.d.ts.map +1 -1
  116. package/dist/web/ui.js +513 -115
  117. package/dist/web/ui.js.map +1 -1
  118. package/migrations/000_fresh_schema.sql +229 -10
  119. package/migrations/admin/007_admin_role_inheritance.sql +32 -0
  120. package/migrations/admin/008_admin_rebac_definitions.sql +117 -0
  121. package/migrations/admin/009_optimize_admin_audit_indexes.sql +15 -0
  122. package/package.json +5 -5
package/dist/core/keys.js CHANGED
@@ -4,13 +4,14 @@
4
4
  * Generates RSA key pairs for JWT signing and other cryptographic secrets.
5
5
  * Based on the existing setup-keys.sh script functionality.
6
6
  *
7
- * Supports both legacy (.keys/{env}/) and new (.authrim/{env}/keys/) structures.
7
+ * Supports external (.authrim-keys/{env}/), internal (.authrim/{env}/keys/),
8
+ * and legacy (.keys/{env}/) key storage structures.
8
9
  */
9
10
  import { randomBytes, generateKeyPairSync, createPublicKey, createPrivateKey } from 'node:crypto';
10
- import { writeFile, mkdir, readFile } from 'node:fs/promises';
11
+ import { writeFile, mkdir, readFile, chmod } from 'node:fs/promises';
11
12
  import { existsSync } from 'node:fs';
12
13
  import { join, resolve } from 'node:path';
13
- import { getEnvironmentPaths, getLegacyPaths, resolvePaths, } from './paths.js';
14
+ import { getEnvironmentPaths, getExternalKeysDir, getLegacyPaths, findKeysDirectory, resolvePaths, } from './paths.js';
14
15
  // =============================================================================
15
16
  // Key ID Generation
16
17
  // =============================================================================
@@ -120,8 +121,14 @@ function validateKeysDirectory(keysDir) {
120
121
  if (/[;&|`$(){}[\]<>!#*?]/.test(keysDir)) {
121
122
  throw new Error('Invalid keys directory: shell metacharacters not allowed');
122
123
  }
123
- // Reject absolute paths to system directories (Unix)
124
124
  const absolutePath = resolve(keysDir);
125
+ const cwd = process.cwd();
126
+ // Allow paths within the current working directory (project paths are safe)
127
+ // This allows CI environments like GitHub Actions (/home/runner/work/...)
128
+ if (absolutePath.startsWith(cwd + '/') || absolutePath === cwd) {
129
+ return;
130
+ }
131
+ // Reject absolute paths to system directories (Unix)
125
132
  const dangerousPaths = ['/etc', '/usr', '/bin', '/sbin', '/var', '/tmp', '/root', '/home'];
126
133
  for (const dangerous of dangerousPaths) {
127
134
  if (absolutePath.startsWith(dangerous + '/') || absolutePath === dangerous) {
@@ -139,7 +146,12 @@ function validateKeysDirectory(keysDir) {
139
146
  /**
140
147
  * Get environment-specific keys directory path
141
148
  *
142
- * @param baseDir - Base directory (usually cwd)
149
+ * Search order when keysBaseDir is provided:
150
+ * 1. External: {keysBaseDir}/.authrim-keys/{env}/
151
+ * 2. Internal: {baseDir}/.authrim/{env}/keys/
152
+ * 3. Legacy: {baseDir}/.keys/{env}/
153
+ *
154
+ * @param baseDir - Base directory (usually source dir)
143
155
  * @param env - Environment name
144
156
  * @param options - Options for path resolution
145
157
  * @returns Path to the keys directory
@@ -148,6 +160,15 @@ export function getKeysDirectory(baseDir, env, options) {
148
160
  if (options?.legacy) {
149
161
  return getLegacyPaths(baseDir, env).keys;
150
162
  }
163
+ // If keysBaseDir is provided, use findKeysDirectory for 3-tier fallback
164
+ if (options?.keysBaseDir) {
165
+ const found = findKeysDirectory({ env, sourceDir: baseDir, keysBaseDir: options.keysBaseDir });
166
+ if (found) {
167
+ return found.path;
168
+ }
169
+ // Default to external for new environments
170
+ return getExternalKeysDir(env, options.keysBaseDir);
171
+ }
151
172
  // Check if existing structure should be used
152
173
  const resolved = resolvePaths({ baseDir, env });
153
174
  if (resolved.type === 'legacy') {
@@ -170,9 +191,20 @@ export function getLegacyKeysDirectory(baseDir, env) {
170
191
  }
171
192
  /**
172
193
  * Check if keys already exist for an environment
173
- * Checks both new and legacy structures
194
+ * Checks external, internal (new), and legacy structures
195
+ *
196
+ * @param baseDir - Source directory
197
+ * @param env - Environment name
198
+ * @param keysBaseDir - Optional base directory for external keys
174
199
  */
175
- export function keysExistForEnvironment(baseDir, env) {
200
+ export function keysExistForEnvironment(baseDir, env, keysBaseDir) {
201
+ // Check external structure
202
+ if (keysBaseDir) {
203
+ const externalDir = getExternalKeysDir(env, keysBaseDir);
204
+ if (existsSync(join(externalDir, 'metadata.json'))) {
205
+ return true;
206
+ }
207
+ }
176
208
  // Check new structure
177
209
  const newPaths = getEnvironmentPaths({ baseDir, env });
178
210
  const newMetadataPath = join(newPaths.keys, 'metadata.json');
@@ -202,12 +234,16 @@ export async function saveKeysToDirectory(secrets, options = {}, legacyEnv) {
202
234
  targetDir = legacyEnv ? join(options, legacyEnv) : options;
203
235
  }
204
236
  else {
205
- const { baseDir = process.cwd(), env, legacy, targetDir: explicitDir } = options;
237
+ const { baseDir = process.cwd(), env, legacy, targetDir: explicitDir, keysBaseDir } = options;
206
238
  if (explicitDir) {
207
239
  targetDir = explicitDir;
208
240
  }
209
241
  else if (env) {
210
- if (legacy) {
242
+ if (keysBaseDir) {
243
+ // External keys: {keysBaseDir}/.authrim-keys/{env}/
244
+ targetDir = getExternalKeysDir(env, keysBaseDir);
245
+ }
246
+ else if (legacy) {
211
247
  targetDir = getLegacyPaths(baseDir, env).keys;
212
248
  }
213
249
  else {
@@ -220,9 +256,9 @@ export async function saveKeysToDirectory(secrets, options = {}, legacyEnv) {
220
256
  }
221
257
  // Security: Validate directory path to prevent path traversal
222
258
  validateKeysDirectory(targetDir);
223
- // Ensure directory exists
259
+ // Ensure directory exists with restrictive permissions (owner-only access)
224
260
  if (!existsSync(targetDir)) {
225
- await mkdir(targetDir, { recursive: true });
261
+ await mkdir(targetDir, { recursive: true, mode: 0o700 });
226
262
  }
227
263
  const paths = {
228
264
  privateKey: join(targetDir, 'private.pem'),
@@ -233,16 +269,24 @@ export async function saveKeysToDirectory(secrets, options = {}, legacyEnv) {
233
269
  setupToken: join(targetDir, 'setup_token.txt'),
234
270
  metadata: join(targetDir, 'metadata.json'),
235
271
  };
272
+ // Sensitive file permission: owner read/write only
273
+ const SENSITIVE_FILE_MODE = 0o600;
236
274
  // Write private key
237
275
  await writeFile(paths.privateKey, secrets.keyPair.privateKeyPem, 'utf-8');
276
+ await chmod(paths.privateKey, SENSITIVE_FILE_MODE);
238
277
  // Write public key (JWK)
239
278
  await writeFile(paths.publicKey, JSON.stringify(secrets.keyPair.publicKeyJwk, null, 2), 'utf-8');
279
+ await chmod(paths.publicKey, SENSITIVE_FILE_MODE);
240
280
  // Write other secrets
241
281
  await writeFile(paths.rpTokenEncryptionKey, secrets.rpTokenEncryptionKey, 'utf-8');
282
+ await chmod(paths.rpTokenEncryptionKey, SENSITIVE_FILE_MODE);
242
283
  await writeFile(paths.adminApiSecret, secrets.adminApiSecret, 'utf-8');
284
+ await chmod(paths.adminApiSecret, SENSITIVE_FILE_MODE);
243
285
  await writeFile(paths.keyManagerSecret, secrets.keyManagerSecret, 'utf-8');
286
+ await chmod(paths.keyManagerSecret, SENSITIVE_FILE_MODE);
244
287
  if (secrets.setupToken) {
245
288
  await writeFile(paths.setupToken, secrets.setupToken, 'utf-8');
289
+ await chmod(paths.setupToken, SENSITIVE_FILE_MODE);
246
290
  }
247
291
  // Write metadata
248
292
  const metadata = {
@@ -257,6 +301,7 @@ export async function saveKeysToDirectory(secrets, options = {}, legacyEnv) {
257
301
  },
258
302
  };
259
303
  await writeFile(paths.metadata, JSON.stringify(metadata, null, 2), 'utf-8');
304
+ await chmod(paths.metadata, SENSITIVE_FILE_MODE);
260
305
  }
261
306
  /**
262
307
  * Load existing keys from directory
@@ -273,18 +318,31 @@ export async function loadKeysFromDirectory(options = {}, legacyEnv) {
273
318
  targetDir = legacyEnv ? join(options, legacyEnv) : options;
274
319
  }
275
320
  else {
276
- const { baseDir = process.cwd(), env, targetDir: explicitDir } = options;
321
+ const { baseDir = process.cwd(), env, targetDir: explicitDir, keysBaseDir } = options;
277
322
  if (explicitDir) {
278
323
  targetDir = explicitDir;
279
324
  }
280
325
  else if (env) {
281
- // Auto-detect which structure to use
282
- const resolved = resolvePaths({ baseDir, env });
283
- if (resolved.type === 'legacy') {
284
- targetDir = resolved.paths.keys;
326
+ // Use findKeysDirectory for 3-tier search when keysBaseDir is provided
327
+ if (keysBaseDir) {
328
+ const found = findKeysDirectory({ env, sourceDir: baseDir, keysBaseDir });
329
+ if (found) {
330
+ targetDir = found.path;
331
+ }
332
+ else {
333
+ // No keys found anywhere
334
+ return {};
335
+ }
285
336
  }
286
337
  else {
287
- targetDir = resolved.paths.keys;
338
+ // Auto-detect which structure to use
339
+ const resolved = resolvePaths({ baseDir, env });
340
+ if (resolved.type === 'legacy') {
341
+ targetDir = resolved.paths.keys;
342
+ }
343
+ else {
344
+ targetDir = resolved.paths.keys;
345
+ }
288
346
  }
289
347
  }
290
348
  else {
@@ -356,6 +414,8 @@ export function generateWranglerSecretCommands(secrets, keysDir = '.keys', env)
356
414
  const commands = [];
357
415
  // Private key (multiline secret)
358
416
  commands.push(`cat ${join(keysDir, 'private.pem')} | wrangler secret put PRIVATE_KEY_PEM${envFlag}`);
417
+ // Public JWK
418
+ commands.push(`cat ${join(keysDir, 'public.jwk.json')} | wrangler secret put PUBLIC_JWK_JSON${envFlag}`);
359
419
  // RP Token encryption key
360
420
  commands.push(`echo -n "$(cat ${join(keysDir, 'rp_token_encryption_key.txt')})" | wrangler secret put RP_TOKEN_ENCRYPTION_KEY${envFlag}`);
361
421
  // Admin API secret
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Login UI Client Auto-Creation Module
3
+ *
4
+ * Creates an OAuth client for the Login UI during deployment.
5
+ * The Login UI needs its own client_id for SDK integration and
6
+ * OAuth callback handling.
7
+ *
8
+ * Flow:
9
+ * 1. After workers are deployed, Admin API is available
10
+ * 2. Read ADMIN_API_SECRET from keys directory
11
+ * 3. Check if Login UI client already exists
12
+ * 4. Create client via POST /api/admin/clients with Bearer token
13
+ * 5. Return client_id for inclusion in ui.env
14
+ */
15
+ export interface LoginUiClientConfig {
16
+ /** API base URL (e.g., https://prod-ar-router.workers.dev) */
17
+ apiBaseUrl: string;
18
+ /** Login UI URL (e.g., https://prod-ar-login-ui.pages.dev) */
19
+ loginUiUrl: string;
20
+ /** Path to admin_api_secret.txt */
21
+ adminApiSecretPath: string;
22
+ /** Progress callback */
23
+ onProgress?: (message: string) => void;
24
+ }
25
+ export interface LoginUiClientResult {
26
+ /** Whether the operation succeeded */
27
+ success: boolean;
28
+ /** The client_id of the Login UI client */
29
+ clientId?: string;
30
+ /** Whether the client already existed */
31
+ alreadyExists?: boolean;
32
+ /** Error message if failed */
33
+ error?: string;
34
+ }
35
+ /**
36
+ * Ensure a Login UI OAuth client exists, creating one if necessary.
37
+ *
38
+ * This is idempotent: if a client named "Login UI" with is_trusted=true
39
+ * already exists, its client_id is returned without creating a new one.
40
+ */
41
+ export declare function ensureLoginUiClient(config: LoginUiClientConfig): Promise<LoginUiClientResult>;
42
+ //# sourceMappingURL=login-ui-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-ui-client.d.ts","sourceRoot":"","sources":["../../src/core/login-ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8KD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CA8C9B"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Login UI Client Auto-Creation Module
3
+ *
4
+ * Creates an OAuth client for the Login UI during deployment.
5
+ * The Login UI needs its own client_id for SDK integration and
6
+ * OAuth callback handling.
7
+ *
8
+ * Flow:
9
+ * 1. After workers are deployed, Admin API is available
10
+ * 2. Read ADMIN_API_SECRET from keys directory
11
+ * 3. Check if Login UI client already exists
12
+ * 4. Create client via POST /api/admin/clients with Bearer token
13
+ * 5. Return client_id for inclusion in ui.env
14
+ */
15
+ import { readFile } from 'node:fs/promises';
16
+ import { existsSync } from 'node:fs';
17
+ // =============================================================================
18
+ // Constants
19
+ // =============================================================================
20
+ /** Client name used for the Login UI */
21
+ const LOGIN_UI_CLIENT_NAME = 'Login UI';
22
+ // =============================================================================
23
+ // Implementation
24
+ // =============================================================================
25
+ /**
26
+ * Build the redirect URIs for the Login UI client
27
+ */
28
+ function buildRedirectUris(loginUiUrl) {
29
+ // Remove trailing slash
30
+ const baseUrl = loginUiUrl.replace(/\/$/, '');
31
+ return [
32
+ `${baseUrl}/callback`,
33
+ `${baseUrl}/reauth/callback`,
34
+ `${baseUrl}/device/callback`,
35
+ `${baseUrl}/ciba/callback`,
36
+ ];
37
+ }
38
+ /**
39
+ * Read the admin API secret from the keys directory
40
+ */
41
+ async function readAdminApiSecret(secretPath) {
42
+ if (!existsSync(secretPath)) {
43
+ throw new Error(`Admin API secret not found: ${secretPath}`);
44
+ }
45
+ const secret = await readFile(secretPath, 'utf-8');
46
+ return secret.trim();
47
+ }
48
+ /**
49
+ * Check if a Login UI client already exists.
50
+ * Returns client_id and whether migration to public client is needed.
51
+ */
52
+ async function findExistingClient(apiBaseUrl, adminSecret) {
53
+ const response = await fetch(`${apiBaseUrl}/api/admin/clients?search=${encodeURIComponent(LOGIN_UI_CLIENT_NAME)}&limit=10`, {
54
+ method: 'GET',
55
+ headers: {
56
+ Authorization: `Bearer ${adminSecret}`,
57
+ Accept: 'application/json',
58
+ },
59
+ });
60
+ if (!response.ok) {
61
+ return null;
62
+ }
63
+ const data = (await response.json());
64
+ const existing = data.clients?.find((c) => c.client_name === LOGIN_UI_CLIENT_NAME && c.is_trusted === true);
65
+ if (!existing)
66
+ return null;
67
+ return {
68
+ clientId: existing.client_id,
69
+ needsMigration: existing.token_endpoint_auth_method !== 'none' || existing.require_pkce !== true,
70
+ };
71
+ }
72
+ /**
73
+ * Update an existing Login UI client to use public client configuration.
74
+ * Migrates from client_secret_basic to none + require_pkce.
75
+ */
76
+ async function updateClientToPublic(apiBaseUrl, adminSecret, clientId) {
77
+ const response = await fetch(`${apiBaseUrl}/api/admin/clients/${clientId}`, {
78
+ method: 'PUT',
79
+ headers: {
80
+ Authorization: `Bearer ${adminSecret}`,
81
+ 'Content-Type': 'application/json',
82
+ Accept: 'application/json',
83
+ },
84
+ body: JSON.stringify({
85
+ token_endpoint_auth_method: 'none',
86
+ require_pkce: true,
87
+ }),
88
+ });
89
+ if (!response.ok) {
90
+ const errorBody = await response.text().catch(() => 'Unknown error');
91
+ throw new Error(`Failed to update Login UI client to public client (${response.status}): ${errorBody}`);
92
+ }
93
+ }
94
+ /**
95
+ * Create a new Login UI client via Admin API
96
+ */
97
+ async function createClient(apiBaseUrl, adminSecret, loginUiUrl) {
98
+ const redirectUris = buildRedirectUris(loginUiUrl);
99
+ const response = await fetch(`${apiBaseUrl}/api/admin/clients`, {
100
+ method: 'POST',
101
+ headers: {
102
+ Authorization: `Bearer ${adminSecret}`,
103
+ 'Content-Type': 'application/json',
104
+ Accept: 'application/json',
105
+ },
106
+ body: JSON.stringify({
107
+ client_name: LOGIN_UI_CLIENT_NAME,
108
+ redirect_uris: redirectUris,
109
+ grant_types: ['authorization_code'],
110
+ response_types: ['code'],
111
+ scope: 'openid profile email',
112
+ is_trusted: true,
113
+ skip_consent: true,
114
+ token_endpoint_auth_method: 'none',
115
+ require_pkce: true,
116
+ }),
117
+ });
118
+ if (!response.ok) {
119
+ const errorBody = await response.text().catch(() => 'Unknown error');
120
+ throw new Error(`Failed to create Login UI client (${response.status}): ${errorBody}`);
121
+ }
122
+ const data = (await response.json());
123
+ return data.client.client_id;
124
+ }
125
+ /**
126
+ * Ensure a Login UI OAuth client exists, creating one if necessary.
127
+ *
128
+ * This is idempotent: if a client named "Login UI" with is_trusted=true
129
+ * already exists, its client_id is returned without creating a new one.
130
+ */
131
+ export async function ensureLoginUiClient(config) {
132
+ const { apiBaseUrl, loginUiUrl, adminApiSecretPath, onProgress } = config;
133
+ try {
134
+ // Read admin secret
135
+ onProgress?.('Reading admin API secret...');
136
+ const adminSecret = await readAdminApiSecret(adminApiSecretPath);
137
+ // Check for existing client
138
+ onProgress?.('Checking for existing Login UI client...');
139
+ const existingClient = await findExistingClient(apiBaseUrl, adminSecret);
140
+ if (existingClient) {
141
+ if (existingClient.needsMigration) {
142
+ onProgress?.(`Migrating Login UI client to public client: ${existingClient.clientId}`);
143
+ await updateClientToPublic(apiBaseUrl, adminSecret, existingClient.clientId);
144
+ onProgress?.('Login UI client migrated to public client (token_endpoint_auth_method=none, require_pkce=true)');
145
+ }
146
+ else {
147
+ onProgress?.(`Login UI client already exists: ${existingClient.clientId}`);
148
+ }
149
+ return {
150
+ success: true,
151
+ clientId: existingClient.clientId,
152
+ alreadyExists: true,
153
+ };
154
+ }
155
+ // Create new client
156
+ onProgress?.('Creating Login UI OAuth client...');
157
+ const clientId = await createClient(apiBaseUrl, adminSecret, loginUiUrl);
158
+ onProgress?.(`Login UI client created: ${clientId}`);
159
+ return {
160
+ success: true,
161
+ clientId,
162
+ alreadyExists: false,
163
+ };
164
+ }
165
+ catch (error) {
166
+ const message = error instanceof Error ? error.message : String(error);
167
+ return {
168
+ success: false,
169
+ error: message,
170
+ };
171
+ }
172
+ }
173
+ //# sourceMappingURL=login-ui-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-ui-client.js","sourceRoot":"","sources":["../../src/core/login-ui-client.ts"],"names":[],"mappings":"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"}
@@ -92,4 +92,41 @@ export declare function getMigrationStatus(baseDir?: string): {
92
92
  environments: string[];
93
93
  legacyFiles: string[];
94
94
  };
95
+ export interface MigrateKeysToExternalOptions {
96
+ /** Source directory containing .authrim/ or .keys/ */
97
+ sourceDir: string;
98
+ /** Target base directory for external keys (keys go to {keysBaseDir}/.authrim-keys/{env}/) */
99
+ keysBaseDir: string;
100
+ /** Environment name */
101
+ env: string;
102
+ /** Dry run - don't actually copy files */
103
+ dryRun?: boolean;
104
+ /** Progress callback */
105
+ onProgress?: (msg: string) => void;
106
+ }
107
+ export interface MigrateKeysToExternalResult {
108
+ success: boolean;
109
+ /** Source location where keys were found */
110
+ sourceLocation?: 'internal' | 'legacy';
111
+ /** Source path */
112
+ sourcePath?: string;
113
+ /** Destination path */
114
+ destPath?: string;
115
+ /** Files copied */
116
+ files: string[];
117
+ /** Error message if failed */
118
+ error?: string;
119
+ }
120
+ /**
121
+ * Migrate keys from internal/legacy location to external .authrim-keys/{env}/ directory
122
+ *
123
+ * Copies key files from:
124
+ * - {sourceDir}/.authrim/{env}/keys/ (internal), or
125
+ * - {sourceDir}/.keys/{env}/ (legacy)
126
+ *
127
+ * To: {keysBaseDir}/.authrim-keys/{env}/
128
+ *
129
+ * After copy, updates config.json with new secretsPath and storageType.
130
+ */
131
+ export declare function migrateKeysToExternal(options: MigrateKeysToExternalOptions): Promise<MigrateKeysToExternalResult>;
95
132
  //# sourceMappingURL=migrate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAyCH,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,mBAAmB;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,MAAsB,GAAG,OAAO,CAGvE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,MAAsB,GAAG,MAAM,EAAE,CAkClF;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,GAAE,MAAsB,EAC/B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACjC,OAAO,CAAC,YAAY,CAAC,CAqDvB;AAwDD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkF1B;AAwPD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAoE/F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAsB,GAAG;IACnE,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC5C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAuBA"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/core/migrate.ts"],"names":[],"mappings":"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"}
@@ -21,9 +21,9 @@
21
21
  */
22
22
  import { existsSync } from 'node:fs';
23
23
  import { mkdir, copyFile, readFile, writeFile, readdir, rm, chmod } from 'node:fs/promises';
24
- import { join } from 'node:path';
24
+ import { join, resolve } from 'node:path';
25
25
  import { createRequire } from 'node:module';
26
- import { LEGACY_CONFIG_FILE, LEGACY_LOCK_FILE, LEGACY_KEYS_DIR, getEnvironmentPaths, getLegacyPaths, detectStructure, listEnvironments, validateEnvName, } from './paths.js';
26
+ import { LEGACY_CONFIG_FILE, LEGACY_LOCK_FILE, LEGACY_KEYS_DIR, getEnvironmentPaths, getExternalKeysDir, findKeysDirectory, getLegacyPaths, detectStructure, listEnvironments, validateEnvName, } from './paths.js';
27
27
  import { AuthrimConfigSchema } from './config.js';
28
28
  import { AuthrimLockSchema } from './lock.js';
29
29
  import { saveMasterWranglerConfigs } from './wrangler-sync.js';
@@ -546,4 +546,94 @@ export function getMigrationStatus(baseDir = process.cwd()) {
546
546
  legacyFiles,
547
547
  };
548
548
  }
549
+ /**
550
+ * Migrate keys from internal/legacy location to external .authrim-keys/{env}/ directory
551
+ *
552
+ * Copies key files from:
553
+ * - {sourceDir}/.authrim/{env}/keys/ (internal), or
554
+ * - {sourceDir}/.keys/{env}/ (legacy)
555
+ *
556
+ * To: {keysBaseDir}/.authrim-keys/{env}/
557
+ *
558
+ * After copy, updates config.json with new secretsPath and storageType.
559
+ */
560
+ export async function migrateKeysToExternal(options) {
561
+ const { sourceDir, keysBaseDir, env, dryRun = false, onProgress } = options;
562
+ // Security: Validate environment name
563
+ if (!validateEnvName(env)) {
564
+ return {
565
+ success: false,
566
+ files: [],
567
+ error: `Invalid environment name: ${env}`,
568
+ };
569
+ }
570
+ // Security: Validate keysBaseDir to prevent path traversal
571
+ if (keysBaseDir.includes('\0')) {
572
+ return {
573
+ success: false,
574
+ files: [],
575
+ error: 'Invalid keysBaseDir: null bytes not allowed',
576
+ };
577
+ }
578
+ // Find existing keys
579
+ const found = findKeysDirectory({ env, sourceDir });
580
+ if (!found) {
581
+ return {
582
+ success: false,
583
+ files: [],
584
+ error: `No keys found for environment "${env}" in ${sourceDir}`,
585
+ };
586
+ }
587
+ const destDir = getExternalKeysDir(env, keysBaseDir);
588
+ const files = [];
589
+ onProgress?.(`Migrating keys from ${found.path} to ${destDir}`);
590
+ if (!dryRun) {
591
+ // Create destination directory with secure permissions
592
+ await mkdir(destDir, { recursive: true, mode: DIRECTORY_MODE });
593
+ // Copy all key files
594
+ const entries = await readdir(found.path, { withFileTypes: true });
595
+ for (const entry of entries) {
596
+ // Skip symbolic links and directories
597
+ if (entry.isSymbolicLink() || entry.isDirectory()) {
598
+ continue;
599
+ }
600
+ const srcPath = join(found.path, entry.name);
601
+ const destPath = join(destDir, entry.name);
602
+ await copyFile(srcPath, destPath);
603
+ // Set restrictive permissions on sensitive files
604
+ if (isSensitiveFile(entry.name)) {
605
+ await chmod(destPath, SENSITIVE_FILE_MODE);
606
+ }
607
+ files.push(entry.name);
608
+ }
609
+ onProgress?.(` Copied ${files.length} key files`);
610
+ // Update config.json if it exists
611
+ const configPath = getEnvironmentPaths({ baseDir: sourceDir, env }).config;
612
+ if (existsSync(configPath)) {
613
+ try {
614
+ const content = await readFile(configPath, 'utf-8');
615
+ const config = JSON.parse(content);
616
+ if (config.keys) {
617
+ config.keys.secretsPath = resolve(keysBaseDir, '.authrim-keys', env) + '/';
618
+ config.keys.storageType = 'external';
619
+ }
620
+ await writeFile(configPath, JSON.stringify(config, null, 2));
621
+ onProgress?.(' Updated config.json with external keys path');
622
+ }
623
+ catch (error) {
624
+ onProgress?.(` Warning: Could not update config.json: ${error instanceof Error ? error.message : String(error)}`);
625
+ }
626
+ }
627
+ }
628
+ else {
629
+ onProgress?.(` Would copy keys from ${found.path} to ${destDir}`);
630
+ }
631
+ return {
632
+ success: true,
633
+ sourceLocation: found.location === 'legacy' ? 'legacy' : 'internal',
634
+ sourcePath: found.path,
635
+ destPath: destDir,
636
+ files,
637
+ };
638
+ }
549
639
  //# sourceMappingURL=migrate.js.map