@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.
- package/data/identity_index/email/hashes/32/13/49/e64f32730f01a61ada211f29eaf0a210fc2386b668ad04d7e8a9b16766.json +4 -0
- package/dist/email/email-helpers.d.mts.map +1 -1
- package/dist/email/email-helpers.mjs.map +1 -1
- package/dist/email/index.d.mts +3 -0
- package/dist/email/index.d.mts.map +1 -1
- package/dist/email/index.mjs +3 -0
- package/dist/email/index.mjs.map +1 -1
- package/dist/email/verify/email-verify-constants.d.mts +3 -0
- package/dist/email/verify/email-verify-constants.d.mts.map +1 -0
- package/dist/email/verify/email-verify-constants.mjs +3 -0
- package/dist/email/verify/email-verify-constants.mjs.map +1 -0
- package/dist/email/verify/email-verify-helpers.d.mts +107 -0
- package/dist/email/verify/email-verify-helpers.d.mts.map +1 -0
- package/dist/email/verify/email-verify-helpers.mjs +357 -0
- package/dist/email/verify/email-verify-helpers.mjs.map +1 -0
- package/dist/email/verify/email-verify-types.d.mts +41 -0
- package/dist/email/verify/email-verify-types.d.mts.map +1 -0
- package/dist/email/verify/email-verify-types.mjs +2 -0
- package/dist/email/verify/email-verify-types.mjs.map +1 -0
- package/dist/identity/sso/custodian-auth-helpers.d.mts +45 -0
- package/dist/identity/sso/custodian-auth-helpers.d.mts.map +1 -0
- package/dist/identity/sso/custodian-auth-helpers.mjs +108 -0
- package/dist/identity/sso/custodian-auth-helpers.mjs.map +1 -0
- package/dist/identity/sso/sso-config-helper.d.mts +7 -0
- package/dist/identity/sso/sso-config-helper.d.mts.map +1 -0
- package/dist/identity/sso/sso-config-helper.mjs +42 -0
- package/dist/identity/sso/sso-config-helper.mjs.map +1 -0
- package/dist/identity/sso/sso-custodian-service.d.mts +139 -0
- package/dist/identity/sso/sso-custodian-service.d.mts.map +1 -0
- package/dist/identity/sso/sso-custodian-service.mjs +471 -0
- package/dist/identity/sso/sso-custodian-service.mjs.map +1 -0
- package/dist/identity/sso/sso-types.d.mts +71 -0
- package/dist/identity/sso/sso-types.d.mts.map +1 -0
- package/dist/identity/sso/sso-types.mjs +7 -0
- package/dist/identity/sso/sso-types.mjs.map +1 -0
- package/dist/index.d.mts +5 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +5 -1
- package/dist/index.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/email/email-outbound.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs +9 -2
- package/dist/serve-gib/handlers/api/email/email-outbound.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/email/email-verification-code.handler.d.mts +29 -0
- package/dist/serve-gib/handlers/api/email/email-verification-code.handler.d.mts.map +1 -0
- package/dist/serve-gib/handlers/api/email/email-verification-code.handler.mjs +149 -0
- package/dist/serve-gib/handlers/api/email/email-verification-code.handler.mjs.map +1 -0
- package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.d.mts +24 -0
- package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.d.mts.map +1 -0
- package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mjs +212 -0
- package/dist/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mjs.map +1 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.d.mts +37 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.d.mts.map +1 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mjs +192 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mjs.map +1 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.d.mts +33 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.d.mts.map +1 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mjs +173 -0
- package/dist/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mjs.map +1 -0
- package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs +2 -3
- package/dist/serve-gib/handlers/api/keystone/keystone-check-email.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs +38 -3
- package/dist/serve-gib/handlers/api/keystone/keystone-evolve.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs +54 -24
- package/dist/serve-gib/handlers/api/keystone/keystone-genesis.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs +13 -13
- package/dist/serve-gib/handlers/api/keystone/keystone-lookup.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs +1 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-post.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs +3 -3
- package/dist/serve-gib/handlers/api/keystone/sso-config.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/sso-link.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs +28 -15
- package/dist/serve-gib/handlers/api/keystone/sso-link.handler.mjs.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts +29 -15
- package/dist/serve-gib/handlers/api/keystone/sso-login.handler.d.mts.map +1 -1
- package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs +105 -108
- package/dist/serve-gib/handlers/api/keystone/sso-login.handler.mjs.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-constants.d.mts +3 -2
- package/dist/serve-gib/identity-index/identity-index-constants.d.mts.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-constants.mjs +4 -2
- package/dist/serve-gib/identity-index/identity-index-constants.mjs.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-helpers.d.mts.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-helpers.mjs +28 -11
- package/dist/serve-gib/identity-index/identity-index-helpers.mjs.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-service.d.mts +20 -3
- package/dist/serve-gib/identity-index/identity-index-service.d.mts.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-service.mjs +134 -18
- package/dist/serve-gib/identity-index/identity-index-service.mjs.map +1 -1
- package/dist/serve-gib/identity-index/identity-index-types.d.mts +4 -2
- package/dist/serve-gib/identity-index/identity-index-types.d.mts.map +1 -1
- package/dist/serve-gib/index.d.mts +4 -0
- package/dist/serve-gib/index.d.mts.map +1 -1
- package/dist/serve-gib/index.mjs +12 -0
- package/dist/serve-gib/index.mjs.map +1 -1
- package/dist/serve-gib/path-constants.d.mts +17 -0
- package/dist/serve-gib/path-constants.d.mts.map +1 -1
- package/dist/serve-gib/path-constants.mjs +17 -0
- package/dist/serve-gib/path-constants.mjs.map +1 -1
- package/e2e/identity-custodian-lifecycle.e2e.md +93 -0
- package/e2e/identity-sso-lifecycle.e2e.md +132 -0
- package/package.json +5 -5
- package/src/email/email-helpers.mts +0 -1
- package/src/email/index.mts +3 -0
- package/src/email/verify/email-verify-constants.mts +3 -0
- package/src/email/verify/email-verify-helpers.mts +466 -0
- package/src/email/verify/email-verify-types.mts +47 -0
- package/src/identity/sso/custodian-auth-helpers.mts +146 -0
- package/src/identity/sso/custodian-auth-helpers.respec.mts +97 -0
- package/src/identity/sso/sso-config-helper.mts +52 -0
- package/src/identity/sso/sso-custodian-service.mts +566 -0
- package/src/identity/sso/sso-custodian-service.respec.mts +297 -0
- package/src/identity/sso/sso-types.mts +80 -0
- package/src/index.mts +14 -0
- package/src/serve-gib/handlers/api/email/email-outbound.handler.mts +8 -2
- package/src/serve-gib/handlers/api/email/email-verification-code.handler.mts +163 -0
- package/src/serve-gib/handlers/api/email/email-verify-code-onetime.handler.mts +231 -0
- package/src/serve-gib/handlers/api/email/email-verify.respec.mts +183 -0
- package/src/serve-gib/handlers/api/identity/keystone-custodian-genesis.handler.mts +233 -0
- package/src/serve-gib/handlers/api/identity/keystone-custodian-genesis.respec.mts +93 -0
- package/src/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.handler.mts +210 -0
- package/src/serve-gib/handlers/api/identity/keystone-custodian-register-delegate.respec.mts +112 -0
- package/src/serve-gib/handlers/api/keystone/keystone-check-email.handler.mts +2 -4
- package/src/serve-gib/handlers/api/keystone/keystone-evolve.handler.mts +42 -3
- package/src/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +46 -23
- package/src/serve-gib/handlers/api/keystone/keystone-lookup.handler.mts +11 -15
- package/src/serve-gib/handlers/api/keystone/keystone-post.handler.mts +1 -1
- package/src/serve-gib/handlers/api/keystone/sso-config.handler.mts +3 -3
- package/src/serve-gib/handlers/api/keystone/sso-link.handler.mts +29 -17
- package/src/serve-gib/handlers/api/keystone/sso-login.handler.mts +132 -125
- package/src/serve-gib/identity-index/identity-index-constants.mts +5 -2
- package/src/serve-gib/identity-index/identity-index-helpers.mts +26 -12
- package/src/serve-gib/identity-index/identity-index-service.mts +133 -16
- package/src/serve-gib/identity-index/identity-index-service.respec.mts +1 -1
- package/src/serve-gib/identity-index/identity-index-types.mts +4 -2
- package/src/serve-gib/index.mts +12 -0
- package/src/serve-gib/path-constants.mts +20 -0
- package/tsconfig.json +2 -2
- package/tsconfig.test.json +1 -1
- package/dist/assumptions.respec.d.mts +0 -2
- package/dist/assumptions.respec.d.mts.map +0 -1
- package/dist/assumptions.respec.mjs +0 -41
- package/dist/assumptions.respec.mjs.map +0 -1
- package/dist/email/email-service.respec.d.mts +0 -2
- package/dist/email/email-service.respec.d.mts.map +0 -1
- package/dist/email/email-service.respec.mjs +0 -115
- package/dist/email/email-service.respec.mjs.map +0 -1
- package/dist/serve-gib/bootstrap-helper.respec.d.mts +0 -2
- package/dist/serve-gib/bootstrap-helper.respec.d.mts.map +0 -1
- package/dist/serve-gib/bootstrap-helper.respec.mjs +0 -85
- package/dist/serve-gib/bootstrap-helper.respec.mjs.map +0 -1
- package/dist/serve-gib/handlers/api/health.respec.d.mts +0 -2
- package/dist/serve-gib/handlers/api/health.respec.d.mts.map +0 -1
- package/dist/serve-gib/handlers/api/health.respec.mjs +0 -47
- package/dist/serve-gib/handlers/api/health.respec.mjs.map +0 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts +0 -2
- package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.d.mts.map +0 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs +0 -98
- package/dist/serve-gib/handlers/api/keystone/keystone-get.respec.mjs.map +0 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts +0 -2
- package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.d.mts.map +0 -1
- package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs +0 -131
- package/dist/serve-gib/handlers/api/keystone/keystone-post.respec.mjs.map +0 -1
- package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts +0 -2
- package/dist/serve-gib/identity-index/identity-index-service.respec.d.mts.map +0 -1
- package/dist/serve-gib/identity-index/identity-index-service.respec.mjs +0 -109
- package/dist/serve-gib/identity-index/identity-index-service.respec.mjs.map +0 -1
- package/dist/serve-gib/keystone-schema-helpers.respec.d.mts +0 -2
- package/dist/serve-gib/keystone-schema-helpers.respec.d.mts.map +0 -1
- package/dist/serve-gib/keystone-schema-helpers.respec.mjs +0 -68
- package/dist/serve-gib/keystone-schema-helpers.respec.mjs.map +0 -1
- package/dist/serve-gib/path-helper.respec.d.mts +0 -2
- package/dist/serve-gib/path-helper.respec.d.mts.map +0 -1
- package/dist/serve-gib/path-helper.respec.mjs +0 -83
- package/dist/serve-gib/path-helper.respec.mjs.map +0 -1
- package/dist/serve-gib/serve-gib.respec.d.mts +0 -2
- package/dist/serve-gib/serve-gib.respec.d.mts.map +0 -1
- package/dist/serve-gib/serve-gib.respec.mjs +0 -85
- package/dist/serve-gib/serve-gib.respec.mjs.map +0 -1
- package/dist/spec-helper.node.respec.d.mts +0 -13
- package/dist/spec-helper.node.respec.d.mts.map +0 -1
- package/dist/spec-helper.node.respec.mjs +0 -50
- package/dist/spec-helper.node.respec.mjs.map +0 -1
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
- 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
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs +0 -52
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_createAndInit.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
- 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
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs +0 -53
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_persistTransformResult.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.d.mts +0 -2
- 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
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs +0 -59
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_putGetDelete.node-indexed-filesystem-space-v1.respec.mjs.map +0 -1
- 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
- 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
- package/dist/witness/space/node-filesystem-space/node-indexed-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-indexed-filesystem-space-v1.respec.mjs +0 -55
- 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
- package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs +0 -67
- package/dist/witness/space/node-filesystem-space/respec/testSpace_createAndInit.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs +0 -67
- package/dist/witness/space/node-filesystem-space/respec/testSpace_persistTransformResult.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs +0 -68
- package/dist/witness/space/node-filesystem-space/respec/testSpace_putGetDelete.node-filesystem-space-v1.respec.mjs.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts +0 -2
- package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.d.mts.map +0 -1
- package/dist/witness/space/node-filesystem-space/respec/testSpace_registerNewIbGib_GetLatest.node-filesystem-space-v1.respec.mjs +0 -69
- 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
|
|
10
|
-
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
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 =
|
|
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
|
|
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 ${
|
|
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
|
|
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 '
|
|
3
|
-
import { SsoCustodianService } from '
|
|
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
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 {
|
|
17
|
+
import { ServeGibHandlerBase } from '../../handler-base.mjs';
|
|
12
18
|
import { API_PATH_REGEXES } from '../../../path-constants.mjs';
|
|
13
|
-
import {
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|
|
60
|
-
|
|
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(
|
|
66
|
+
protected override async validateQueryParams(): Promise<string[]> {
|
|
75
67
|
return [];
|
|
76
68
|
}
|
|
77
69
|
|
|
78
|
-
protected async handleRouteImpl(
|
|
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 (
|
|
84
|
-
return this.error(
|
|
77
|
+
if (reqCtx.method !== 'POST') {
|
|
78
|
+
return this.error(405, 'Method Not Allowed');
|
|
85
79
|
}
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
|
|
81
|
+
if (!reqCtx.body) {
|
|
82
|
+
return this.error(400, 'Request body is empty (E: 0a1b2c3d4e5f67890a1b2c3d4e5f6789)');
|
|
88
83
|
}
|
|
89
84
|
|
|
90
|
-
let parsed:
|
|
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
|
|
103
|
-
if (!
|
|
104
|
-
return this.error(
|
|
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
|
-
|
|
112
|
-
|
|
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
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
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
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
140
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
//
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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}
|
|
185
|
-
return this.error(500, `
|
|
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 = '
|
|
3
|
-
export const
|
|
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
|
-
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
const lc = `[${getShardedIndexPath.name}]`;
|
|
76
|
+
try {
|
|
77
|
+
if (logalot) { console.log(`${lc} starting... (I: 3029e6a0fbf8b72988d694e8a0d53c26)`); }
|
|
74
78
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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
|
}
|