@noodleseed/one 0.99.1 → 0.100.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 (170) hide show
  1. package/dist/commands/auth-ops.d.ts.map +1 -1
  2. package/dist/commands/auth-ops.js +6 -1
  3. package/dist/commands/auth-ops.js.map +1 -1
  4. package/dist/commands/auth-service-principals.d.ts +3 -0
  5. package/dist/commands/auth-service-principals.d.ts.map +1 -0
  6. package/dist/commands/auth-service-principals.js +380 -0
  7. package/dist/commands/auth-service-principals.js.map +1 -0
  8. package/dist/commands/catalog-data-auth-discovery.d.ts.map +1 -1
  9. package/dist/commands/catalog-data-auth-discovery.js +187 -2
  10. package/dist/commands/catalog-data-auth-discovery.js.map +1 -1
  11. package/dist/commands/catalog.d.ts.map +1 -1
  12. package/dist/commands/catalog.js +1 -0
  13. package/dist/commands/catalog.js.map +1 -1
  14. package/node_modules/@noodle-borg/auth/dist/index.d.ts +1 -1
  15. package/node_modules/@noodle-borg/auth/dist/index.d.ts.map +1 -1
  16. package/node_modules/@noodle-borg/auth/dist/index.js.map +1 -1
  17. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts +5 -1
  18. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.d.ts.map +1 -1
  19. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js +6 -0
  20. package/node_modules/@noodle-borg/auth/dist/jwt-issuer.js.map +1 -1
  21. package/node_modules/@noodle-borg/auth/dist/verify.d.ts +9 -2
  22. package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -1
  23. package/node_modules/@noodle-borg/auth/dist/verify.js +25 -1
  24. package/node_modules/@noodle-borg/auth/dist/verify.js.map +1 -1
  25. package/node_modules/@noodle-borg/capabilities/dist/index.d.ts.map +1 -1
  26. package/node_modules/@noodle-borg/capabilities/dist/index.js +7 -0
  27. package/node_modules/@noodle-borg/capabilities/dist/index.js.map +1 -1
  28. package/node_modules/@noodle-borg/module/dist/contract.d.ts +1 -1
  29. package/node_modules/@noodle-borg/module/dist/contract.d.ts.map +1 -1
  30. package/node_modules/@noodle-borg/protocol/dist/index.d.ts +1 -0
  31. package/node_modules/@noodle-borg/protocol/dist/index.d.ts.map +1 -1
  32. package/node_modules/@noodle-borg/protocol/dist/index.js +1 -0
  33. package/node_modules/@noodle-borg/protocol/dist/index.js.map +1 -1
  34. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts +2 -0
  35. package/node_modules/@noodle-borg/protocol/dist/sdk-server.d.ts.map +1 -1
  36. package/node_modules/@noodle-borg/protocol/dist/sdk-server.js.map +1 -1
  37. package/node_modules/@noodle-borg/protocol/dist/tool-confirmation.d.ts +6 -0
  38. package/node_modules/@noodle-borg/protocol/dist/tool-confirmation.d.ts.map +1 -0
  39. package/node_modules/@noodle-borg/protocol/dist/tool-confirmation.js +6 -0
  40. package/node_modules/@noodle-borg/protocol/dist/tool-confirmation.js.map +1 -0
  41. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.d.ts +1 -1
  42. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.d.ts.map +1 -1
  43. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.js +2 -2
  44. package/node_modules/@noodle-borg/protocol/dist/tool-interaction.js.map +1 -1
  45. package/node_modules/@noodle-borg/protocol/dist/v2/confirmation.d.ts +1 -1
  46. package/node_modules/@noodle-borg/protocol/dist/v2/confirmation.d.ts.map +1 -1
  47. package/node_modules/@noodle-borg/protocol/dist/v2/confirmation.js +2 -2
  48. package/node_modules/@noodle-borg/protocol/dist/v2/confirmation.js.map +1 -1
  49. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.d.ts.map +1 -1
  50. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js +5 -0
  51. package/node_modules/@noodle-borg/protocol/dist/v2/input-required.js.map +1 -1
  52. package/node_modules/@noodle-borg/protocol/dist/v2/server.d.ts.map +1 -1
  53. package/node_modules/@noodle-borg/protocol/dist/v2/server.js +13 -9
  54. package/node_modules/@noodle-borg/protocol/dist/v2/server.js.map +1 -1
  55. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +1 -1
  56. package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts.map +1 -1
  57. package/node_modules/@noodle-borg/service/dist/index.d.ts +4 -0
  58. package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
  59. package/node_modules/@noodle-borg/service/dist/index.js +4 -0
  60. package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
  61. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts +2 -0
  62. package/node_modules/@noodle-borg/service/dist/oauth/app.d.ts.map +1 -1
  63. package/node_modules/@noodle-borg/service/dist/oauth/app.js +29 -0
  64. package/node_modules/@noodle-borg/service/dist/oauth/app.js.map +1 -1
  65. package/node_modules/@noodle-borg/service/dist/oauth/metadata.d.ts +1 -1
  66. package/node_modules/@noodle-borg/service/dist/oauth/metadata.d.ts.map +1 -1
  67. package/node_modules/@noodle-borg/service/dist/oauth/metadata.js +19 -2
  68. package/node_modules/@noodle-borg/service/dist/oauth/metadata.js.map +1 -1
  69. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.d.ts.map +1 -1
  70. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.js +3 -1
  71. package/node_modules/@noodle-borg/service/dist/oauth/platform-principal-guard.js.map +1 -1
  72. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts +5 -0
  73. package/node_modules/@noodle-borg/service/dist/oauth/provider.d.ts.map +1 -1
  74. package/node_modules/@noodle-borg/service/dist/oauth/provider.js +11 -1
  75. package/node_modules/@noodle-borg/service/dist/oauth/provider.js.map +1 -1
  76. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts +8 -1
  77. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
  78. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +60 -0
  79. package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
  80. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-client-auth.d.ts +22 -0
  81. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-client-auth.d.ts.map +1 -0
  82. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-client-auth.js +199 -0
  83. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-client-auth.js.map +1 -0
  84. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-credentials.d.ts +14 -0
  85. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-credentials.d.ts.map +1 -0
  86. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-credentials.js +119 -0
  87. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-credentials.js.map +1 -0
  88. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-guard.d.ts +16 -0
  89. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-guard.d.ts.map +1 -0
  90. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-guard.js +34 -0
  91. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-guard.js.map +1 -0
  92. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-resource.d.ts +14 -0
  93. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-resource.d.ts.map +1 -0
  94. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-resource.js +53 -0
  95. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-resource.js.map +1 -0
  96. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres-schema.d.ts +4 -0
  97. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres-schema.d.ts.map +1 -0
  98. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres-schema.js +98 -0
  99. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres-schema.js.map +1 -0
  100. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres.d.ts +22 -0
  101. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres.d.ts.map +1 -0
  102. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres.js +359 -0
  103. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store-postgres.js.map +1 -0
  104. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store.d.ts +165 -0
  105. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store.d.ts.map +1 -0
  106. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store.js +349 -0
  107. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-store.js.map +1 -0
  108. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-handler.d.ts +20 -0
  109. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-handler.d.ts.map +1 -0
  110. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-handler.js +175 -0
  111. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-handler.js.map +1 -0
  112. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-issuer.d.ts +12 -0
  113. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-issuer.d.ts.map +1 -0
  114. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-issuer.js +20 -0
  115. package/node_modules/@noodle-borg/service/dist/oauth/service-principal-token-issuer.js.map +1 -0
  116. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.d.ts +9 -3
  117. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.d.ts.map +1 -1
  118. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.js +6 -0
  119. package/node_modules/@noodle-borg/service/dist/oauth/token-issuer.js.map +1 -1
  120. package/node_modules/@noodle-borg/service/dist/options.d.ts +5 -0
  121. package/node_modules/@noodle-borg/service/dist/options.d.ts.map +1 -1
  122. package/node_modules/@noodle-borg/service/dist/routes/service-principal-contracts.d.ts +24 -0
  123. package/node_modules/@noodle-borg/service/dist/routes/service-principal-contracts.d.ts.map +1 -0
  124. package/node_modules/@noodle-borg/service/dist/routes/service-principal-contracts.js +55 -0
  125. package/node_modules/@noodle-borg/service/dist/routes/service-principal-contracts.js.map +1 -0
  126. package/node_modules/@noodle-borg/service/dist/routes/service-principal-paths.d.ts +29 -0
  127. package/node_modules/@noodle-borg/service/dist/routes/service-principal-paths.d.ts.map +1 -0
  128. package/node_modules/@noodle-borg/service/dist/routes/service-principal-paths.js +63 -0
  129. package/node_modules/@noodle-borg/service/dist/routes/service-principal-paths.js.map +1 -0
  130. package/node_modules/@noodle-borg/service/dist/routes/service-principals-dispatch.d.ts +27 -0
  131. package/node_modules/@noodle-borg/service/dist/routes/service-principals-dispatch.d.ts.map +1 -0
  132. package/node_modules/@noodle-borg/service/dist/routes/service-principals-dispatch.js +33 -0
  133. package/node_modules/@noodle-borg/service/dist/routes/service-principals-dispatch.js.map +1 -0
  134. package/node_modules/@noodle-borg/service/dist/routes/service-principals.d.ts +17 -0
  135. package/node_modules/@noodle-borg/service/dist/routes/service-principals.d.ts.map +1 -0
  136. package/node_modules/@noodle-borg/service/dist/routes/service-principals.js +203 -0
  137. package/node_modules/@noodle-borg/service/dist/routes/service-principals.js.map +1 -0
  138. package/node_modules/@noodle-borg/service/dist/serve.d.ts.map +1 -1
  139. package/node_modules/@noodle-borg/service/dist/serve.js +4 -1
  140. package/node_modules/@noodle-borg/service/dist/serve.js.map +1 -1
  141. package/node_modules/@noodle-borg/service/dist/service-principal-data-plane.d.ts +12 -0
  142. package/node_modules/@noodle-borg/service/dist/service-principal-data-plane.d.ts.map +1 -0
  143. package/node_modules/@noodle-borg/service/dist/service-principal-data-plane.js +71 -0
  144. package/node_modules/@noodle-borg/service/dist/service-principal-data-plane.js.map +1 -0
  145. package/node_modules/@noodle-borg/service/dist/service.d.ts +1 -3
  146. package/node_modules/@noodle-borg/service/dist/service.d.ts.map +1 -1
  147. package/node_modules/@noodle-borg/service/dist/service.js +8 -4
  148. package/node_modules/@noodle-borg/service/dist/service.js.map +1 -1
  149. package/node_modules/@noodle-borg/service/package.json +1 -0
  150. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts +5 -0
  151. package/node_modules/@noodle-borg/transport-http/dist/handler.d.ts.map +1 -1
  152. package/node_modules/@noodle-borg/transport-http/dist/handler.js +4 -0
  153. package/node_modules/@noodle-borg/transport-http/dist/handler.js.map +1 -1
  154. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.d.ts +5 -0
  155. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.d.ts.map +1 -1
  156. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.js +16 -0
  157. package/node_modules/@noodle-borg/transport-http/dist/identity-authorization.js.map +1 -1
  158. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts +2 -0
  159. package/node_modules/@noodle-borg/transport-http/dist/index.d.ts.map +1 -1
  160. package/node_modules/@noodle-borg/transport-http/dist/index.js +1 -0
  161. package/node_modules/@noodle-borg/transport-http/dist/index.js.map +1 -1
  162. package/node_modules/@noodle-borg/transport-http/dist/serve-request.d.ts +3 -0
  163. package/node_modules/@noodle-borg/transport-http/dist/serve-request.d.ts.map +1 -1
  164. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js +56 -2
  165. package/node_modules/@noodle-borg/transport-http/dist/serve-request.js.map +1 -1
  166. package/node_modules/@noodle-borg/transport-http/dist/service-principal-authorization.d.ts +31 -0
  167. package/node_modules/@noodle-borg/transport-http/dist/service-principal-authorization.d.ts.map +1 -0
  168. package/node_modules/@noodle-borg/transport-http/dist/service-principal-authorization.js +51 -0
  169. package/node_modules/@noodle-borg/transport-http/dist/service-principal-authorization.js.map +1 -0
  170. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-principal-store-postgres.d.ts","sourceRoot":"","sources":["../../src/oauth/service-principal-store-postgres.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAG3C,OAAO,EACL,KAAK,4BAA4B,EAEjC,KAAK,iBAAiB,EACtB,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAEvB,KAAK,aAAa,EAGlB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAEjB,KAAK,6BAA6B,EAClC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAK1B,MAAM,8BAA8B,CAAC;AAgDtC,6FAA6F;AAC7F,qBAAa,6BAA8B,YAAW,qBAAqB;;gBAI7D,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;KAAO;IAK7D,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,eAAe,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkBpF,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC;IAUvE,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IA4B5E,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB3D,WAAW,CAAC,KAAK,EAAE,gCAAgC,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAyC1F,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBnD,gBAAgB,CACpB,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,gCAAgC,CAAC;IA0DtC,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB7D,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,4BAA4B,GAAG,SAAS,CAAC;IA0C9C,qBAAqB,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B7E,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;CAqCtE"}
