@ibgib/node-gib 0.0.14 → 0.0.17

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 (218) hide show
  1. package/data/identity_index/email/hashes/32/13/49/e64f32730f01a61ada211f29eaf0a210fc2386b668ad04d7e8a9b16766.json +4 -0
  2. package/dist/email/email-helpers.d.mts.map +1 -1
  3. package/dist/email/email-helpers.mjs.map +1 -1
  4. package/dist/email/index.d.mts +3 -0
  5. package/dist/email/index.d.mts.map +1 -1
  6. package/dist/email/index.mjs +3 -0
  7. package/dist/email/index.mjs.map +1 -1
  8. package/dist/email/verify/email-verify-constants.d.mts +3 -0
  9. package/dist/email/verify/email-verify-constants.d.mts.map +1 -0
  10. package/dist/email/verify/email-verify-constants.mjs +3 -0
  11. package/dist/email/verify/email-verify-constants.mjs.map +1 -0
  12. package/dist/email/verify/email-verify-helpers.d.mts +107 -0
  13. package/dist/email/verify/email-verify-helpers.d.mts.map +1 -0
  14. package/dist/email/verify/email-verify-helpers.mjs +357 -0
  15. package/dist/email/verify/email-verify-helpers.mjs.map +1 -0
  16. package/dist/email/verify/email-verify-types.d.mts +41 -0
  17. package/dist/email/verify/email-verify-types.d.mts.map +1 -0
  18. package/dist/email/verify/email-verify-types.mjs +2 -0
  19. package/dist/email/verify/email-verify-types.mjs.map +1 -0
  20. package/dist/identity/sso/custodian-auth-helpers.d.mts +45 -0
  21. package/dist/identity/sso/custodian-auth-helpers.d.mts.map +1 -0
  22. package/dist/identity/sso/custodian-auth-helpers.mjs +108 -0
  23. package/dist/identity/sso/custodian-auth-helpers.mjs.map +1 -0
  24. package/dist/identity/sso/sso-config-helper.d.mts +7 -0
  25. package/dist/identity/sso/sso-config-helper.d.mts.map +1 -0
  26. package/dist/identity/sso/sso-config-helper.mjs +42 -0
  27. package/dist/identity/sso/sso-config-helper.mjs.map +1 -0
  28. package/dist/identity/sso/sso-custodian-service.d.mts +139 -0
  29. package/dist/identity/sso/sso-custodian-service.d.mts.map +1 -0
  30. package/dist/identity/sso/sso-custodian-service.mjs +471 -0
  31. package/dist/identity/sso/sso-custodian-service.mjs.map +1 -0
  32. package/dist/identity/sso/sso-types.d.mts +71 -0
  33. package/dist/identity/sso/sso-types.d.mts.map +1 -0
  34. package/dist/identity/sso/sso-types.mjs +7 -0
  35. package/dist/identity/sso/sso-types.mjs.map +1 -0
  36. package/dist/index.d.mts +5 -1
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +5 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/serve-gib/handlers/api/email/email-outbound.handler.d.mts.map +1 -1
  41. package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs +9 -2
  42. package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs.map +1 -1
  43. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.d.mts +29 -0
  44. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.d.mts.map +1 -0
  45. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.mjs +149 -0
  46. package/dist/serve-gib/handlers/api/email/email-verification-code.handler.mjs.map +1 -0
  47. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.d.mts +24 -0
  48. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.d.mts.map +1 -0
  49. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mjs +212 -0
  50. package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mjs.map +1 -0
  51. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.d.mts +37 -0
  52. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.d.mts.map +1 -0
  53. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mjs +192 -0
  54. package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mjs.map +1 -0
  55. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.d.mts +33 -0
  56. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.d.mts.map +1 -0
  57. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mjs +173 -0
  58. package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mjs.map +1 -0
  59. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.d.mts.map +1 -1
  60. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs +2 -3
  61. package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs.map +1 -1
  62. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.d.mts.map +1 -1
  63. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs +38 -3
  64. package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs.map +1 -1
  65. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.d.mts.map +1 -1
  66. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs +54 -24
  67. package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs.map +1 -1
  68. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.d.mts.map +1 -1
  69. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs +13 -13
  70. package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs.map +1 -1
  71. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs +1 -1
  72. package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs.map +1 -1
  73. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs +3 -3
  74. package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs.map +1 -1
  75. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.d.mts.map +1 -1
  76. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs +28 -15
  77. package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs.map +1 -1
  78. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts +29 -15
  79. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts.map +1 -1
  80. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs +105 -108
  81. package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs.map +1 -1
  82. package/dist/serve-gib/identity-index/identity-index-constants.d.mts +3 -2
  83. package/dist/serve-gib/identity-index/identity-index-constants.d.mts.map +1 -1
  84. package/dist/serve-gib/identity-index/identity-index-constants.mjs +4 -2
  85. package/dist/serve-gib/identity-index/identity-index-constants.mjs.map +1 -1
  86. package/dist/serve-gib/identity-index/identity-index-helpers.d.mts.map +1 -1
  87. package/dist/serve-gib/identity-index/identity-index-helpers.mjs +28 -11
  88. package/dist/serve-gib/identity-index/identity-index-helpers.mjs.map +1 -1
  89. package/dist/serve-gib/identity-index/identity-index-service.d.mts +20 -3
  90. package/dist/serve-gib/identity-index/identity-index-service.d.mts.map +1 -1
  91. package/dist/serve-gib/identity-index/identity-index-service.mjs +134 -18
  92. package/dist/serve-gib/identity-index/identity-index-service.mjs.map +1 -1
  93. package/dist/serve-gib/identity-index/identity-index-types.d.mts +4 -2
  94. package/dist/serve-gib/identity-index/identity-index-types.d.mts.map +1 -1
  95. package/dist/serve-gib/index.d.mts +4 -0
  96. package/dist/serve-gib/index.d.mts.map +1 -1
  97. package/dist/serve-gib/index.mjs +12 -0
  98. package/dist/serve-gib/index.mjs.map +1 -1
  99. package/dist/serve-gib/path-constants.d.mts +17 -0
  100. package/dist/serve-gib/path-constants.d.mts.map +1 -1
  101. package/dist/serve-gib/path-constants.mjs +17 -0
  102. package/dist/serve-gib/path-constants.mjs.map +1 -1
  103. package/e2e/identity-custodian-lifecycle.e2e.md +93 -0
  104. package/e2e/identity-sso-lifecycle.e2e.md +132 -0
  105. package/package.json +5 -5
  106. package/src/email/email-helpers.mts +0 -1
  107. package/src/email/index.mts +3 -0
  108. package/src/email/verify/email-verify-constants.mts +3 -0
  109. package/src/email/verify/email-verify-helpers.mts +466 -0
  110. package/src/email/verify/email-verify-types.mts +47 -0
  111. package/src/identity/sso/custodian-auth-helpers.mts +146 -0
  112. package/src/identity/sso/custodian-auth-helpers.respec.mts +97 -0
  113. package/src/identity/sso/sso-config-helper.mts +52 -0
  114. package/src/identity/sso/sso-custodian-service.mts +566 -0
  115. package/src/identity/sso/sso-custodian-service.respec.mts +297 -0
  116. package/src/identity/sso/sso-types.mts +80 -0
  117. package/src/index.mts +14 -0
  118. package/src/serve-gib/handlers/api/email/email-outbound.handler.mts +8 -2
  119. package/src/serve-gib/handlers/api/email/email-verification-code.handler.mts +163 -0
  120. package/src/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mts +231 -0
  121. package/src/serve-gib/handlers/api/email/email-verify.respec.mts +183 -0
  122. package/src/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mts +233 -0
  123. package/src/serve-gib/handlers/api/identity/keystone-custodian-genesis.respec.mts +93 -0
  124. package/src/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mts +210 -0
  125. package/src/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.respec.mts +112 -0
  126. package/src/serve-gib/handlers/api/keystone/keystone-check-email.handler.mts +2 -4
  127. package/src/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +42 -3
  128. package/src/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +46 -23
  129. package/src/serve-gib/handlers/api/keystone/keystone-lookup.handler.mts +11 -15
  130. package/src/serve-gib/handlers/api/keystone/keystone-post.handler.mts +1 -1
  131. package/src/serve-gib/handlers/api/keystone/sso-config.handler.mts +3 -3
  132. package/src/serve-gib/handlers/api/keystone/sso-link.handler.mts +29 -17
  133. package/src/serve-gib/handlers/api/keystone/sso-login.handler.mts +132 -125
  134. package/src/serve-gib/identity-index/identity-index-constants.mts +5 -2
  135. package/src/serve-gib/identity-index/identity-index-helpers.mts +26 -12
  136. package/src/serve-gib/identity-index/identity-index-service.mts +133 -16
  137. package/src/serve-gib/identity-index/identity-index-service.respec.mts +1 -1
  138. package/src/serve-gib/identity-index/identity-index-types.mts +4 -2
  139. package/src/serve-gib/index.mts +12 -0
  140. package/src/serve-gib/path-constants.mts +20 -0
  141. package/tsconfig.json +2 -2
  142. package/tsconfig.test.json +1 -1
  143. package/dist/assumptions.respec.d.mts +0 -2
  144. package/dist/assumptions.respec.d.mts.map +0 -1
  145. package/dist/assumptions.respec.mjs +0 -41
  146. package/dist/assumptions.respec.mjs.map +0 -1
  147. package/dist/email/email-service.respec.d.mts +0 -2
  148. package/dist/email/email-service.respec.d.mts.map +0 -1
  149. package/dist/email/email-service.respec.mjs +0 -115
  150. package/dist/email/email-service.respec.mjs.map +0 -1
  151. package/dist/serve-gib/bootstrap-helper.respec.d.mts +0 -2
  152. package/dist/serve-gib/bootstrap-helper.respec.d.mts.map +0 -1
  153. package/dist/serve-gib/bootstrap-helper.respec.mjs +0 -85
  154. package/dist/serve-gib/bootstrap-helper.respec.mjs.map +0 -1
  155. package/dist/serve-gib/handlers/api/health.respec.d.mts +0 -2
  156. package/dist/serve-gib/handlers/api/health.respec.d.mts.map +0 -1
  157. package/dist/serve-gib/handlers/api/health.respec.mjs +0 -47
  158. package/dist/serve-gib/handlers/api/health.respec.mjs.map +0 -1
  159. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts +0 -2
  160. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts.map +0 -1
  161. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs +0 -98
  162. package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs.map +0 -1
  163. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts +0 -2
  164. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts.map +0 -1
  165. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs +0 -131
  166. package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs.map +0 -1
  167. package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts +0 -2
  168. package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts.map +0 -1
  169. package/dist/serve-gib/identity-index/identity-index-service.respec.mjs +0 -109
  170. package/dist/serve-gib/identity-index/identity-index-service.respec.mjs.map +0 -1
  171. package/dist/serve-gib/keystone-schema-helpers.respec.d.mts +0 -2
  172. package/dist/serve-gib/keystone-schema-helpers.respec.d.mts.map +0 -1
  173. package/dist/serve-gib/keystone-schema-helpers.respec.mjs +0 -68
  174. package/dist/serve-gib/keystone-schema-helpers.respec.mjs.map +0 -1
  175. package/dist/serve-gib/path-helper.respec.d.mts +0 -2
  176. package/dist/serve-gib/path-helper.respec.d.mts.map +0 -1
  177. package/dist/serve-gib/path-helper.respec.mjs +0 -83
  178. package/dist/serve-gib/path-helper.respec.mjs.map +0 -1
  179. package/dist/serve-gib/serve-gib.respec.d.mts +0 -2
  180. package/dist/serve-gib/serve-gib.respec.d.mts.map +0 -1
  181. package/dist/serve-gib/serve-gib.respec.mjs +0 -85
  182. package/dist/serve-gib/serve-gib.respec.mjs.map +0 -1
  183. package/dist/spec-helper.node.respec.d.mts +0 -13
  184. package/dist/spec-helper.node.respec.d.mts.map +0 -1
  185. package/dist/spec-helper.node.respec.mjs +0 -50
  186. package/dist/spec-helper.node.respec.mjs.map +0 -1
  187. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  188. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  189. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs +0 -52
  190. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  191. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  192. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  193. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs +0 -53
  194. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  195. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  196. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  197. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs +0 -59
  198. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  199. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
  200. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.d.mts.map +0 -1
  201. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.mjs +0 -55
  202. package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
  203. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts +0 -2
  204. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts.map +0 -1
  205. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs +0 -67
  206. package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs.map +0 -1
  207. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts +0 -2
  208. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts.map +0 -1
  209. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs +0 -67
  210. package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs.map +0 -1
  211. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts +0 -2
  212. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts.map +0 -1
  213. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs +0 -68
  214. package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs.map +0 -1
  215. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts +0 -2
  216. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts.map +0 -1
  217. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs +0 -69
  218. package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs.map +0 -1
