@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
@@ -6,16 +6,17 @@
6
6
  * Looks up a primary identity keystone by username or email hash in the server's identity index.
7
7
  */
8
8
 
9
- import * as path from 'node:path';
10
- import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
11
- import { getGibInfo } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
12
- import { IdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
13
- import { getIdentityEmailHash } from '../../../identity-index/identity-index-helpers.mjs';
9
+ import { extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
10
+
11
+ import { GLOBAL_LOG_A_LOT } from '../../../server-constants.mjs';
12
+ import { getIdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
14
13
  import { ServeGibHandlerBase } from '../../handler-base.mjs';
15
14
  import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
16
15
  import { API_PATH_REGEXES } from '../../../path-constants.mjs';
17
16
  import { bootstrapDomainMetaspace } from '../../../bootstrap-helper.mjs';
18
17
 
18
+ const logalot = GLOBAL_LOG_A_LOT || true;
19
+
19
20
  /**
20
21
  * POST /api/keystone/lookup
21
22
  */
@@ -46,28 +47,23 @@ export class KeystoneLookupHandler extends ServeGibHandlerBase<undefined, undefi
46
47
  return this.error(400, 'Identifier is required');
47
48
  }
48
49
 
49
- const indexService = new IdentityIndexService({ baseDir: path.join(reqCtx.dataDir, 'index') });
50
+ const indexService = getIdentityIndexService();
51
+ if (logalot) { console.log(`${lc} identifier: ${identifier} (I: 1c417812d9781c5888090ae8d18d0826)`); }
50
52
  const record = await indexService.getEmailIndex({ email: identifier });
53
+ if (logalot) { console.log(`${lc} record: ${record ? pretty(record) : 'undefined'} (I: 7c6ce86b3ad8e3a138991211b5ec5826)`); }
51
54
 
52
55
  if (!record) {
53
56
  console.log(`${lc} Lookup missed for identifier '${identifier}'`);
54
- return this.error(404, `No registered identity found for '${identifier}'. Please check your username/email or create a new account.`);
57
+ return this.error(404, `No registered identity found for '${identifier}'. Please check your email or create a new account.`);
55
58
  }
56
59
 
57
60
  const { tjpAddr } = record;
58
- const { tjpGib, punctiliarHash } = getGibInfo({ ibGibAddr: tjpAddr });
59
- const domainGib = tjpGib || punctiliarHash;
60
-
61
- if (!domainGib) {
62
- console.error(`${lc} Could not extract domain identifier from tjpAddr: ${tjpAddr}`);
63
- return this.error(500, `Internal server error locating primary identity.`);
64
- }
65
61
 
66
62
  // Load primary keystone from domain space
67
63
  const metaspace = await bootstrapDomainMetaspace(tjpAddr, reqCtx.dataDir);
68
64
  const space = await metaspace.getLocalUserSpace({ lock: false });
69
65
  if (!space) {
70
- console.error(`${lc} Could not load space for domain ${domainGib}`);
66
+ console.error(`${lc} Could not load space for domain ${tjpAddr}`);
71
67
  return this.error(500, `Internal server error loading domain space.`);
72
68
  }
73
69
 
@@ -12,7 +12,7 @@ import { API_PATH_REGEXES } from '../../../path-constants.mjs';
12
12
  import { KeystoneParams } from './keystone-handler-types.mjs';
13
13
  import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
14
14
 
15
- const logalot = GLOBAL_LOG_A_LOT || true;
15
+ const logalot = GLOBAL_LOG_A_LOT;
16
16
 
17
17
  /**
18
18
  * POST /api/keystone
@@ -1,13 +1,13 @@
1
1
  import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
- import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
3
- import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
2
+ import { loadSsoServerConfig } from '../../../../identity/sso/sso-config-helper.mjs';
3
+ import { SsoCustodianService } from '../../../../identity/sso/sso-custodian-service.mjs';
4
4
 
5
5
  import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
6
6
  import { ServeGibHandlerBase } from '../../handler-base.mjs';
7
7
  import { API_PATH_REGEXES } from '../../../path-constants.mjs';
8
8
  import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
9
9
 
10
- const logalot = GLOBAL_LOG_A_LOT || true;
10
+ const logalot = GLOBAL_LOG_A_LOT;
11
11
 
12
12
  let custodian: SsoCustodianService | undefined;
13
13
  function getCustodian(): SsoCustodianService {
@@ -1,17 +1,17 @@
1
1
  import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
- import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
3
- import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
4
- import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
5
- import { SsoProviderId } from '@ibgib/web-gib/dist/identity/sso/sso-types.mjs';
2
+ import { loadSsoServerConfig } from '../../../../identity/sso/sso-config-helper.mjs';
3
+ import { SsoCustodianService } from '../../../../identity/sso/sso-custodian-service.mjs';
4
+ import { SsoProviderId } from '../../../../identity/sso/sso-types.mjs';
6
5
  import { isSsoProviderLinked } from '@ibgib/web-gib/dist/identity/sso/sso-helpers.mjs';
7
6
  import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
7
+ import { getIdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
8
8
 
9
9
  import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
10
10
  import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
11
11
  import { API_PATH_REGEXES } from '../../../path-constants.mjs';
12
12
  import { ParamsWithDomain, RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
13
13
 
14
- const logalot = GLOBAL_LOG_A_LOT || true;
14
+ const logalot = GLOBAL_LOG_A_LOT;
15
15
 
16
16
  let custodian: SsoCustodianService | undefined;
17
17
  function getCustodian(): SsoCustodianService {
@@ -67,30 +67,30 @@ export class SsoLinkHandler extends ServeGibHandlerWithMetaspaceBase<LinkParams,
67
67
  protected async handleRouteImpl(reqCtx: RequestContext<LinkParams>): Promise<ResponseResult | undefined> {
68
68
  const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
69
69
  try {
70
- if (logalot) { console.log(`${lc} starting...`); }
70
+ if (logalot) { console.log(`${lc} starting... (I: 8a4c1f930e7b2d5a6c1e9f8a3b5c7d1e)`); }
71
71
 
72
72
  if (!reqCtx.params) {
73
- return this.error(400, 'Invalid parameters: parentTjpAddr missing');
73
+ return this.error(400, 'Invalid parameters: parentTjpAddr missing (E: c9f1a2b3d4e5f60718293a4b5c6d7e8f)');
74
74
  }
75
75
  if (!reqCtx.metaspace) {
76
- return this.error(500, 'Metaspace not initialized');
76
+ return this.error(500, 'Metaspace not initialized (E: d0a1b2c3d4e5f6789a0b1c2d3e4f5a6b)');
77
77
  }
78
78
 
79
79
  let parsed: LinkBody;
80
80
  try {
81
81
  parsed = JSON.parse(reqCtx.body);
82
82
  } catch {
83
- return this.error(400, 'Request body must be valid JSON');
83
+ return this.error(400, 'Request body must be valid JSON (E: e1b2c3d4e5f67890a1b2c3d4e5f67890)');
84
84
  }
85
85
 
86
86
  const { code, providerId, parentTjpAddr, userNonce, redirectUri } = parsed;
87
87
  if (!code || !providerId || !parentTjpAddr || !userNonce || !redirectUri) {
88
- return this.error(400, 'Body missing required parameters (code, providerId, parentTjpAddr, userNonce, redirectUri)');
88
+ return this.error(400, 'Body missing required parameters (code, providerId, parentTjpAddr, userNonce, redirectUri) (E: f2c3d4e5f6789012a3b4c5d6e7f89012)');
89
89
  }
90
90
 
91
91
  const space = await reqCtx.metaspace.getLocalUserSpace({ lock: false });
92
92
  if (!space) {
93
- return this.error(500, 'No local user space found in domain metaspace');
93
+ return this.error(500, 'No local user space found in domain metaspace (E: 03d4e5f678901234b5c6d7e8f9012345)');
94
94
  }
95
95
 
96
96
  // 0. Fetch target keystone and verify if already linked
@@ -101,17 +101,29 @@ export class SsoLinkHandler extends ServeGibHandlerWithMetaspaceBase<LinkParams,
101
101
  space
102
102
  });
103
103
  if (!targetKeystone) {
104
- return this.error(400, `Keystone not found for address: ${parentTjpAddr}`);
104
+ return this.error(400, `Keystone not found for address: ${parentTjpAddr} (E: 14e5f67890123456c7d8e9f012345678)`);
105
105
  }
106
106
 
107
107
  if (isSsoProviderLinked({ keystone: targetKeystone, providerId })) {
108
- return this.error(400, `SSO provider "${providerId}" is already linked to this keystone.`);
108
+ return this.error(400, `SSO provider "${providerId}" is already linked to this keystone. (E: 25f6789012345678d9e0f12345678901)`);
109
109
  }
110
110
 
111
111
  // 1. Authenticate with provider and retrieve user info
112
112
  const service = getCustodian();
113
113
  const userInfo = await service.getOAuthUserInfo(providerId, code, redirectUri);
114
114
 
115
+ if (userInfo.email) {
116
+ try {
117
+ await getIdentityIndexService().registerEmailIndex({
118
+ email: userInfo.email,
119
+ primaryTjpAddr: parentTjpAddr,
120
+ });
121
+ console.log(`(I: 9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c) Registered email index for SSO provider ${providerId}: ${userInfo.email}`);
122
+ } catch (err: any) {
123
+ console.log(`${lc} Email index registration note for ${userInfo.email}: ${err.message} (I: 3607890123456789e0f1a23456789012)`);
124
+ }
125
+ }
126
+
115
127
  // 2. Generate the custodian foreign challenge pool
116
128
  const custodianPool = await service.createCustodianChallengePool({
117
129
  providerId,
@@ -122,7 +134,7 @@ export class SsoLinkHandler extends ServeGibHandlerWithMetaspaceBase<LinkParams,
122
134
  space
123
135
  });
124
136
 
125
- console.log(`${lc} created custodian pool for: ${userInfo.providerKey}`);
137
+ console.log(`${lc} created custodian pool for: ${userInfo.providerKey} (I: 4718901234567890f1a2b34567890123)`);
126
138
 
127
139
  return this.ok({
128
140
  success: true,
@@ -131,10 +143,10 @@ export class SsoLinkHandler extends ServeGibHandlerWithMetaspaceBase<LinkParams,
131
143
 
132
144
  } catch (error) {
133
145
  const emsg = extractErrorMsg(error);
134
- console.error(`${lc} Link failed: ${emsg}`);
135
- return this.error(500, `Link failed: ${emsg}`);
146
+ console.error(`${lc} Link failed: ${emsg} (E: 5829012345678901a2b3c45678901234)`);
147
+ return this.error(500, `Link failed: ${emsg} (E: 693a012345678901b2c3d45678901234)`);
136
148
  } finally {
137
- if (logalot) { console.log(`${lc} complete.`); }
149
+ if (logalot) { console.log(`${lc} complete. (I: 7a4b123456789012c3d4e56789012345)`); }
138
150
  }
139
151
  }
140
152
  }
@@ -1,18 +1,30 @@
1
- import { createHmac } from 'node:crypto';
2
- import { extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
3
- import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
4
- import { loadSsoServerConfig } from '@ibgib/web-gib/dist/identity/sso/sso-config-helper.mjs';
5
- import { SsoCustodianService } from '@ibgib/web-gib/dist/identity/sso/sso-custodian-service.mjs';
6
- import { SsoProviderId } from '@ibgib/web-gib/dist/identity/sso/sso-types.mjs';
7
- import { POOL_ID_CUSTODIAN_MANAGE, KEYSTONE_VERB_MANAGE } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
8
- import { KeystoneStrategyFactory } from '@ibgib/core-gib/dist/keystone/strategy/keystone-strategy-factory.mjs';
1
+ /**
2
+ * @module serve-gib/handlers/api/keystone/sso-login.handler
3
+ *
4
+ * POST /api/identity/sso/login
5
+ *
6
+ * Handles OAuth2 SSO code exchange (Google, GitHub, etc.).
7
+ * Retrieves verified email, looks up or provisions the custodian primary identity keystone,
8
+ * generates a fresh single-turn `CustodianRequirements` payload, and returns it to the client.
9
+ */
10
+
11
+ import { extractErrorMsg, hash, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
12
+ import { getTjpAddr } from '@ibgib/core-gib/dist/common/other/ibgib-helper.mjs';
13
+ import { KeystoneProfileBuilder } from '@ibgib/core-gib/dist/keystone/policy/keystone-profile-builder.mjs';
14
+ import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
9
15
 
10
16
  import { GLOBAL_LOG_A_LOT } from '../../../constants.mjs';
11
- import { ServeGibHandlerWithMetaspaceBase } from '../../handler-base.mjs';
17
+ import { ServeGibHandlerBase } from '../../handler-base.mjs';
12
18
  import { API_PATH_REGEXES } from '../../../path-constants.mjs';
13
- import { ParamsWithDomain, RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
19
+ import { RequestContext, ResponseResult, ServeGibHttpMethod } from '../../../types.mjs';
20
+ import { bootstrapDomainMetaspace } from '../../../bootstrap-helper.mjs';
21
+ import { loadSsoServerConfig } from '../../../../identity/sso/sso-config-helper.mjs';
22
+ import { SsoCustodianService } from '../../../../identity/sso/sso-custodian-service.mjs';
23
+ import { SsoProviderId } from '../../../../identity/sso/sso-types.mjs';
24
+ import { getIdentityIndexService } from '../../../identity-index/identity-index-service.mjs';
25
+ import { generateCustodianRequirements } from '../../../../identity/sso/custodian-auth-helpers.mjs';
14
26
 
15
- const logalot = GLOBAL_LOG_A_LOT || true;
27
+ const logalot = GLOBAL_LOG_A_LOT;
16
28
 
17
29
  let custodian: SsoCustodianService | undefined;
18
30
  function getCustodian(): SsoCustodianService {
@@ -23,166 +35,161 @@ function getCustodian(): SsoCustodianService {
23
35
  return custodian;
24
36
  }
25
37
 
26
- function signSessionToken(payload: any, secret: string): string {
27
- const header = { alg: 'HS256', typ: 'JWT' };
28
- const headerB64 = Buffer.from(JSON.stringify(header)).toString('base64url');
29
- const payloadB64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
30
- const data = `${headerB64}.${payloadB64}`;
31
- const signature = createHmac('sha256', secret).update(data).digest('base64url');
32
- return `${data}.${signature}`;
33
- }
34
-
35
- interface LoginParams extends ParamsWithDomain {
36
- parentTjpAddr: string;
37
- }
38
-
39
- interface LoginBody {
38
+ export interface SsoLoginBody {
40
39
  code: string;
41
40
  providerId: SsoProviderId;
42
- parentTjpAddr: string;
43
- userNonce: string;
44
41
  redirectUri: string;
45
42
  }
46
43
 
44
+ export interface SsoLoginResponseBody {
45
+ success: boolean;
46
+ isNewIdentity?: boolean;
47
+ primaryTjpAddr?: string;
48
+ primaryKeystone?: any;
49
+ custodianReqs?: any;
50
+ userInfo?: any;
51
+ message?: string;
52
+ }
53
+
47
54
  /**
48
55
  * POST /api/identity/sso/login
49
- *
50
- * Exposes login endpoint for SSO authentication. Verifies provider identity, asserts
51
- * that the deterministic server-delegate keystone is registered in the parent keystone,
52
- * and yields a secure HttpOnly session token.
53
56
  */
54
- export class SsoLoginHandler extends ServeGibHandlerWithMetaspaceBase<LoginParams, any> {
57
+ export class SsoLoginHandler extends ServeGibHandlerBase<undefined, undefined> {
55
58
  protected override lc: string = `[${SsoLoginHandler.name}]`;
56
59
  protected override method: ServeGibHttpMethod = 'POST';
57
60
  protected override regex = API_PATH_REGEXES.IDENTITY_SSO_LOGIN;
58
61
 
59
- protected override async parseParamsImpl(reqCtx: RequestContext<LoginParams, any>): Promise<LoginParams | undefined> {
60
- let parsed: any;
61
- try {
62
- parsed = JSON.parse(reqCtx.body);
63
- } catch {
64
- return undefined;
65
- }
66
- const parentTjpAddr = parsed?.parentTjpAddr;
67
- if (!parentTjpAddr) { return undefined; }
68
- return {
69
- parentTjpAddr,
70
- domainInfo: this.getDomainInfo({ domainAddr: parentTjpAddr })
71
- };
62
+ protected override async parseParamsImpl(): Promise<undefined> {
63
+ return undefined;
72
64
  }
73
65
 
74
- protected override async validateQueryParams({ queryParams }: { queryParams: any }): Promise<string[]> {
66
+ protected override async validateQueryParams(): Promise<string[]> {
75
67
  return [];
76
68
  }
77
69
 
78
- protected async handleRouteImpl(reqCtx: RequestContext<LoginParams>): Promise<ResponseResult | undefined> {
70
+ protected async handleRouteImpl(
71
+ reqCtx: RequestContext<undefined, undefined>
72
+ ): Promise<ResponseResult | undefined> {
79
73
  const lc = `${this.lc}[${this.handleRouteImpl.name}]`;
80
74
  try {
81
- if (logalot) { console.log(`${lc} starting...`); }
75
+ if (logalot) { console.log(`${lc} starting... (I: 9b5d2a3c4e5f67890a1b2c3d4e5f6789)`); }
82
76
 
83
- if (!reqCtx.params) {
84
- return this.error(400, 'Invalid parameters: parentTjpAddr missing');
77
+ if (reqCtx.method !== 'POST') {
78
+ return this.error(405, 'Method Not Allowed');
85
79
  }
86
- if (!reqCtx.metaspace) {
87
- return this.error(500, 'Metaspace not initialized');
80
+
81
+ if (!reqCtx.body) {
82
+ return this.error(400, 'Request body is empty (E: 0a1b2c3d4e5f67890a1b2c3d4e5f6789)');
88
83
  }
89
84
 
90
- let parsed: LoginBody;
85
+ let parsed: SsoLoginBody;
91
86
  try {
92
87
  parsed = JSON.parse(reqCtx.body);
93
88
  } catch {
94
- return this.error(400, 'Request body must be valid JSON');
95
- }
96
-
97
- const { code, providerId, parentTjpAddr, userNonce, redirectUri } = parsed;
98
- if (!code || !providerId || !parentTjpAddr || !userNonce || !redirectUri) {
99
- return this.error(400, 'Body missing required parameters (code, providerId, parentTjpAddr, userNonce, redirectUri)');
89
+ return this.error(400, 'Request body must be valid JSON (E: 1a1b2c3d4e5f67890a1b2c3d4e5f6789)');
100
90
  }
101
91
 
102
- const space = await reqCtx.metaspace.getLocalUserSpace({ lock: false });
103
- if (!space) {
104
- return this.error(500, 'No local user space found in domain metaspace');
92
+ const { code, providerId, redirectUri } = parsed;
93
+ if (!code || !providerId || !redirectUri) {
94
+ return this.error(400, 'Body missing required parameters (code, providerId, redirectUri) (E: 2b2c3d4e5f678901b2c3d4e5f6789012)');
105
95
  }
106
96
 
107
- // 1. Authenticate with provider and retrieve user info
97
+ // 1. Authenticate code with provider and retrieve normalized user info
108
98
  const service = getCustodian();
109
99
  const userInfo = await service.getOAuthUserInfo(providerId, code, redirectUri);
110
100
 
111
- // 2. Derive custodian secret using providerKey and userNonce
112
- const custodianSecret = await service.deriveServerDelegateSecret(userInfo.providerKey, userNonce);
113
-
114
- // 3. Fetch latest parent keystone from metaspace
115
- const latestParentAddr = await reqCtx.metaspace.getLatestAddr({ addr: parentTjpAddr, space });
116
- if (!latestParentAddr) {
117
- return this.error(404, `Parent identity keystone not found for address: ${parentTjpAddr}`);
101
+ if (!userInfo || !userInfo.email) {
102
+ return this.error(400, `No email address returned from SSO provider ${providerId} (E: 3c3d4e5f67890123c4d5e6f789012345)`);
118
103
  }
119
104
 
120
- const resGet = await reqCtx.metaspace.get({ addr: latestParentAddr, space });
121
- const parentKeystone = resGet.ibGibs?.[0];
122
- if (!parentKeystone) {
123
- return this.error(404, `Parent identity keystone not found in space for address: ${latestParentAddr}`);
124
- }
105
+ const email = userInfo.email.trim().toLowerCase();
106
+ const username = userInfo.name || email.split('@')[0];
107
+
108
+ // 2. Check if primary identity exists for this email
109
+ const ssoConfig = loadSsoServerConfig();
110
+ const serverSecret = ssoConfig.ssoServerKdfSecret;
111
+ const primarySecret = await hash({ s: `${serverSecret}_custodian_${email}` });
112
+
113
+ const indexService = getIdentityIndexService();
114
+ const existingLookup = await indexService.lookupIdentityByEmail({ email });
115
+
116
+ let primaryTjpAddr: string;
117
+ let primaryKeystone: any;
118
+ let isNewIdentity = false;
119
+
120
+ if (existingLookup && existingLookup.primaryTjpAddr) {
121
+ // Existing identity
122
+ primaryTjpAddr = existingLookup.primaryTjpAddr;
123
+ const domainMetaspace = await bootstrapDomainMetaspace(primaryTjpAddr, reqCtx.dataDir);
124
+ const space = await domainMetaspace.getLocalUserSpace({ lock: false });
125
+
126
+ const latestPrimaryAddr = await domainMetaspace.getLatestAddr({ addr: primaryTjpAddr, space: space! }) ?? primaryTjpAddr;
127
+ const getRes = await domainMetaspace.get({ addrs: [latestPrimaryAddr], space: space! });
128
+ primaryKeystone = getRes.ibGibs?.[0];
129
+ } else {
130
+ // First-time custodian identity creation
131
+ isNewIdentity = true;
132
+ const tempId = await getUUID();
133
+ const tempDomainMetaspace = await bootstrapDomainMetaspace(`temp^${tempId}`, reqCtx.dataDir);
134
+ const tempSpace = await tempDomainMetaspace.getLocalUserSpace({ lock: false });
135
+
136
+ const primaryBuilder = KeystoneProfileBuilder.buildKeystone('domain')
137
+ .withUsername(username)
138
+ .withEmails([email])
139
+ .withDetails({
140
+ client: 'space-gib-server',
141
+ role: 'custodian-primary',
142
+ custodianProvider: providerId,
143
+ });
144
+
145
+ const configs = await primaryBuilder.compileConfigs();
146
+ const keystoneService = new KeystoneService_V1();
147
+ primaryKeystone = await keystoneService.genesis({
148
+ masterSecret: primarySecret,
149
+ emails: [email],
150
+ frameDetails: primaryBuilder.getFrameDetails(),
151
+ configs,
152
+ metaspace: tempDomainMetaspace,
153
+ space: tempSpace!,
154
+ isPrimary: true
155
+ });
125
156
 
126
- // 4. Resolve the custodian pool from the parent keystone using dynamic poolId
127
- const targetPoolId = `custodian-manage-${providerId}`;
128
- const custodianPool = parentKeystone.data?.challengePools?.find((p: any) => p.id === targetPoolId);
129
- if (!custodianPool) {
130
- return this.error(401, `Unauthorized: Custodian pool '${targetPoolId}' is not registered in the parent identity keystone.`);
131
- }
157
+ primaryTjpAddr = getTjpAddr({ ibGib: primaryKeystone, defaultIfNone: 'incomingAddr' })!;
132
158
 
133
- // 5. Assert allowed verbs contain KEYSTONE_VERB_MANAGE
134
- const allowedVerbs = custodianPool.config.allowedVerbs || [];
135
- if (!allowedVerbs.includes(KEYSTONE_VERB_MANAGE)) {
136
- return this.error(401, `Unauthorized: Custodian pool does not have the required manage permission.`);
137
- }
159
+ // Persist into permanent domain space & register index
160
+ const permanentMetaspace = await bootstrapDomainMetaspace(primaryTjpAddr, reqCtx.dataDir);
161
+ const permanentSpace = await permanentMetaspace.getLocalUserSpace({ lock: false });
138
162
 
139
- // 6. Cryptographically verify the custodian secret against the pool's challenges
140
- const strategy = KeystoneStrategyFactory.create({ config: custodianPool.config });
141
- const poolSecret = await strategy.derivePoolSecret({ masterSecret: custodianSecret });
163
+ await permanentMetaspace.put({ ibGibs: [primaryKeystone], space: permanentSpace! });
164
+ await permanentMetaspace.registerNewIbGib({ ibGib: primaryKeystone, space: permanentSpace! });
142
165
 
143
- for (const [id, challenge] of Object.entries(custodianPool.challenges)) {
144
- const solution = await strategy.generateSolution({
145
- poolSecret,
146
- poolId: custodianPool.id,
147
- challengeId: id
166
+ await indexService.registerEmailIndex({
167
+ email,
168
+ primaryTjpAddr
148
169
  });
149
- const hashValue = await strategy.generateChallenge({ solution });
150
- if (hashValue.hash !== (challenge as any).hash) {
151
- return this.error(401, 'Unauthorized: Cryptographic verification of custodian pool challenges failed.');
152
- }
153
170
  }
154
171
 
155
- // 7. Issue secure HttpOnly session cookie
156
- const sessionPayload = {
157
- parentTjpAddr,
158
- providerKey: userInfo.providerKey,
159
- exp: Math.floor(Date.now() / 1000) + 24 * 3600 // 24-hour expiration
160
- };
161
-
162
- const config = loadSsoServerConfig();
163
- const sessionToken = signSessionToken(sessionPayload, config.sessionSecret);
164
-
165
- const headers = {
166
- 'Set-Cookie': `space_gib_session=${sessionToken}; Path=/; HttpOnly; SameSite=Strict; Max-Age=86400`
167
- };
168
-
169
- console.log(`${lc} login successful for parent: ${parentTjpAddr}, custodian providerKey: ${userInfo.providerKey}`);
170
-
171
- return {
172
- status: 200,
173
- headers,
174
- body: {
175
- success: true,
176
- parentTjpAddr,
177
- custodianPoolId: custodianPool.id
178
- },
179
- isJson: true
172
+ // 3. Generate single-turn custodian requirements payload
173
+ const custodianReqs = await generateCustodianRequirements({
174
+ primaryTjpAddr,
175
+ serverSecret
176
+ });
177
+
178
+ const responseBody: SsoLoginResponseBody = {
179
+ success: true,
180
+ isNewIdentity,
181
+ primaryTjpAddr,
182
+ primaryKeystone,
183
+ custodianReqs,
184
+ userInfo,
185
+ message: isNewIdentity ? 'Created new custodian identity via SSO' : 'Looked up existing custodian identity via SSO'
180
186
  };
181
187
 
188
+ return this.ok(responseBody, 200);
182
189
  } catch (error) {
183
190
  const emsg = extractErrorMsg(error);
184
- console.error(`${lc} Login failed: ${emsg}`);
185
- return this.error(500, `Login failed: ${emsg}`);
191
+ console.error(`${lc} SSO login failed: ${emsg} (E: 4d5e6f7890123456e7f8901234567890)`);
192
+ return this.error(500, `SSO login failed: ${emsg}`);
186
193
  } finally {
187
194
  if (logalot) { console.log(`${lc} complete.`); }
188
195
  }
@@ -1,3 +1,6 @@
1
+ import * as path from 'path';
2
+
1
3
  export const DEFAULT_IDENTITY_INDEX_DIR_NAME = 'identity_index';
2
- export const DEFAULT_EMAIL_HASHES_SUBDIR = 'email_hashes';
3
- export const DEFAULT_IDENTITY_INDEX_SALT = 'ibgib_identity_salt_default_v1';
4
+ export const DEFAULT_EMAIL_HASHES_SUBDIR = path.join('email', 'hashes');
5
+ export const DEFAULT_EMAIL_PENDING_SUBDIR = path.join('email', 'pending');
6
+ export const DEFAULT_IDENTITY_INDEX_SALT = 'emailindex';
@@ -1,8 +1,12 @@
1
1
  import * as path from 'path';
2
- import { hash } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
2
+ import { extractErrorMsg, hash } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
3
3
  import { KEYSTONE_EMAIL_REGEXP } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
4
+
5
+ import { GLOBAL_LOG_A_LOT } from '../server-constants.mjs';
4
6
  import { DEFAULT_EMAIL_HASHES_SUBDIR, DEFAULT_IDENTITY_INDEX_SALT } from './identity-index-constants.mjs';
5
7
 
8
+ const logalot = GLOBAL_LOG_A_LOT || true;
9
+
6
10
  /**
7
11
  * Validates an email address against length constraints and KEYSTONE_EMAIL_REGEXP.
8
12
  * Returns an array of error message strings (empty `[]` if valid).
@@ -68,18 +72,28 @@ export function getShardedIndexPath({
68
72
  baseDir: string;
69
73
  emailHash: string;
70
74
  }): { folderPath: string; filePath: string; filename: string } {
71
- if (!emailHash || emailHash.length < 7) {
72
- throw new Error(`Invalid email hash string '${emailHash}'. Must be at least 7 characters. (E: 7aeb7885a7f1b4576899db283516d826)`);
73
- }
75
+ const lc = `[${getShardedIndexPath.name}]`;
76
+ try {
77
+ if (logalot) { console.log(`${lc} starting... (I: 3029e6a0fbf8b72988d694e8a0d53c26)`); }
74
78
 
75
- const f1 = emailHash.slice(0, 2);
76
- const f2 = emailHash.slice(2, 4);
77
- const f3 = emailHash.slice(4, 6);
78
- const remainingHash = emailHash.slice(6);
79
- const filename = `${remainingHash}.json`;
79
+ if (!emailHash || emailHash.length < 7) {
80
+ throw new Error(`Invalid email hash string '${emailHash}'. Must be at least 7 characters. (E: 7aeb7885a7f1b4576899db283516d826)`);
81
+ }
80
82
 
81
- const folderPath = path.join(baseDir, DEFAULT_EMAIL_HASHES_SUBDIR, f1, f2, f3);
82
- const filePath = path.join(folderPath, filename);
83
+ const f1 = emailHash.slice(0, 2);
84
+ const f2 = emailHash.slice(2, 4);
85
+ const f3 = emailHash.slice(4, 6);
86
+ const remainingHash = emailHash.slice(6);
87
+ const filename = `${remainingHash}.json`;
83
88
 
84
- return { folderPath, filePath, filename };
89
+ const folderPath = path.join(baseDir, DEFAULT_EMAIL_HASHES_SUBDIR, f1, f2, f3);
90
+ const filePath = path.join(folderPath, filename);
91
+
92
+ return { folderPath, filePath, filename };
93
+ } catch (error) {
94
+ console.error(`${lc} ${extractErrorMsg(error)}`);
95
+ throw error;
96
+ } finally {
97
+ if (logalot) { console.log(`${lc} complete.`); }
98
+ }
85
99
  }