@@ -0,0 +1,359 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { validateSlug } from '../store/validate.js';
3
+ import { validatePublicJwk } from './service-principal-credentials.js';
4
+ import { currentServicePrincipalDate, normalizeServicePrincipalExpiry, normalizeServicePrincipalScopes, publicServicePrincipalCredential, validateServicePrincipalActor, validateServicePrincipalDisplayName, validateServicePrincipalEpoch, validateServicePrincipalSecretDigest, } from './service-principal-store.js';
5
+ import { ensureServicePrincipalSchema } from './service-principal-store-postgres-schema.js';
6
+ /** Durable, organization-isolated service-principal lifecycle and assertion replay store. */
7
+ export class PostgresServicePrincipalStore {
8
+ #pool;
9
+ #now;
10
+ constructor(pool, options = {}) {
11
+ this.#pool = pool;
12
+ this.#now = options.now ?? (() => new Date());
13
+ }
14
+ async ensureSchema() {
15
+ await ensureServicePrincipalSchema(this.#pool);
16
+ }
17
+ async createPrincipal(input) {
18
+ const now = currentServicePrincipalDate(this.#now);
19
+ const values = {
20
+ principalId: `spn_${randomUUID()}`,
21
+ org: validateSlug('org', input.org),
22
+ name: validateServicePrincipalDisplayName('service-principal name', input.name),
23
+ actor: validateServicePrincipalActor(input.actorSubject),
24
+ };
25
+ const { rows } = await this.#pool.query(`INSERT INTO oauth_service_principals
26
+ (principal_id, org_slug, name, status, created_by_subject, created_at, updated_at)
27
+ VALUES ($1, $2, $3, 'active', $4, $5, $5)
28
+ RETURNING *`, [values.principalId, values.org, values.name, values.actor, now]);
29
+ return principalFromRow(requireRow(rows[0], 'service-principal create'));
30
+ }
31
+ async listPrincipals(org) {
32
+ const normalizedOrg = validateSlug('org', org);
33
+ const { rows } = await this.#pool.query(`SELECT * FROM oauth_service_principals
34
+ WHERE org_slug = $1 ORDER BY principal_id`, [normalizedOrg]);
35
+ return rows.map(principalFromRow);
36
+ }
37
+ async getPrincipal(input) {
38
+ const org = validateSlug('org', input.org);
39
+ const { rows } = await this.#pool.query(`SELECT * FROM oauth_service_principals
40
+ WHERE principal_id = $1 AND org_slug = $2`, [input.principalId, org]);
41
+ const principal = rows[0];
42
+ if (principal === undefined)
43
+ return undefined;
44
+ const [grants, credentials] = await Promise.all([
45
+ this.#pool.query(`SELECT * FROM oauth_service_principal_grants
46
+ WHERE principal_id = $1 ORDER BY grant_id`, [input.principalId]),
47
+ this.#pool.query(`SELECT * FROM oauth_service_principal_credentials
48
+ WHERE principal_id = $1 ORDER BY credential_id`, [input.principalId]),
49
+ ]);
50
+ return {
51
+ principal: principalFromRow(principal),
52
+ grants: grants.rows.map(grantFromRow),
53
+ credentials: credentials.rows.map(credentialFromRow).map(publicServicePrincipalCredential),
54
+ };
55
+ }
56
+ async revokePrincipal(input) {
57
+ const org = validateSlug('org', input.org);
58
+ const actor = validateServicePrincipalActor(input.actorSubject);
59
+ const now = currentServicePrincipalDate(this.#now);
60
+ const { rows } = await this.#pool.query(`UPDATE oauth_service_principals SET
61
+ status = 'revoked', updated_at = CASE WHEN status = 'active' THEN $3 ELSE updated_at END,
62
+ revoked_at = COALESCE(revoked_at, $3),
63
+ revoked_by_subject = COALESCE(revoked_by_subject, $4)
64
+ WHERE principal_id = $1 AND org_slug = $2
65
+ RETURNING *`, [input.principalId, org, now, actor]);
66
+ return rows[0] !== undefined;
67
+ }
68
+ async createGrant(input) {
69
+ const org = validateSlug('org', input.org);
70
+ const app = validateSlug('app', input.app);
71
+ const environment = validateSlug('env', input.environment);
72
+ const scopes = normalizeServicePrincipalScopes(input.scopes);
73
+ const actor = validateServicePrincipalActor(input.actorSubject);
74
+ const now = currentServicePrincipalDate(this.#now);
75
+ return this.#transaction(async (client) => {
76
+ await requireActivePrincipal(client, input.principalId, org);
77
+ const existing = await client.query(`SELECT 1 FROM oauth_service_principal_grants
78
+ WHERE principal_id = $1 AND app_slug = $2 AND environment = $3 AND status = 'active'`, [input.principalId, app, environment]);
79
+ if (existing.rowCount !== 0) {
80
+ throw new Error('service principal already has an active grant for this app and environment');
81
+ }
82
+ try {
83
+ const { rows } = await client.query(`INSERT INTO oauth_service_principal_grants
84
+ (grant_id, principal_id, org_slug, app_slug, environment, scopes, status,
85
+ created_by_subject, created_at, updated_at)
86
+ VALUES ($1, $2, $3, $4, $5, $6, 'active', $7, $8, $8)
87
+ RETURNING *`, [`spg_${randomUUID()}`, input.principalId, org, app, environment, scopes, actor, now]);
88
+ return grantFromRow(requireRow(rows[0], 'service-principal grant create'));
89
+ }
90
+ catch (error) {
91
+ if (isUniqueViolation(error)) {
92
+ throw new Error('service principal already has an active grant for this app and environment', { cause: error });
93
+ }
94
+ throw error;
95
+ }
96
+ });
97
+ }
98
+ async revokeGrant(input) {
99
+ const org = validateSlug('org', input.org);
100
+ const actor = validateServicePrincipalActor(input.actorSubject);
101
+ const now = currentServicePrincipalDate(this.#now);
102
+ return this.#transaction(async (client) => {
103
+ const principal = await ownedPrincipal(client, input.principalId, org, true);
104
+ if (principal === undefined)
105
+ return false;
106
+ const { rows } = await client.query(`UPDATE oauth_service_principal_grants SET
107
+ status = 'revoked', updated_at = CASE WHEN status = 'active' THEN $3 ELSE updated_at END,
108
+ revoked_at = COALESCE(revoked_at, $3),
109
+ revoked_by_subject = COALESCE(revoked_by_subject, $4)
110
+ WHERE grant_id = $1 AND principal_id = $2
111
+ RETURNING *`, [input.grantId, input.principalId, now, actor]);
112
+ return rows[0] !== undefined;
113
+ });
114
+ }
115
+ async createCredential(input) {
116
+ const org = validateSlug('org', input.org);
117
+ const actor = validateServicePrincipalActor(input.actorSubject);
118
+ const label = validateServicePrincipalDisplayName('credential label', input.label);
119
+ const now = currentServicePrincipalDate(this.#now);
120
+ const expiresAt = normalizeServicePrincipalExpiry(input.expiresAt, now);
121
+ const material = input.kind === 'client_secret'
122
+ ? {
123
+ algorithm: null,
124
+ kid: null,
125
+ publicJwk: null,
126
+ secretDigest: validateServicePrincipalSecretDigest(input.secretDigest),
127
+ }
128
+ : await validatePublicJwk(input.publicJwk, input.algorithm).then((validated) => ({
129
+ algorithm: validated.algorithm,
130
+ kid: typeof validated.publicJwk.kid === 'string' ? validated.publicJwk.kid : null,
131
+ publicJwk: validated.publicJwk,
132
+ secretDigest: null,
133
+ }));
134
+ return this.#transaction(async (client) => {
135
+ await requireActivePrincipal(client, input.principalId, org);
136
+ const { rows: counts } = await client.query(`SELECT count(*)::text AS count FROM oauth_service_principal_credentials
137
+ WHERE principal_id = $1 AND kind = $2 AND status = 'active'
138
+ AND (expires_at IS NULL OR expires_at > $3)`, [input.principalId, input.kind, now]);
139
+ if (Number(requireRow(counts[0], 'service-principal credential count').count) >= 5) {
140
+ throw new Error(`service principal may have at most five active ${input.kind} credentials`);
141
+ }
142
+ const { rows } = await client.query(`INSERT INTO oauth_service_principal_credentials
143
+ (credential_id, principal_id, org_slug, kind, label, algorithm, kid, public_jwk,
144
+ secret_digest, status, created_by_subject, created_at, updated_at, expires_at)
145
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, 'active', $10, $11, $11, $12)
146
+ RETURNING *`, [
147
+ `spc_${randomUUID()}`,
148
+ input.principalId,
149
+ org,
150
+ input.kind,
151
+ label,
152
+ material.algorithm,
153
+ material.kid,
154
+ material.publicJwk,
155
+ material.secretDigest,
156
+ actor,
157
+ now,
158
+ expiresAt ?? null,
159
+ ]);
160
+ return publicServicePrincipalCredential(credentialFromRow(requireRow(rows[0], 'service-principal credential create')));
161
+ });
162
+ }
163
+ async revokeCredential(input) {
164
+ const org = validateSlug('org', input.org);
165
+ const actor = validateServicePrincipalActor(input.actorSubject);
166
+ const now = currentServicePrincipalDate(this.#now);
167
+ return this.#transaction(async (client) => {
168
+ const principal = await ownedPrincipal(client, input.principalId, org, true);
169
+ if (principal === undefined)
170
+ return false;
171
+ const { rows } = await client.query(`UPDATE oauth_service_principal_credentials SET
172
+ status = 'revoked', updated_at = CASE WHEN status = 'active' THEN $3 ELSE updated_at END,
173
+ revoked_at = COALESCE(revoked_at, $3),
174
+ revoked_by_subject = COALESCE(revoked_by_subject, $4)
175
+ WHERE credential_id = $1 AND principal_id = $2
176
+ RETURNING *`, [input.credentialId, input.principalId, now, actor]);
177
+ return rows[0] !== undefined;
178
+ });
179
+ }
180
+ async loadActiveClient(clientId, now) {
181
+ validateServicePrincipalEpoch('authorization time', now);
182
+ const client = await this.#pool.connect();
183
+ try {
184
+ await client.query('BEGIN ISOLATION LEVEL REPEATABLE READ READ ONLY');
185
+ const { rows } = await client.query(`SELECT * FROM oauth_service_principals
186
+ WHERE principal_id = $1 AND status = 'active'`, [clientId]);
187
+ const principal = rows[0];
188
+ if (principal === undefined) {
189
+ await client.query('COMMIT');
190
+ return undefined;
191
+ }
192
+ const [grants, credentials] = await Promise.all([
193
+ client.query(`SELECT * FROM oauth_service_principal_grants
194
+ WHERE principal_id = $1 AND status = 'active' ORDER BY grant_id`, [clientId]),
195
+ client.query(`SELECT * FROM oauth_service_principal_credentials
196
+ WHERE principal_id = $1 AND status = 'active'
197
+ AND (expires_at IS NULL OR expires_at > $2) ORDER BY credential_id`, [clientId, new Date(now)]),
198
+ ]);
199
+ await client.query('COMMIT');
200
+ return {
201
+ principal: principalFromRow(principal),
202
+ grants: grants.rows.map(grantFromRow),
203
+ credentials: credentials.rows.map(credentialFromRow),
204
+ };
205
+ }
206
+ catch (error) {
207
+ await rollbackQuietly(client);
208
+ throw error;
209
+ }
210
+ finally {
211
+ client.release();
212
+ }
213
+ }
214
+ async validateAccessBinding(input) {
215
+ validateServicePrincipalEpoch('authorization time', input.now);
216
+ const { rowCount } = await this.#pool.query(`SELECT 1
217
+ FROM oauth_service_principals p
218
+ JOIN oauth_service_principal_grants g
219
+ ON g.principal_id = p.principal_id AND g.org_slug = p.org_slug
220
+ JOIN oauth_service_principal_credentials c
221
+ ON c.principal_id = p.principal_id AND c.org_slug = p.org_slug
222
+ WHERE p.principal_id = $1 AND p.org_slug = $2 AND p.status = 'active'
223
+ AND g.grant_id = $3 AND g.app_slug = $4 AND g.environment = $5 AND g.status = 'active'
224
+ AND c.credential_id = $6 AND c.status = 'active'
225
+ AND (c.expires_at IS NULL OR c.expires_at > $7)`, [
226
+ input.principalId,
227
+ input.org,
228
+ input.grantId,
229
+ input.app,
230
+ input.environment,
231
+ input.credentialId,
232
+ new Date(input.now),
233
+ ]);
234
+ return rowCount === 1;
235
+ }
236
+ async consumeAssertionJti(input) {
237
+ validateServicePrincipalEpoch('assertion time', input.now);
238
+ validateServicePrincipalEpoch('assertion expiry', input.expiresAt);
239
+ if (input.expiresAt <= input.now)
240
+ throw new Error('assertion expiry must be in the future');
241
+ if (input.jti.length < 1 || input.jti.length > 200) {
242
+ throw new Error('assertion jti must be between 1 and 200 characters');
243
+ }
244
+ return this.#transaction(async (client) => {
245
+ await client.query('DELETE FROM oauth_client_assertion_nonces WHERE expires_at <= $1', [
246
+ new Date(input.now),
247
+ ]);
248
+ const result = await client.query(`INSERT INTO oauth_client_assertion_nonces
249
+ (credential_id, jti, expires_at, created_at)
250
+ VALUES ($1, $2, $3, $4)
251
+ ON CONFLICT (credential_id, jti) DO NOTHING
252
+ RETURNING credential_id`, [input.credentialId, input.jti, new Date(input.expiresAt), new Date(input.now)]);
253
+ return result.rowCount === 1;
254
+ });
255
+ }
256
+ async #transaction(work) {
257
+ const client = await this.#pool.connect();
258
+ try {
259
+ await client.query('BEGIN');
260
+ const result = await work(client);
261
+ await client.query('COMMIT');
262
+ return result;
263
+ }
264
+ catch (error) {
265
+ await rollbackQuietly(client);
266
+ throw error;
267
+ }
268
+ finally {
269
+ client.release();
270
+ }
271
+ }
272
+ }
273
+ async function ownedPrincipal(client, principalId, org, strict) {
274
+ const { rows } = await client.query('SELECT * FROM oauth_service_principals WHERE principal_id = $1 FOR UPDATE', [principalId]);
275
+ const principal = rows[0];
276
+ if (principal === undefined || principal.org_slug === org)
277
+ return principal;
278
+ if (strict)
279
+ throw new Error('service principal belongs to a different organization');
280
+ return undefined;
281
+ }
282
+ async function requireActivePrincipal(client, principalId, org) {
283
+ const principal = await ownedPrincipal(client, principalId, org, true);
284
+ if (principal === undefined)
285
+ throw new Error('service principal does not exist');
286
+ if (principal.status !== 'active')
287
+ throw new Error('service principal is revoked');
288
+ return principal;
289
+ }
290
+ function principalFromRow(row) {
291
+ return {
292
+ principalId: row.principal_id,
293
+ org: row.org_slug,
294
+ name: row.name,
295
+ status: row.status,
296
+ createdBySubject: row.created_by_subject,
297
+ createdAt: row.created_at.toISOString(),
298
+ updatedAt: row.updated_at.toISOString(),
299
+ ...(row.revoked_at === null ? {} : { revokedAt: row.revoked_at.toISOString() }),
300
+ ...(row.revoked_by_subject === null ? {} : { revokedBySubject: row.revoked_by_subject }),
301
+ };
302
+ }
303
+ function grantFromRow(row) {
304
+ return {
305
+ grantId: row.grant_id,
306
+ principalId: row.principal_id,
307
+ org: row.org_slug,
308
+ app: row.app_slug,
309
+ environment: row.environment,
310
+ scopes: Object.freeze([...row.scopes]),
311
+ status: row.status,
312
+ createdBySubject: row.created_by_subject,
313
+ createdAt: row.created_at.toISOString(),
314
+ updatedAt: row.updated_at.toISOString(),
315
+ ...(row.revoked_at === null ? {} : { revokedAt: row.revoked_at.toISOString() }),
316
+ ...(row.revoked_by_subject === null ? {} : { revokedBySubject: row.revoked_by_subject }),
317
+ };
318
+ }
319
+ function credentialFromRow(row) {
320
+ const lifecycle = {
321
+ credentialId: row.credential_id,
322
+ principalId: row.principal_id,
323
+ label: row.label,
324
+ status: row.status,
325
+ createdBySubject: row.created_by_subject,
326
+ createdAt: row.created_at.toISOString(),
327
+ updatedAt: row.updated_at.toISOString(),
328
+ ...(row.expires_at === null ? {} : { expiresAt: row.expires_at.toISOString() }),
329
+ ...(row.revoked_at === null ? {} : { revokedAt: row.revoked_at.toISOString() }),
330
+ ...(row.revoked_by_subject === null ? {} : { revokedBySubject: row.revoked_by_subject }),
331
+ };
332
+ if (row.kind === 'client_secret') {
333
+ if (row.secret_digest === null)
334
+ throw new Error('stored client secret is missing its digest');
335
+ return { ...lifecycle, kind: 'client_secret', secretDigest: row.secret_digest };
336
+ }
337
+ if (row.algorithm === null || row.public_jwk === null) {
338
+ throw new Error('stored public-key credential is missing its signing material');
339
+ }
340
+ return {
341
+ ...lifecycle,
342
+ kind: 'public_jwk',
343
+ algorithm: row.algorithm,
344
+ publicJwk: structuredClone(row.public_jwk),
345
+ ...(row.kid === null ? {} : { kid: row.kid }),
346
+ };
347
+ }
348
+ function requireRow(row, label) {
349
+ if (row === undefined)
350
+ throw new Error(`${label} returned no row`);
351
+ return row;
352
+ }
353
+ function isUniqueViolation(error) {
354
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === '23505';
355
+ }
356
+ async function rollbackQuietly(client) {
357
+ await client.query('ROLLBACK').catch(() => undefined);
358
+ }
359
+ //# sourceMappingURL=service-principal-store-postgres.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-principal-store-postgres.js","sourceRoot":"","sources":["../../src/oauth/service-principal-store-postgres.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import { type ServicePrincipalSigningAlgorithm } from './service-principal-credentials.js';
2
+ export type ServicePrincipalStatus = 'active' | 'revoked';
3
+ export type ServicePrincipalCredentialKind = 'public_jwk' | 'client_secret';
4
+ export interface ServicePrincipalRecord {
5
+ readonly principalId: string;
6
+ readonly org: string;
7
+ readonly name: string;
8
+ readonly status: ServicePrincipalStatus;
9
+ readonly createdBySubject: string;
10
+ readonly createdAt: string;
11
+ readonly updatedAt: string;
12
+ readonly revokedAt?: string;
13
+ readonly revokedBySubject?: string;
14
+ }
15
+ export interface ServicePrincipalGrantRecord {
16
+ readonly grantId: string;
17
+ readonly principalId: string;
18
+ readonly org: string;
19
+ readonly app: string;
20
+ readonly environment: string;
21
+ readonly scopes: readonly string[];
22
+ readonly status: ServicePrincipalStatus;
23
+ readonly createdBySubject: string;
24
+ readonly createdAt: string;
25
+ readonly updatedAt: string;
26
+ readonly revokedAt?: string;
27
+ readonly revokedBySubject?: string;
28
+ }
29
+ interface ServicePrincipalCredentialBase {
30
+ readonly credentialId: string;
31
+ readonly principalId: string;
32
+ readonly kind: ServicePrincipalCredentialKind;
33
+ readonly label: string;
34
+ readonly status: ServicePrincipalStatus;
35
+ readonly createdBySubject: string;
36
+ readonly createdAt: string;
37
+ readonly updatedAt: string;
38
+ readonly expiresAt?: string;
39
+ readonly revokedAt?: string;
40
+ readonly revokedBySubject?: string;
41
+ }
42
+ export type ServicePrincipalCredentialRecord = (ServicePrincipalCredentialBase & {
43
+ readonly kind: 'client_secret';
44
+ }) | (ServicePrincipalCredentialBase & {
45
+ readonly kind: 'public_jwk';
46
+ readonly algorithm: ServicePrincipalSigningAlgorithm;
47
+ readonly kid?: string;
48
+ });
49
+ export interface ServicePrincipalView {
50
+ readonly principal: ServicePrincipalRecord;
51
+ readonly grants: readonly ServicePrincipalGrantRecord[];
52
+ readonly credentials: readonly ServicePrincipalCredentialRecord[];
53
+ }
54
+ export type ActiveServicePrincipalCredential = (ServicePrincipalCredentialRecord & {
55
+ readonly kind: 'client_secret';
56
+ readonly secretDigest: string;
57
+ }) | (ServicePrincipalCredentialRecord & {
58
+ readonly kind: 'public_jwk';
59
+ readonly algorithm: ServicePrincipalSigningAlgorithm;
60
+ readonly publicJwk: Readonly<Record<string, unknown>>;
61
+ });
62
+ export interface ActiveServicePrincipalClient {
63
+ readonly principal: ServicePrincipalRecord;
64
+ readonly grants: readonly ServicePrincipalGrantRecord[];
65
+ readonly credentials: readonly ActiveServicePrincipalCredential[];
66
+ }
67
+ export interface CreateServicePrincipalInput {
68
+ readonly org: string;
69
+ readonly name: string;
70
+ readonly actorSubject: string;
71
+ }
72
+ export interface PrincipalRef {
73
+ readonly principalId: string;
74
+ readonly org: string;
75
+ }
76
+ export interface PrincipalMutation extends PrincipalRef {
77
+ readonly actorSubject: string;
78
+ }
79
+ export interface CreateServicePrincipalGrantInput extends PrincipalMutation {
80
+ readonly app: string;
81
+ readonly environment: string;
82
+ readonly scopes: readonly string[];
83
+ }
84
+ export interface GrantMutation extends PrincipalMutation {
85
+ readonly grantId: string;
86
+ }
87
+ interface CreateCredentialBase extends PrincipalMutation {
88
+ readonly label: string;
89
+ readonly expiresAt?: string;
90
+ }
91
+ export type CreateStoredCredentialInput = (CreateCredentialBase & {
92
+ readonly kind: 'client_secret';
93
+ readonly secretDigest: string;
94
+ }) | (CreateCredentialBase & {
95
+ readonly kind: 'public_jwk';
96
+ readonly algorithm: ServicePrincipalSigningAlgorithm;
97
+ readonly publicJwk: unknown;
98
+ });
99
+ export interface CredentialMutation extends PrincipalMutation {
100
+ readonly credentialId: string;
101
+ }
102
+ export interface ServicePrincipalAccessBinding {
103
+ readonly principalId: string;
104
+ readonly grantId: string;
105
+ readonly credentialId: string;
106
+ readonly org: string;
107
+ readonly app: string;
108
+ readonly environment: string;
109
+ readonly now: number;
110
+ }
111
+ export interface AssertionJtiInput {
112
+ readonly credentialId: string;
113
+ readonly jti: string;
114
+ readonly expiresAt: number;
115
+ readonly now: number;
116
+ }
117
+ export interface ServicePrincipalStore {
118
+ createPrincipal(input: CreateServicePrincipalInput): Promise<ServicePrincipalRecord>;
119
+ listPrincipals(org: string): Promise<readonly ServicePrincipalRecord[]>;
120
+ getPrincipal(input: PrincipalRef): Promise<ServicePrincipalView | undefined>;
121
+ revokePrincipal(input: PrincipalMutation): Promise<boolean>;
122
+ createGrant(input: CreateServicePrincipalGrantInput): Promise<ServicePrincipalGrantRecord>;
123
+ revokeGrant(input: GrantMutation): Promise<boolean>;
124
+ createCredential(input: CreateStoredCredentialInput): Promise<ServicePrincipalCredentialRecord>;
125
+ revokeCredential(input: CredentialMutation): Promise<boolean>;
126
+ loadActiveClient(clientId: string, now: number): Promise<ActiveServicePrincipalClient | undefined>;
127
+ validateAccessBinding(input: ServicePrincipalAccessBinding): Promise<boolean>;
128
+ consumeAssertionJti(input: AssertionJtiInput): Promise<boolean>;
129
+ }
130
+ export type ServicePrincipalRuntime = {
131
+ readonly ready: true;
132
+ readonly store: ServicePrincipalStore;
133
+ } | {
134
+ readonly ready: false;
135
+ readonly reason: 'schema_unavailable';
136
+ };
137
+ export declare class InMemoryServicePrincipalStore implements ServicePrincipalStore {
138
+ #private;
139
+ constructor(options?: {
140
+ readonly now?: () => Date;
141
+ });
142
+ createPrincipal(input: CreateServicePrincipalInput): Promise<ServicePrincipalRecord>;
143
+ listPrincipals(org: string): Promise<readonly ServicePrincipalRecord[]>;
144
+ getPrincipal(input: PrincipalRef): Promise<ServicePrincipalView | undefined>;
145
+ revokePrincipal(input: PrincipalMutation): Promise<boolean>;
146
+ createGrant(input: CreateServicePrincipalGrantInput): Promise<ServicePrincipalGrantRecord>;
147
+ revokeGrant(input: GrantMutation): Promise<boolean>;
148
+ createCredential(input: CreateStoredCredentialInput): Promise<ServicePrincipalCredentialRecord>;
149
+ revokeCredential(input: CredentialMutation): Promise<boolean>;
150
+ loadActiveClient(clientId: string, now: number): Promise<ActiveServicePrincipalClient | undefined>;
151
+ validateAccessBinding(input: ServicePrincipalAccessBinding): Promise<boolean>;
152
+ consumeAssertionJti(input: AssertionJtiInput): Promise<boolean>;
153
+ }
154
+ export declare function publicServicePrincipalCredential(credential: ActiveServicePrincipalCredential): ServicePrincipalCredentialRecord;
155
+ export declare function normalizeServicePrincipalScopes(values: readonly string[]): readonly string[];
156
+ export declare function validateServicePrincipalDisplayName(label: string, value: string): string;
157
+ export declare function validateServicePrincipalActor(value: string): string;
158
+ export declare function validateServicePrincipalSecretDigest(value: string): string;
159
+ export declare function normalizeServicePrincipalExpiry(value: string | undefined, now: Date): string | undefined;
160
+ export declare function servicePrincipalCredentialIsActive(credential: ActiveServicePrincipalCredential, now: number): boolean;
161
+ export declare function currentServicePrincipalDate(now: () => Date): Date;
162
+ export declare function currentServicePrincipalTimestamp(now: () => Date): string;
163
+ export declare function validateServicePrincipalEpoch(label: string, value: number): void;
164
+ export {};
165
+ //# sourceMappingURL=service-principal-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-principal-store.d.ts","sourceRoot":"","sources":["../../src/oauth/service-principal-store.ts"],"names":[],"mappings":"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"}