@@ -0,0 +1,471 @@
1
+ import { createPublicKey, verify } from 'node:crypto';
2
+ import { hash, HashAlgorithm, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
3
+ import { kdf_recursiveSaltWrap } from '@ibgib/core-gib/dist/keystone/kdf/kdf-helpers.mjs';
4
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
5
+ import { KEYSTONE_VERB_MANAGE, KEYSTONE_VERB_REVOKE, POOL_ID_MANAGE, KEYSTONE_POOL_ID_REGEXP } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
6
+ import { generateOpaqueChallengeId } from '@ibgib/core-gib/dist/keystone/keystone-helpers.mjs';
7
+ import { KeystoneStrategyFactory } from '@ibgib/core-gib/dist/keystone/strategy/keystone-strategy-factory.mjs';
8
+ /**
9
+ * Server-side service for token exchange, JWT validation, and user profile normalization.
10
+ */
11
+ export class SsoCustodianService {
12
+ config;
13
+ lc = `[${SsoCustodianService.name}]`;
14
+ // In-memory cache for JSON Web Key Sets (JWKS) per provider
15
+ jwksCache = new Map();
16
+ jwksTtlMs = 24 * 60 * 60 * 1000; // Cache certs for 24 hours
17
+ /**
18
+ * @param config The server's global SSO configuration.
19
+ * - Visibility: Private (Contains high-entropy secrets like `ssoServerKdfSecret` and `sessionSecret`).
20
+ * - Generator: Server (Bootstrapped from node environment variables on server initialization).
21
+ */
22
+ constructor(config) {
23
+ this.config = config;
24
+ }
25
+ /**
26
+ * Exchanges an authorization code for an OAuth2 token and retrieves normalized user info.
27
+ *
28
+ * @param providerId The string identifier of the OAuth provider (e.g. 'google' or 'github').
29
+ * - Visibility: Public (Non-sensitive metadata string).
30
+ * - Generator: Client (Sent from browser UI selection).
31
+ *
32
+ * @param code The temporary authorization code returned by the OAuth provider.
33
+ * - Visibility: Private (Confidential short-lived bearer credential. Must be kept private).
34
+ * - Generator: Provider (Created by provider's OAuth page and sent to client redirect URI).
35
+ *
36
+ * @param redirectUri The redirect URI registered in the provider portal.
37
+ * - Visibility: Public (Configuration URL).
38
+ * - Generator: Client/Server (Derived from environmental configuration and sent by client).
39
+ */
40
+ async getOAuthUserInfo(providerId, code, redirectUri) {
41
+ const lc = `${this.lc}[${this.getOAuthUserInfo.name}]`;
42
+ const providerConfig = this.config.providers[providerId];
43
+ if (!providerConfig) {
44
+ throw new Error(`Provider '${providerId}' is not configured on this server. (E: c28900abfefd23e89cf23f12)`);
45
+ }
46
+ console.log(`${lc} Exchanging code for provider: ${providerId}`);
47
+ // 1. Exchange authorization code for tokens
48
+ const tokens = await this.exchangeCodeForTokens(providerConfig, code, redirectUri);
49
+ // 2. Retrieve and normalize user info
50
+ if (providerId === 'google') {
51
+ // Google returns an id_token (JWT) directly containing user info
52
+ if (!tokens.id_token) {
53
+ throw new Error(`Google token exchange did not return id_token. (E: e28900abfefd23e89cf45f23)`);
54
+ }
55
+ return this.verifyAndNormalizeGoogleToken(tokens.id_token);
56
+ }
57
+ else if (providerId === 'github') {
58
+ // GitHub requires calling the /user API using the access_token
59
+ if (!tokens.access_token) {
60
+ throw new Error(`GitHub token exchange did not return access_token. (E: a28900abfefd23e89cf56f34)`);
61
+ }
62
+ return this.fetchAndNormalizeGithubUser(providerConfig, tokens.access_token);
63
+ }
64
+ throw new Error(`Unsupported provider: ${providerId}. (E: d28900abfefd23e89cf67f45)`);
65
+ }
66
+ /**
67
+ * Directly validates a Google ID Token (JWT) locally and returns normalized user info.
68
+ * Useful for client-side authentication handshakes.
69
+ *
70
+ * @param idToken The raw base64-encoded signed JSON Web Token (JWT) ID token returned by Google.
71
+ * - Visibility: Private (Sensitive bearer credential containing signature and claims. Must be kept private).
72
+ * - Generator: Provider (Generated and signed cryptographically by Google authentication servers).
73
+ */
74
+ async verifyAndNormalizeGoogleToken(idToken) {
75
+ const lc = `${this.lc}[${this.verifyAndNormalizeGoogleToken.name}]`;
76
+ const providerConfig = this.config.providers.google;
77
+ if (!providerConfig) {
78
+ throw new Error(`Google provider config is missing. (E: g28900abfefd23e89cf78f56)`);
79
+ }
80
+ // Verify signature and decode JWT payload
81
+ const payload = await this.verifyJwt(idToken, providerConfig);
82
+ // Assert claims
83
+ const nowSeconds = Math.floor(Date.now() / 1000);
84
+ if (payload.exp && payload.exp < nowSeconds) {
85
+ throw new Error(`Token has expired. (E: t28900abfefd23e89cf89f67)`);
86
+ }
87
+ if (payload.aud !== providerConfig.clientId) {
88
+ throw new Error(`Token audience mismatch. Expected ${providerConfig.clientId}, got ${payload.aud}. (E: m28900abfefd23e89cf90f78)`);
89
+ }
90
+ if (!payload.sub) {
91
+ throw new Error(`Google JWT is missing subject claim ('sub'). (E: s28900abfefd23e89cfa1f89)`);
92
+ }
93
+ if (payload.email && payload.email_verified !== true && payload.email_verified !== 'true') {
94
+ throw new Error(`Google email is not verified: ${payload.email}. (E: v28900abfefd23e89cfb2f90)`);
95
+ }
96
+ return {
97
+ providerKey: `google:${payload.sub}`,
98
+ providerId: 'google',
99
+ sub: payload.sub,
100
+ email: payload.email,
101
+ name: payload.name,
102
+ picture: payload.picture
103
+ };
104
+ }
105
+ /**
106
+ * Internal: Exchange authorization code for access token / ID token.
107
+ *
108
+ * @param providerConfig Server configuration settings for the specific provider.
109
+ * - Visibility: Private (Contains provider client secrets. Must stay server-side).
110
+ * - Generator: Server (Configured from node environment variables).
111
+ *
112
+ * @param code The temporary authorization code to exchange.
113
+ * - Visibility: Private (Short-lived credential. Must be kept private).
114
+ * - Generator: Provider (Via OAuth flow).
115
+ *
116
+ * @param redirectUri The redirect URI registered for the exchange.
117
+ * - Visibility: Public (Configuration URL).
118
+ * - Generator: Client/Server (From app configuration).
119
+ */
120
+ async exchangeCodeForTokens(providerConfig, code, redirectUri) {
121
+ const body = new URLSearchParams({
122
+ client_id: providerConfig.clientId,
123
+ client_secret: providerConfig.clientSecret,
124
+ code,
125
+ redirect_uri: redirectUri,
126
+ grant_type: 'authorization_code'
127
+ });
128
+ const headers = {
129
+ 'Content-Type': 'application/x-www-form-urlencoded'
130
+ };
131
+ // GitHub requires an Accept header to return JSON instead of URL-encoded string
132
+ if (providerConfig.providerId === 'github') {
133
+ headers['Accept'] = 'application/json';
134
+ }
135
+ const res = await fetch(providerConfig.tokenUrl, {
136
+ method: 'POST',
137
+ headers,
138
+ body: body.toString()
139
+ });
140
+ if (!res.ok) {
141
+ const errText = await res.text();
142
+ throw new Error(`Token exchange failed (HTTP ${res.status}): ${errText}`);
143
+ }
144
+ return res.json();
145
+ }
146
+ /**
147
+ * Internal: Fetch GitHub user profile and normalize.
148
+ *
149
+ * @param providerConfig Server configuration settings for GitHub.
150
+ * - Visibility: Private (Contains GitHub client secret).
151
+ * - Generator: Server (From environment config).
152
+ *
153
+ * @param accessToken The active OAuth2 access token to authorize the API call.
154
+ * - Visibility: Private (Bearer token. Must be kept private).
155
+ * - Generator: Provider (GitHub token endpoint).
156
+ */
157
+ async fetchAndNormalizeGithubUser(providerConfig, accessToken) {
158
+ const res = await fetch(providerConfig.userInfoUrl, {
159
+ headers: {
160
+ 'Authorization': `Bearer ${accessToken}`,
161
+ 'User-Agent': 'space-gib-auth-agent' // GitHub API requires User-Agent
162
+ }
163
+ });
164
+ if (!res.ok) {
165
+ const errText = await res.text();
166
+ throw new Error(`Failed to fetch GitHub user info (HTTP ${res.status}): ${errText}`);
167
+ }
168
+ const rawUser = await res.json();
169
+ if (!rawUser.id) {
170
+ throw new Error(`GitHub user info response missing 'id' field.`);
171
+ }
172
+ const sub = String(rawUser.id);
173
+ let email = rawUser.email || undefined;
174
+ // If email is missing or private, fetch /user/emails to extract primary verified email
175
+ if (!email) {
176
+ try {
177
+ const emailsRes = await fetch('https://api.github.com/user/emails', {
178
+ headers: {
179
+ 'Authorization': `Bearer ${accessToken}`,
180
+ 'User-Agent': 'space-gib-auth-agent'
181
+ }
182
+ });
183
+ if (emailsRes.ok) {
184
+ const emailsList = await emailsRes.json();
185
+ const primaryVerified = emailsList.find((e) => e.verified && e.primary) || emailsList.find((e) => e.verified);
186
+ if (primaryVerified?.email) {
187
+ email = primaryVerified.email;
188
+ }
189
+ }
190
+ }
191
+ catch (err) {
192
+ console.warn(`[${this.fetchAndNormalizeGithubUser.name}] Could not fetch GitHub /user/emails fallback: ${extractErrorMsg(err)}`);
193
+ }
194
+ }
195
+ if (!email) {
196
+ throw new Error(`Your GitHub account does not have a verified primary email address. Please verify your primary email on GitHub and try again. (E: e28900abfefd23e89cfc3f01)`);
197
+ }
198
+ return {
199
+ providerKey: `github:${sub}`,
200
+ providerId: 'github',
201
+ sub,
202
+ email,
203
+ name: rawUser.name || rawUser.login || undefined,
204
+ picture: rawUser.avatar_url || undefined
205
+ };
206
+ }
207
+ /**
208
+ * Internal: Decodes and cryptographically verifies a JWT signature using JWKS public keys.
209
+ *
210
+ * @param token The raw base64-encoded JWT token to verify.
211
+ * - Visibility: Private (Sensitive token. Must be kept private).
212
+ * - Generator: Provider (Google / OIDC server).
213
+ *
214
+ * @param providerConfig The target provider server settings containing `jwksUrl`.
215
+ * - Visibility: Private (Contains secrets).
216
+ * - Generator: Server (From environment config).
217
+ */
218
+ async verifyJwt(token, providerConfig) {
219
+ const parts = token.split('.');
220
+ if (parts.length !== 3) {
221
+ throw new Error('JWT must have 3 parts separated by dots.');
222
+ }
223
+ const [headerB64, payloadB64, signatureB64] = parts;
224
+ // 1. Decode header and select algorithm/key ID
225
+ let header;
226
+ try {
227
+ header = JSON.parse(Buffer.from(headerB64, 'base64url').toString('utf-8'));
228
+ }
229
+ catch {
230
+ throw new Error('Failed to parse JWT header.');
231
+ }
232
+ if (header.alg !== 'RS256') {
233
+ throw new Error(`Only RS256 algorithm is supported, got: ${header.alg}`);
234
+ }
235
+ const kid = header.kid;
236
+ if (!kid) {
237
+ throw new Error('JWT header missing key ID (kid).');
238
+ }
239
+ // 2. Fetch public keys (JWKS)
240
+ const keys = await this.getJwksKeys(providerConfig);
241
+ const jwk = keys.find(key => key.kid === kid);
242
+ if (!jwk) {
243
+ throw new Error(`JWK public key matching kid '${kid}' not found.`);
244
+ }
245
+ // 3. Create Public Key object using Node native crypto
246
+ const publicKey = createPublicKey({
247
+ key: jwk,
248
+ format: 'jwk'
249
+ });
250
+ // 4. Verify signature against header + payload data
251
+ const signature = Buffer.from(signatureB64, 'base64url');
252
+ const data = Buffer.from(`${headerB64}.${payloadB64}`);
253
+ const isValid = verify('sha256', data, publicKey, signature);
254
+ if (!isValid) {
255
+ throw new Error('Cryptographic signature verification failed.');
256
+ }
257
+ // 5. Decode and return payload
258
+ try {
259
+ return JSON.parse(Buffer.from(payloadB64, 'base64url').toString('utf-8'));
260
+ }
261
+ catch {
262
+ throw new Error('Failed to parse JWT payload.');
263
+ }
264
+ }
265
+ /**
266
+ * Internal: Retrieves JWKS keys from cache or fetches them from the provider's jwksUrl.
267
+ *
268
+ * @param providerConfig The provider config containing the target `jwksUrl`.
269
+ * - Visibility: Private (Contains client secrets).
270
+ * - Generator: Server (From environment config).
271
+ */
272
+ async getJwksKeys(providerConfig) {
273
+ const providerId = providerConfig.providerId;
274
+ const cached = this.jwksCache.get(providerId);
275
+ if (cached && cached.expiresAt > Date.now()) {
276
+ return cached.keys;
277
+ }
278
+ if (!providerConfig.jwksUrl) {
279
+ throw new Error(`Provider '${providerId}' does not define a jwksUrl for JWT signature validation.`);
280
+ }
281
+ const res = await fetch(providerConfig.jwksUrl);
282
+ if (!res.ok) {
283
+ throw new Error(`Failed to fetch JWKS from ${providerConfig.jwksUrl} (HTTP ${res.status})`);
284
+ }
285
+ const body = (await res.json());
286
+ if (!body.keys || !Array.isArray(body.keys)) {
287
+ throw new Error(`Invalid JWKS response structure from ${providerConfig.jwksUrl}`);
288
+ }
289
+ this.jwksCache.set(providerId, {
290
+ keys: body.keys,
291
+ expiresAt: Date.now() + this.jwksTtlMs
292
+ });
293
+ return body.keys;
294
+ }
295
+ /**
296
+ * Derives a server-delegate master secret deterministically using the server's private KDF secret,
297
+ * the providerKey, and the user's public nonce.
298
+ *
299
+ * @param providerKey The unique key identifying the provider and user sub ID (e.g. `google:123...`).
300
+ * - Visibility: Public (Identifier saved on parent's delegate claim, safe for log/ledger storage).
301
+ * - Generator: Provider/Server (Derived by mapping provider user sub ID after authentication).
302
+ *
303
+ * @param userNonce The public, high-entropy nonce generated by the client to salt the KDF derivation.
304
+ * - Visibility: Public (Salt value stored on parent's delegate claim, safe for ledger storage).
305
+ * - Generator: Client (Generated offline on user's device).
306
+ */
307
+ async deriveServerDelegateSecret(providerKey, userNonce) {
308
+ const salt = await hash({
309
+ s: `${providerKey}:${userNonce}`,
310
+ algorithm: HashAlgorithm.sha_512
311
+ });
312
+ return await kdf_recursiveSaltWrap({
313
+ masterSecret: this.config.ssoServerKdfSecret,
314
+ salt,
315
+ rounds: 1000,
316
+ algorithm: HashAlgorithm.sha_512
317
+ });
318
+ }
319
+ /**
320
+ * Creates a public custodian challenge pool (custodian-manage) derived deterministically
321
+ * from the server's private KDF secret, providerKey, and userNonce.
322
+ *
323
+ * @param providerKey The unique key identifying the provider and user sub ID (e.g. `google:123...`).
324
+ * - Visibility: Public (Mapped identifier, safe for ledger).
325
+ * - Generator: Provider/Server (Derived after successful token exchange).
326
+ *
327
+ * @param userNonce The public, high-entropy nonce.
328
+ * - Visibility: Public (Derivation salt, safe for ledger).
329
+ * - Generator: Client (Generated on user's device).
330
+ */
331
+ async createCustodianChallengePool({ providerId, providerKey, userNonce, keystoneAddr, metaspace, space, }) {
332
+ // 1. Fetch target keystone
333
+ const keystoneService = new KeystoneService_V1();
334
+ const targetKeystone = await keystoneService.getLatestKeystone({
335
+ addr: keystoneAddr,
336
+ metaspace,
337
+ space
338
+ });
339
+ if (!targetKeystone) {
340
+ throw new Error(`Keystone not found for address: ${keystoneAddr} (E: 8a9c2b1d3e5f6a7b8c9d0e1f2a3b4c5d)`);
341
+ }
342
+ // 2. Locate native manage pool
343
+ const userManagePool = targetKeystone.data?.challengePools.find(p => p.id === POOL_ID_MANAGE);
344
+ if (!userManagePool) {
345
+ throw new Error(`Keystone manage pool not found. Custodian manage pool must match the user manage pool's security config. (E: 7c4e5f6a7b8c9d0e1f2a3b4c5e6f7a8b)`);
346
+ }
347
+ // 3. Dynamic poolId based on providerId with regex validation
348
+ if (!providerId || !KEYSTONE_POOL_ID_REGEXP.test(providerId)) {
349
+ throw new Error(`Invalid providerId: "${providerId}". Must match ${KEYSTONE_POOL_ID_REGEXP} (E: 3a2c4e5f6a7b8c9d0e1f2a3b4c5e6f)`);
350
+ }
351
+ const poolId = `custodian-manage-${providerId}`;
352
+ // 4. Derive delegate secrets
353
+ const custodianSecret = await this.deriveServerDelegateSecret(providerKey, userNonce);
354
+ const poolSalt = await hash({
355
+ s: `${providerKey}:${userNonce}:salt`,
356
+ algorithm: HashAlgorithm.sha_256
357
+ });
358
+ const poolSaltShort = poolSalt.substring(0, 16);
359
+ // 5. Clone user's manage pool config, updating only ID, salt, and allowedVerbs
360
+ const config = {
361
+ ...userManagePool.config,
362
+ id: poolId,
363
+ salt: poolSaltShort,
364
+ allowedVerbs: [KEYSTONE_VERB_MANAGE, KEYSTONE_VERB_REVOKE]
365
+ };
366
+ const strategy = KeystoneStrategyFactory.create({ config });
367
+ const poolSecret = await strategy.derivePoolSecret({ masterSecret: custodianSecret });
368
+ const challenges = {};
369
+ const timestamp = Date.now().toString();
370
+ for (let i = 0; i < config.behavior.size; i++) {
371
+ const challengeId = await generateOpaqueChallengeId({
372
+ salt: config.salt,
373
+ timestamp,
374
+ index: i
375
+ });
376
+ const solution = await strategy.generateSolution({
377
+ poolSecret,
378
+ poolId: config.id,
379
+ challengeId
380
+ });
381
+ challenges[challengeId] = await strategy.generateChallenge({ solution });
382
+ }
383
+ return {
384
+ id: poolId,
385
+ config,
386
+ challenges,
387
+ isForeign: true,
388
+ metadata: {
389
+ owner: 'custodian',
390
+ providerKey
391
+ }
392
+ };
393
+ }
394
+ /**
395
+ * Maps private server configuration to safe public client configurations.
396
+ *
397
+ * @param hostUrl The root URL host address of the server (e.g. `https://space-gib.localhost` or `https://ibgib.space`).
398
+ * - Visibility: Public (Non-sensitive hostname configuration).
399
+ * - Generator: Server (Extracted from the HTTP request context headers/protocol).
400
+ */
401
+ getSsoClientConfigs(hostUrl) {
402
+ const configs = [];
403
+ if (this.config.providers.google) {
404
+ configs.push({
405
+ providerId: 'google',
406
+ clientId: this.config.providers.google.clientId,
407
+ authUrl: 'https://accounts.google.com/o/oauth2/v2/auth',
408
+ redirectUri: `${hostUrl}/`,
409
+ scope: 'openid email profile'
410
+ });
411
+ }
412
+ if (this.config.providers.github) {
413
+ configs.push({
414
+ providerId: 'github',
415
+ clientId: this.config.providers.github.clientId,
416
+ authUrl: 'https://github.com/login/oauth/authorize',
417
+ redirectUri: `${hostUrl}/`,
418
+ scope: 'read:user user:email'
419
+ });
420
+ }
421
+ return configs;
422
+ }
423
+ /**
424
+ * Revokes an active OAuth access or refresh token with the provider.
425
+ * Keeps token revocation logic DRY and centralized.
426
+ */
427
+ async revokeToken(providerId, token) {
428
+ const lc = `${this.lc}[${this.revokeToken.name}]`;
429
+ const providerConfig = this.config.providers[providerId];
430
+ if (!providerConfig) {
431
+ throw new Error(`SSO provider "${providerId}" config is missing. (E: r28900abfefd23e89cf78f57)`);
432
+ }
433
+ try {
434
+ if (providerId === 'google') {
435
+ const res = await fetch(`https://oauth2.googleapis.com/revoke?token=${encodeURIComponent(token)}`, {
436
+ method: 'POST',
437
+ headers: {
438
+ 'Content-Type': 'application/x-www-form-urlencoded'
439
+ }
440
+ });
441
+ if (!res.ok) {
442
+ const text = await res.text();
443
+ console.warn(`${lc} Google token revocation returned status ${res.status}: ${text}`);
444
+ }
445
+ }
446
+ else if (providerId === 'github') {
447
+ const auth = Buffer.from(`${providerConfig.clientId}:${providerConfig.clientSecret}`).toString('base64');
448
+ const res = await fetch(`https://api.github.com/applications/${providerConfig.clientId}/grant`, {
449
+ method: 'DELETE',
450
+ headers: {
451
+ 'Authorization': `Basic ${auth}`,
452
+ 'Accept': 'application/vnd.github.v3+json',
453
+ 'User-Agent': 'space-gib-server'
454
+ },
455
+ body: JSON.stringify({ access_token: token })
456
+ });
457
+ if (!res.ok && res.status !== 404) {
458
+ const text = await res.text();
459
+ console.warn(`${lc} GitHub token revocation returned status ${res.status}: ${text}`);
460
+ }
461
+ }
462
+ else {
463
+ throw new Error(`Unsupported provider: ${providerId} (E: e28900abfefd23e89cf78f58)`);
464
+ }
465
+ }
466
+ catch (error) {
467
+ console.error(`${lc} Token revocation failed for provider ${providerId}: ${extractErrorMsg(error)}`);
468
+ }
469
+ }
470
+ }
471
+ //# sourceMappingURL=sso-custodian-service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-custodian-service.mjs","sourceRoot":"","sources":["../../../src/identity/sso/sso-custodian-service.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @module identity/sso/sso-types
3
+ *
4
+ * Core types and interfaces for extensible SSO (OAuth2) authentication on the server.
5
+ */
6
+ export type SsoProviderId = 'google' | 'github';
7
+ export interface SsoProviderClientConfig {
8
+ providerId: SsoProviderId;
9
+ clientId: string;
10
+ authUrl: string;
11
+ redirectUri: string;
12
+ scope: string;
13
+ }
14
+ export interface SsoProviderServerConfig {
15
+ providerId: SsoProviderId;
16
+ clientId: string;
17
+ clientSecret: string;
18
+ tokenUrl: string;
19
+ userInfoUrl: string;
20
+ jwksUrl?: string;
21
+ }
22
+ export interface SsoServerConfig {
23
+ /** Server's private KDF secret used to derive server-delegate keystones. */
24
+ ssoServerKdfSecret: string;
25
+ /** Server's private session encryption secret. */
26
+ sessionSecret: string;
27
+ /** Map of active OAuth2 providers. */
28
+ providers: Partial<Record<SsoProviderId, SsoProviderServerConfig>>;
29
+ }
30
+ export interface OAuthUserInfo {
31
+ /** Unique identity key combining provider and sub ID (e.g., `google:107632...`). */
32
+ providerKey: string;
33
+ providerId: SsoProviderId;
34
+ /** Unique user ID within the provider. */
35
+ sub: string;
36
+ email?: string;
37
+ name?: string;
38
+ picture?: string;
39
+ }
40
+ /**
41
+ * Single-turn authorization requirements object issued by the custodian server
42
+ * after successful passwordless SSO/Email authentication.
43
+ *
44
+ * Placed in `delegateKeystone.data.frameDetails.custodianReqs` when registering
45
+ * a client delegate keystone via passwordless onboarding.
46
+ */
47
+ export interface CustodianRequirements {
48
+ /**
49
+ * The primary identity keystone TJP address (`ib^gib`) to which the delegate keystone will be registered.
50
+ * Prevents Man-In-The-Middle reuse of authorization requirements across different primary identities.
51
+ */
52
+ primaryTjpAddr: string;
53
+ /**
54
+ * High-entropy, single-turn random nonce generated by the server.
55
+ * Prevents replay attacks when registering delegate keystones.
56
+ */
57
+ nonce: string;
58
+ /**
59
+ * Single-turn authorization code computed by the server over `Omit<CustodianRequirements, 'authCode'>`.
60
+ */
61
+ authCode: string;
62
+ /**
63
+ * Expiration timestamp in epoch milliseconds after which this requirements object is invalid.
64
+ */
65
+ expiresAt: number;
66
+ /**
67
+ * Explicit list of permitted keystone verbs allowed for the delegate keystone (e.g., `['sync', 'connect']`).
68
+ */
69
+ allowedVerbs: string[];
70
+ }
71
+ //# sourceMappingURL=sso-types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-types.d.mts","sourceRoot":"","sources":["../../../src/identity/sso/sso-types.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,MAAM,WAAW,uBAAuB;IACpC,UAAU,EAAE,aAAa,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACpC,UAAU,EAAE,aAAa,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,4EAA4E;IAC5E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,aAAa;IAC1B,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,CAAC;IAC1B,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IAClC;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CAC1B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @module identity/sso/sso-types
3
+ *
4
+ * Core types and interfaces for extensible SSO (OAuth2) authentication on the server.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=sso-types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sso-types.mjs","sourceRoot":"","sources":["../../../src/identity/sso/sso-types.mts"],"names":[],"mappings":"AAAA;;;;GAIG"}
package/dist/index.d.mts CHANGED
@@ -8,6 +8,10 @@ export * from './foo.mjs';
8
8
  export * from './helpers.mjs';
9
9
  export * from './types.mjs';
10
10
  export * from './serve-gib/index.mjs';
11
- export { DEFAULT_EMAIL_CHARSET, EMAIL_MODE_AWS, EMAIL_MODE_MOCK, DEFAULT_AWS_REGION, DEFAULT_AWS_SES_ENDPOINT, DEFAULT_AWS_SERVICE, VERDICT_PASS, VERDICT_FAIL, VERDICT_GRAY, FOLDER_INBOX, FOLDER_JUNK, parseEmailAddress, formatEmailAddress, parseRawMimeHeaders, formatRawMimeString, validateEmail, validateEmailAddress, EmailSenderBase, EmailReceiverBase, createAwsSigV4Headers, EmailSenderAws, EmailReceiverAws, EmailSenderMock, } from './email/index.mjs';
11
+ export { DEFAULT_EMAIL_CHARSET, EMAIL_MODE_AWS, EMAIL_MODE_MOCK, DEFAULT_AWS_REGION, DEFAULT_AWS_SES_ENDPOINT, DEFAULT_AWS_SERVICE, VERDICT_PASS, VERDICT_FAIL, VERDICT_GRAY, FOLDER_INBOX, FOLDER_JUNK, parseEmailAddress, formatEmailAddress, parseRawMimeHeaders, formatRawMimeString, validateEmail, validateEmailAddress, EmailSenderBase, EmailReceiverBase, createAwsSigV4Headers, EmailSenderAws, EmailReceiverAws, EmailSenderMock, createMagicLinkToken, verifyMagicLinkToken, markNonceUsed, isNonceUsed, clearConsumedNonces, DEFAULT_MAGIC_LINK_TTL_MS, getMagicLinkSecret, } from './email/index.mjs';
12
12
  export type * from './email/email-types.mjs';
13
+ export * from './identity/sso/sso-custodian-service.mjs';
14
+ export * from './identity/sso/sso-config-helper.mjs';
15
+ export * from './identity/sso/custodian-auth-helpers.mjs';
16
+ export type * from './identity/sso/sso-types.mjs';
13
17
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAG5B,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EACH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAClB,MAAM,mBAAmB,CAAC;AAC3B,mBAAmB,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAG5B,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EACH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,mBAAmB,yBAAyB,CAAC;AAG7C,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC;AAC1D,mBAAmB,8BAA8B,CAAC"}
package/dist/index.mjs CHANGED
@@ -10,5 +10,9 @@ export * from './types.mjs';
10
10
  // serve-gib microframework
11
11
  export * from './serve-gib/index.mjs';
12
12
  // email infrastructure
13
- export { DEFAULT_EMAIL_CHARSET, EMAIL_MODE_AWS, EMAIL_MODE_MOCK, DEFAULT_AWS_REGION, DEFAULT_AWS_SES_ENDPOINT, DEFAULT_AWS_SERVICE, VERDICT_PASS, VERDICT_FAIL, VERDICT_GRAY, FOLDER_INBOX, FOLDER_JUNK, parseEmailAddress, formatEmailAddress, parseRawMimeHeaders, formatRawMimeString, validateEmail, validateEmailAddress, EmailSenderBase, EmailReceiverBase, createAwsSigV4Headers, EmailSenderAws, EmailReceiverAws, EmailSenderMock, } from './email/index.mjs';
13
+ export { DEFAULT_EMAIL_CHARSET, EMAIL_MODE_AWS, EMAIL_MODE_MOCK, DEFAULT_AWS_REGION, DEFAULT_AWS_SES_ENDPOINT, DEFAULT_AWS_SERVICE, VERDICT_PASS, VERDICT_FAIL, VERDICT_GRAY, FOLDER_INBOX, FOLDER_JUNK, parseEmailAddress, formatEmailAddress, parseRawMimeHeaders, formatRawMimeString, validateEmail, validateEmailAddress, EmailSenderBase, EmailReceiverBase, createAwsSigV4Headers, EmailSenderAws, EmailReceiverAws, EmailSenderMock, createMagicLinkToken, verifyMagicLinkToken, markNonceUsed, isNonceUsed, clearConsumedNonces, DEFAULT_MAGIC_LINK_TTL_MS, getMagicLinkSecret, } from './email/index.mjs';
14
+ // identity & SSO custodian infrastructure
15
+ export * from './identity/sso/sso-custodian-service.mjs';
16
+ export * from './identity/sso/sso-config-helper.mjs';
17
+ export * from './identity/sso/custodian-auth-helpers.mjs';
14
18
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAE5B,2BAA2B;AAC3B,cAAc,uBAAuB,CAAC;AAEtC,uBAAuB;AACvB,OAAO,EACH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAClB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAE5B,2BAA2B;AAC3B,cAAc,uBAAuB,CAAC;AAEtC,uBAAuB;AACvB,OAAO,EACH,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,yBAAyB,EACzB,kBAAkB,GACrB,MAAM,mBAAmB,CAAC;AAG3B,0CAA0C;AAC1C,cAAc,0CAA0C,CAAC;AACzD,cAAc,sCAAsC,CAAC;AACrD,cAAc,2CAA2C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"email-outbound.handler.d.mts","sourceRoot":"","sources":["../../../../../src/serve-gib/handlers/api/email/email-outbound.handler.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAiB,MAAM,mCAAmC,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,2BAA2B;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,mBAAmB;IACzD,UAAmB,EAAE,SAAoC;IACzD,UAAmB,MAAM,EAAE,kBAAkB,CAAU;IACvD,UAAmB,KAAK,SAA+B;IAEvD,OAAO,CAAC,MAAM,CAAc;IAE5B,YAAY,OAAO,GAAE,2BAAgC,EAiBpD;IAED,UAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAgC3F;CACJ"}
1
+ {"version":3,"file":"email-outbound.handler.d.mts","sourceRoot":"","sources":["../../../../../src/serve-gib/handlers/api/email/email-outbound.handler.mts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAiB,MAAM,mCAAmC,CAAC;AAG/E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,2BAA2B;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,mBAAmB;IACzD,UAAmB,EAAE,SAAoC;IACzD,UAAmB,MAAM,EAAE,kBAAkB,CAAU;IACvD,UAAmB,KAAK,SAA+B;IAEvD,OAAO,CAAC,MAAM,CAAc;IAE5B,YAAY,OAAO,GAAE,2BAAgC,EAuBpD;IAED,UAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAgC3F;CACJ"}