@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
|
@@ -1,22 +1,74 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
import { extractErrorMsg, pretty } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
|
|
2
5
|
import { IbGibAddr } from '@ibgib/ts-gib/dist/types.mjs';
|
|
3
|
-
|
|
6
|
+
|
|
7
|
+
import { GLOBAL_LOG_A_LOT } from '../server-constants.mjs';
|
|
8
|
+
import { DEFAULT_IDENTITY_INDEX_SALT, DEFAULT_IDENTITY_INDEX_DIR_NAME } from './identity-index-constants.mjs';
|
|
4
9
|
import { getIdentityEmailHash, getShardedIndexPath } from './identity-index-helpers.mjs';
|
|
5
10
|
import { IdentityIndexRecord, IdentityIndexServiceOptions, RegisterEmailIndexResult } from './identity-index-types.mjs';
|
|
6
11
|
|
|
12
|
+
const logalot = GLOBAL_LOG_A_LOT || true;
|
|
13
|
+
|
|
7
14
|
/**
|
|
8
15
|
* Service managing atomic, sharded identity index files for backwards email -> primary identity tjpAddr lookups.
|
|
9
16
|
*/
|
|
10
17
|
export class IdentityIndexService {
|
|
18
|
+
private lc = `[${IdentityIndexService.name}]`;
|
|
11
19
|
private baseDir: string;
|
|
12
20
|
private salt: string;
|
|
13
21
|
|
|
14
|
-
constructor(
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
constructor(options?: IdentityIndexServiceOptions) {
|
|
23
|
+
const { baseDir, dataDir, salt } = options ?? {};
|
|
24
|
+
const finalDataDir = dataDir || process.env.DATA_DIR || 'data';
|
|
25
|
+
this.baseDir = baseDir || process.env.IDENTITY_INDEX_BASE_DIR || path.join(finalDataDir, DEFAULT_IDENTITY_INDEX_DIR_NAME);
|
|
17
26
|
this.salt = salt || process.env.IDENTITY_INDEX_SALT || DEFAULT_IDENTITY_INDEX_SALT;
|
|
18
27
|
}
|
|
19
28
|
|
|
29
|
+
// /**
|
|
30
|
+
// * Static helper to register an email index.
|
|
31
|
+
// * @deprecated Use `getIdentityIndexService().registerEmailIndex(...)` instead.
|
|
32
|
+
// */
|
|
33
|
+
// static async registerEmailIndex(opts: {
|
|
34
|
+
// email: string;
|
|
35
|
+
// primaryTjpAddr: IbGibAddr;
|
|
36
|
+
// dataDir?: string;
|
|
37
|
+
// baseDir?: string;
|
|
38
|
+
// salt?: string;
|
|
39
|
+
// }): Promise<RegisterEmailIndexResult> {
|
|
40
|
+
// return getIdentityIndexService().registerEmailIndex({
|
|
41
|
+
// email: opts.email,
|
|
42
|
+
// primaryTjpAddr: opts.primaryTjpAddr
|
|
43
|
+
// });
|
|
44
|
+
// }
|
|
45
|
+
|
|
46
|
+
// /**
|
|
47
|
+
// * Static helper to lookup an identity record by email address.
|
|
48
|
+
// * @deprecated Use `getIdentityIndexService().lookupIdentityByEmail(...)` instead.
|
|
49
|
+
// */
|
|
50
|
+
// static async lookupIdentityByEmail(opts: {
|
|
51
|
+
// email: string;
|
|
52
|
+
// dataDir?: string;
|
|
53
|
+
// baseDir?: string;
|
|
54
|
+
// salt?: string;
|
|
55
|
+
// }): Promise<{ primaryTjpAddr: IbGibAddr; tjpAddr: IbGibAddr; createdAt: number } | undefined> {
|
|
56
|
+
// return getIdentityIndexService().lookupIdentityByEmail({ email: opts.email });
|
|
57
|
+
// }
|
|
58
|
+
|
|
59
|
+
// /**
|
|
60
|
+
// * Static helper to unregister an email index.
|
|
61
|
+
// * @deprecated Use `getIdentityIndexService().unregisterEmailIndex(...)` instead.
|
|
62
|
+
// */
|
|
63
|
+
// static async unregisterEmailIndex(opts: {
|
|
64
|
+
// email: string;
|
|
65
|
+
// dataDir?: string;
|
|
66
|
+
// baseDir?: string;
|
|
67
|
+
// salt?: string;
|
|
68
|
+
// }): Promise<boolean> {
|
|
69
|
+
// return getIdentityIndexService().unregisterEmailIndex({ email: opts.email });
|
|
70
|
+
// }
|
|
71
|
+
|
|
20
72
|
/**
|
|
21
73
|
* Registers an email to a primary identity tjpAddr.
|
|
22
74
|
* Uses atomic OS file creation (`flag: 'wx'`) to guarantee single-server ACID uniqueness.
|
|
@@ -25,17 +77,24 @@ export class IdentityIndexService {
|
|
|
25
77
|
async registerEmailIndex({
|
|
26
78
|
email,
|
|
27
79
|
tjpAddr,
|
|
80
|
+
primaryTjpAddr,
|
|
28
81
|
}: {
|
|
29
82
|
email: string;
|
|
30
|
-
tjpAddr
|
|
83
|
+
tjpAddr?: IbGibAddr;
|
|
84
|
+
primaryTjpAddr?: IbGibAddr;
|
|
31
85
|
}): Promise<RegisterEmailIndexResult> {
|
|
86
|
+
const targetAddr = tjpAddr || primaryTjpAddr;
|
|
87
|
+
if (!targetAddr) { throw new Error('Either tjpAddr or primaryTjpAddr must be provided. (E: 62f15851b9a8c8d718279ab84e426826)'); }
|
|
32
88
|
const emailHash = await getIdentityEmailHash({ email, salt: this.salt });
|
|
33
|
-
const { folderPath, filePath } = getShardedIndexPath({
|
|
89
|
+
const { folderPath, filePath } = getShardedIndexPath({
|
|
90
|
+
baseDir: this.baseDir,
|
|
91
|
+
emailHash
|
|
92
|
+
});
|
|
34
93
|
|
|
35
94
|
await fs.mkdir(folderPath, { recursive: true });
|
|
36
95
|
|
|
37
96
|
const record: IdentityIndexRecord = {
|
|
38
|
-
tjpAddr,
|
|
97
|
+
tjpAddr: targetAddr,
|
|
39
98
|
createdAt: Date.now(),
|
|
40
99
|
};
|
|
41
100
|
|
|
@@ -50,6 +109,24 @@ export class IdentityIndexService {
|
|
|
50
109
|
}
|
|
51
110
|
}
|
|
52
111
|
|
|
112
|
+
/**
|
|
113
|
+
* Retrieves the registered identity info for an email address.
|
|
114
|
+
* Returns `undefined` if email is not indexed.
|
|
115
|
+
*/
|
|
116
|
+
async lookupIdentityByEmail({
|
|
117
|
+
email,
|
|
118
|
+
}: {
|
|
119
|
+
email: string;
|
|
120
|
+
}): Promise<{ primaryTjpAddr: IbGibAddr; tjpAddr: IbGibAddr; createdAt: number } | undefined> {
|
|
121
|
+
const record = await this.getEmailIndex({ email });
|
|
122
|
+
if (!record) { return undefined; }
|
|
123
|
+
return {
|
|
124
|
+
primaryTjpAddr: record.tjpAddr,
|
|
125
|
+
tjpAddr: record.tjpAddr,
|
|
126
|
+
createdAt: record.createdAt,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
53
130
|
/**
|
|
54
131
|
* Retrieves the registered `IdentityIndexRecord` for an email address.
|
|
55
132
|
* Returns `undefined` if email is not indexed.
|
|
@@ -59,8 +136,24 @@ export class IdentityIndexService {
|
|
|
59
136
|
}: {
|
|
60
137
|
email: string;
|
|
61
138
|
}): Promise<IdentityIndexRecord | undefined> {
|
|
62
|
-
const
|
|
63
|
-
|
|
139
|
+
const lc = `${this.lc}[${this.getEmailIndex.name}]`;
|
|
140
|
+
try {
|
|
141
|
+
if (logalot) { console.log(`${lc} starting... (I: 3cd3e8e7bd88e193668a8d842d326826)`); }
|
|
142
|
+
|
|
143
|
+
const emailHash = await getIdentityEmailHash({ email, salt: this.salt });
|
|
144
|
+
if (logalot) { console.log(`${lc} emailHash: ${emailHash} (I: cae3161784e8eb00e5c6128a17aadf26)`); }
|
|
145
|
+
|
|
146
|
+
const emailIndex = this.getEmailIndexByHash({ emailHash });
|
|
147
|
+
|
|
148
|
+
if (logalot) { console.log(`${lc} emailIndex: ${emailIndex ? pretty(emailIndex) : 'undefined'} (I: dce1a8387affbd99c85f970853eac826)`); }
|
|
149
|
+
|
|
150
|
+
return emailIndex;
|
|
151
|
+
} catch (error) {
|
|
152
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
153
|
+
throw error;
|
|
154
|
+
} finally {
|
|
155
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
156
|
+
}
|
|
64
157
|
}
|
|
65
158
|
|
|
66
159
|
/**
|
|
@@ -72,16 +165,28 @@ export class IdentityIndexService {
|
|
|
72
165
|
}: {
|
|
73
166
|
emailHash: string;
|
|
74
167
|
}): Promise<IdentityIndexRecord | undefined> {
|
|
75
|
-
const
|
|
168
|
+
const lc = `${this.lc}[${this.getEmailIndexByHash.name}]`;
|
|
76
169
|
try {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
170
|
+
if (logalot) { console.log(`${lc} starting... (I: 206328babd08908ad876fd69a4b37826)`); }
|
|
171
|
+
|
|
172
|
+
const { filePath } = getShardedIndexPath({ baseDir: this.baseDir, emailHash });
|
|
173
|
+
if (logalot) { console.log(`${lc} filePath: ${filePath} (I: e8f318aabc06320db8b0c3c8b34c5926)`); }
|
|
174
|
+
try {
|
|
175
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
176
|
+
const record: IdentityIndexRecord = JSON.parse(content);
|
|
177
|
+
return record;
|
|
178
|
+
} catch (error: any) {
|
|
179
|
+
if (error.code === 'ENOENT') {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
throw error;
|
|
83
183
|
}
|
|
184
|
+
|
|
185
|
+
} catch (error) {
|
|
186
|
+
console.error(`${lc} ${extractErrorMsg(error)}`);
|
|
84
187
|
throw error;
|
|
188
|
+
} finally {
|
|
189
|
+
if (logalot) { console.log(`${lc} complete.`); }
|
|
85
190
|
}
|
|
86
191
|
}
|
|
87
192
|
|
|
@@ -107,3 +212,15 @@ export class IdentityIndexService {
|
|
|
107
212
|
}
|
|
108
213
|
}
|
|
109
214
|
}
|
|
215
|
+
|
|
216
|
+
let _identityIndexService: IdentityIndexService | undefined;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Singleton factory getter for the IdentityIndexService.
|
|
220
|
+
*/
|
|
221
|
+
export function getIdentityIndexService(): IdentityIndexService {
|
|
222
|
+
if (!_identityIndexService) {
|
|
223
|
+
_identityIndexService = new IdentityIndexService();
|
|
224
|
+
}
|
|
225
|
+
return _identityIndexService;
|
|
226
|
+
}
|
|
@@ -56,7 +56,7 @@ await respecfully(sir, 'IdentityIndexService & Helpers', async () => {
|
|
|
56
56
|
const fullHash = 'abcdef1234567890abcdef1234567890';
|
|
57
57
|
const { folderPath, filePath, filename } = getShardedIndexPath({ baseDir: TEST_BASE_DIR, emailHash: fullHash });
|
|
58
58
|
|
|
59
|
-
const expectedSubfolder = path.join(TEST_BASE_DIR, '
|
|
59
|
+
const expectedSubfolder = path.join(TEST_BASE_DIR, 'email', 'hashes', 'ab', 'cd', 'ef');
|
|
60
60
|
iReckon(sir, folderPath).willEqual(expectedSubfolder);
|
|
61
61
|
|
|
62
62
|
// Filename strips the leading 6 chars ('abcdef')
|
|
@@ -14,8 +14,10 @@ export interface IdentityIndexRecord {
|
|
|
14
14
|
* Configuration options for initializing IdentityIndexService.
|
|
15
15
|
*/
|
|
16
16
|
export interface IdentityIndexServiceOptions {
|
|
17
|
-
/** Base directory where index shards will be stored (e.g. `data/
|
|
18
|
-
baseDir
|
|
17
|
+
/** Base directory where index shards will be stored (e.g. `data/identity_index`). */
|
|
18
|
+
baseDir?: string;
|
|
19
|
+
/** Server root data directory (e.g. `data`). If baseDir is omitted, `baseDir` defaults to `path.join(dataDir, DEFAULT_IDENTITY_INDEX_DIR_NAME)`. */
|
|
20
|
+
dataDir?: string;
|
|
19
21
|
/** Server salt for privacy email hashing. Defaults to `DEFAULT_IDENTITY_INDEX_SALT`. */
|
|
20
22
|
salt?: string;
|
|
21
23
|
}
|
package/src/serve-gib/index.mts
CHANGED
|
@@ -34,8 +34,12 @@ export * from './handlers/api/keystone/keystone-check-email.handler.mjs';
|
|
|
34
34
|
export * from './handlers/api/keystone/sso-config.handler.mjs';
|
|
35
35
|
export * from './handlers/api/keystone/sso-link.handler.mjs';
|
|
36
36
|
export * from './handlers/api/keystone/sso-login.handler.mjs';
|
|
37
|
+
export * from './handlers/api/identity/keystone-custodian-genesis.handler.mjs';
|
|
38
|
+
export * from './handlers/api/identity/keystone-custodian-register-delegate.handler.mjs';
|
|
37
39
|
export * from './handlers/api/email/email-inbound.handler.mjs';
|
|
38
40
|
export * from './handlers/api/email/email-outbound.handler.mjs';
|
|
41
|
+
export * from './handlers/api/email/email-verification-code.handler.mjs';
|
|
42
|
+
export * from './handlers/api/email/email-verify-code-onetime.handler.mjs';
|
|
39
43
|
export * from './handlers/api/debug/ws-echo.handler.mjs';
|
|
40
44
|
export * from './handlers/ws/ws-types.mjs';
|
|
41
45
|
export * from './handlers/ws/ws-helper.mjs';
|
|
@@ -54,8 +58,12 @@ import { KeystoneCheckEmailHandler } from './handlers/api/keystone/keystone-chec
|
|
|
54
58
|
import { SsoLinkHandler } from './handlers/api/keystone/sso-link.handler.mjs';
|
|
55
59
|
import { SsoLoginHandler } from './handlers/api/keystone/sso-login.handler.mjs';
|
|
56
60
|
import { SsoConfigHandler } from './handlers/api/keystone/sso-config.handler.mjs';
|
|
61
|
+
import { KeystoneCustodianGenesisHandler } from './handlers/api/identity/keystone-custodian-genesis.handler.mjs';
|
|
62
|
+
import { KeystoneCustodianRegisterDelegateHandler } from './handlers/api/identity/keystone-custodian-register-delegate.handler.mjs';
|
|
57
63
|
import { EmailInboundHandler } from './handlers/api/email/email-inbound.handler.mjs';
|
|
58
64
|
import { EmailOutboundHandler } from './handlers/api/email/email-outbound.handler.mjs';
|
|
65
|
+
import { EmailVerificationCodeHandler } from './handlers/api/email/email-verification-code.handler.mjs';
|
|
66
|
+
import { EmailVerifyCodeOnetimeHandler } from './handlers/api/email/email-verify-code-onetime.handler.mjs';
|
|
59
67
|
import { StaticFileHandler } from './handlers/static-handler.mjs';
|
|
60
68
|
|
|
61
69
|
export interface StandardHandlersOptions {
|
|
@@ -79,8 +87,12 @@ export function getStandardServeGibHandlers(opts: StandardHandlersOptions = {}):
|
|
|
79
87
|
new SsoLinkHandler(),
|
|
80
88
|
new SsoLoginHandler(),
|
|
81
89
|
new SsoConfigHandler(),
|
|
90
|
+
new KeystoneCustodianGenesisHandler(),
|
|
91
|
+
new KeystoneCustodianRegisterDelegateHandler(),
|
|
82
92
|
new EmailInboundHandler(),
|
|
83
93
|
new EmailOutboundHandler(),
|
|
94
|
+
new EmailVerificationCodeHandler(),
|
|
95
|
+
new EmailVerifyCodeOnetimeHandler(),
|
|
84
96
|
];
|
|
85
97
|
|
|
86
98
|
if (opts.clientDir) {
|
|
@@ -114,6 +114,26 @@ export const API_PATH_REGEXES = {
|
|
|
114
114
|
* /api/email/send
|
|
115
115
|
*/
|
|
116
116
|
EMAIL_SEND: /^\/api\/email\/send\/?$/,
|
|
117
|
+
/**
|
|
118
|
+
* /api/email/verification-code
|
|
119
|
+
*/
|
|
120
|
+
EMAIL_VERIFICATION_CODE: /^\/api\/email\/verification-code\/?$/,
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* /api/email/verify or /api/email/verify-code
|
|
124
|
+
*/
|
|
125
|
+
EMAIL_VERIFY: /^\/api\/email\/verify\/?$/,
|
|
126
|
+
EMAIL_VERIFY_CODE: /^\/api\/email\/verify-code\/?$/,
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* /api/identity/custodian/genesis
|
|
130
|
+
*/
|
|
131
|
+
KEYSTONE_CUSTODIAN_GENESIS: /^\/api\/identity\/custodian\/genesis\/?$/i,
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* /api/identity/custodian/register-delegate
|
|
135
|
+
*/
|
|
136
|
+
KEYSTONE_CUSTODIAN_REGISTER_DELEGATE: /^\/api\/identity\/custodian\/register-delegate\/?$/i,
|
|
117
137
|
};
|
|
118
138
|
|
|
119
139
|
export const VALID_STATIC_PATH_REGEX = /^\/[a-zA-Z0-9\-_\.\/]*$/;
|
package/tsconfig.json
CHANGED
package/tsconfig.test.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assumptions.respec.d.mts","sourceRoot":"","sources":["../src/assumptions.respec.mts"],"names":[],"mappings":""}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { ifWe, iReckon, respecfully } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
2
|
-
const maam = `[${import.meta.url}]`, sir = maam;
|
|
3
|
-
/**
|
|
4
|
-
* wrapper that uses crypto.subtle under the hood (i.e. doesn't hash using ts-gib)
|
|
5
|
-
*
|
|
6
|
-
* notes:
|
|
7
|
-
*
|
|
8
|
-
* * i did in fact copy this from ts-gib though, but we're testing simply that the
|
|
9
|
-
* context (node/browser/whatever) has this since it's integral to all things ibgib.
|
|
10
|
-
*/
|
|
11
|
-
async function cryptoSubtleHash({ s, algorithm = 'SHA-256', }) {
|
|
12
|
-
let { subtle } = globalThis.crypto;
|
|
13
|
-
if (!s) {
|
|
14
|
-
throw new Error(`[${cryptoSubtleHash.name}] s is required`);
|
|
15
|
-
}
|
|
16
|
-
if (!algorithm) {
|
|
17
|
-
throw new Error(`[${cryptoSubtleHash.name}] algorithm is required`);
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
const msgUint8 = new TextEncoder().encode(s);
|
|
21
|
-
const buffer = await subtle.digest(algorithm, msgUint8);
|
|
22
|
-
const asArray = Array.from(new Uint8Array(buffer));
|
|
23
|
-
return asArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
24
|
-
}
|
|
25
|
-
catch (e) {
|
|
26
|
-
console.error(e.message ?? e);
|
|
27
|
-
throw e;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
await respecfully(sir, `non-ts-gib isomorphic crypto hashing`, async () => {
|
|
31
|
-
await ifWe(sir, `should digest simple string consistently using crypto.subtle directly `, async () => {
|
|
32
|
-
let h = await cryptoSubtleHash({ s: '42' });
|
|
33
|
-
iReckon(sir, h).asTo('42').isGonnaBe('73475cb40a568e8da8a045ced110137e159f890ac4da883b6b17dc651b3a8049');
|
|
34
|
-
});
|
|
35
|
-
await ifWe(sir, `should digest simple stringified ibgib consistently using crypto.subtle directly `, async () => {
|
|
36
|
-
let ibgib = { ib: 'ib', gib: 'gib' };
|
|
37
|
-
let h = await cryptoSubtleHash({ s: JSON.stringify(ibgib) }); // doesn't use ts-gib but consistent stringifying json is important
|
|
38
|
-
iReckon(sir, h).asTo('ib^gib').isGonnaBe('cbad0694a257358c044611ea1fa88ace71a01a9b8409d2354d0387d8043f7671');
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
//# sourceMappingURL=assumptions.respec.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assumptions.respec.mjs","sourceRoot":"","sources":["../src/assumptions.respec.mts"],"names":[],"mappings":"AAAA,OAAO,EACsB,IAAI,EAElB,OAAO,EAAE,WAAW,EAClC,MAAM,kDAAkD,CAAC;AAC1D,MAAM,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;AAGhD;;;;;;;GAOG;AACH,KAAK,UAAU,gBAAgB,CAAC,EAC5B,CAAC,EACD,SAAS,GAAG,SAAS,GAIxB;IACG,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;IACnC,IAAI,CAAC,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,iBAAiB,CAAC,CAAA;IAAC,CAAC;IACvE,IAAI,CAAC,SAAS,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,IAAI,gBAAgB,CAAC,IAAI,yBAAyB,CAAC,CAAA;IAAC,CAAC;IACvF,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,CAAC;IACZ,CAAC;AACL,CAAC;AAED,MAAM,WAAW,CAAC,GAAG,EAAE,sCAAsC,EAAE,KAAK,IAAI,EAAE;IAEtE,MAAM,IAAI,CAAC,GAAG,EAAE,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACjG,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,GAAG,EAAE,mFAAmF,EAAE,KAAK,IAAI,EAAE;QAC5G,IAAI,KAAK,GAAa,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,mEAAmE;QACjI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;AAEP,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-service.respec.d.mts","sourceRoot":"","sources":["../../src/email/email-service.respec.mts"],"names":[],"mappings":""}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { iReckon, ifWe, respecfully } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
2
|
-
import { createAwsSigV4Headers } from './aws/aws-sigv4-helper.mjs';
|
|
3
|
-
import { EmailReceiverAws } from './aws/email-receiver-aws.mjs';
|
|
4
|
-
import { formatEmailAddress, formatRawMimeString, parseEmailAddress, parseRawMimeHeaders, validateEmail } from './email-helpers.mjs';
|
|
5
|
-
import { EmailSenderMock } from './mock/email-sender-mock.mjs';
|
|
6
|
-
const sir = `[${import.meta.url}]`;
|
|
7
|
-
await respecfully(sir, 'Email Infrastructure & Drivers', async () => {
|
|
8
|
-
await ifWe(sir, 'validate email addresses accurately using validateEmail', async () => {
|
|
9
|
-
iReckon(sir, validateEmail('user@example.com')).asTo('valid email').isGonnaBe(true);
|
|
10
|
-
iReckon(sir, validateEmail('user.name+tag@domain.co.uk')).asTo('valid tagged email').isGonnaBe(true);
|
|
11
|
-
iReckon(sir, validateEmail('invalid-email')).asTo('invalid format without @').isGonnaBe(false);
|
|
12
|
-
iReckon(sir, validateEmail('user@')).asTo('missing domain').isGonnaBe(false);
|
|
13
|
-
iReckon(sir, validateEmail('')).asTo('empty string').isGonnaBe(false);
|
|
14
|
-
});
|
|
15
|
-
await ifWe(sir, 'parse and format email addresses correctly', async () => {
|
|
16
|
-
const parsed1 = parseEmailAddress('Alice <alice@example.com>');
|
|
17
|
-
iReckon(sir, parsed1.address).asTo('parsed address').isGonnaBe('alice@example.com');
|
|
18
|
-
iReckon(sir, parsed1.name).asTo('parsed name').isGonnaBe('Alice');
|
|
19
|
-
const formatted = formatEmailAddress({ name: 'Bob', address: 'bob@example.com' });
|
|
20
|
-
iReckon(sir, formatted).asTo('formatted address').isGonnaBe('"Bob" <bob@example.com>');
|
|
21
|
-
});
|
|
22
|
-
await ifWe(sir, 'format and parse raw MIME headers and strings', async () => {
|
|
23
|
-
const mimeStr = formatRawMimeString({
|
|
24
|
-
from: { name: 'Sender', address: 'sender@example.com' },
|
|
25
|
-
to: ['receiver@example.com'],
|
|
26
|
-
subject: 'Test Subject',
|
|
27
|
-
textBody: 'Hello World',
|
|
28
|
-
});
|
|
29
|
-
const headers = parseRawMimeHeaders(mimeStr);
|
|
30
|
-
iReckon(sir, headers['From']).asTo('MIME From header').isGonnaBe('"Sender" <sender@example.com>');
|
|
31
|
-
iReckon(sir, headers['Subject']).asTo('MIME Subject header').isGonnaBe('Test Subject');
|
|
32
|
-
});
|
|
33
|
-
await ifWe(sir, 'dispatch emails using EmailSenderMock and maintain history', async () => {
|
|
34
|
-
const mockSender = new EmailSenderMock();
|
|
35
|
-
mockSender.clearSentEmails();
|
|
36
|
-
const result = await mockSender.sendEmail({
|
|
37
|
-
from: 'test@example.com',
|
|
38
|
-
to: ['target@example.com'],
|
|
39
|
-
subject: 'Mock Subject',
|
|
40
|
-
textBody: 'Mock body',
|
|
41
|
-
});
|
|
42
|
-
iReckon(sir, result.success).asTo('mock send result success').isGonnaBe(true);
|
|
43
|
-
iReckon(sir, Boolean(result.messageId)).asTo('mock messageId generated').isGonnaBe(true);
|
|
44
|
-
const sent = mockSender.getSentEmails();
|
|
45
|
-
iReckon(sir, sent.length).asTo('sent emails count').isGonnaBe(1);
|
|
46
|
-
iReckon(sir, sent[0].subject).asTo('sent email subject').isGonnaBe('Mock Subject');
|
|
47
|
-
// Verify failure mode
|
|
48
|
-
mockSender.shouldFail = true;
|
|
49
|
-
const failResult = await mockSender.sendEmail({
|
|
50
|
-
from: 'test@example.com',
|
|
51
|
-
to: ['target@example.com'],
|
|
52
|
-
subject: 'Fail Subject',
|
|
53
|
-
textBody: 'Fail body',
|
|
54
|
-
});
|
|
55
|
-
iReckon(sir, failResult.success).asTo('mock send failure result success').isGonnaBe(false);
|
|
56
|
-
});
|
|
57
|
-
await ifWe(sir, 'calculate valid AWS SigV4 headers with createAwsSigV4Headers', async () => {
|
|
58
|
-
const sigResult = createAwsSigV4Headers({
|
|
59
|
-
method: 'POST',
|
|
60
|
-
url: 'https://email.us-east-1.amazonaws.com/',
|
|
61
|
-
region: 'us-east-1',
|
|
62
|
-
service: 'ses',
|
|
63
|
-
accessKeyId: 'AKIAIOSFODNN7EXAMPLE',
|
|
64
|
-
secretAccessKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
|
|
65
|
-
body: 'Action=SendEmail&Version=2010-12-01',
|
|
66
|
-
timestamp: new Date('2026-07-30T18:00:00.000Z'),
|
|
67
|
-
});
|
|
68
|
-
iReckon(sir, sigResult.amzDate).asTo('formatted X-Amz-Date').isGonnaBe('20260730T180000Z');
|
|
69
|
-
iReckon(sir, sigResult.headers['Host']).asTo('Host header').isGonnaBe('email.us-east-1.amazonaws.com');
|
|
70
|
-
iReckon(sir, sigResult.authorization.startsWith('AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20260730/us-east-1/ses/aws4_request')).asTo('authorization header credential prefix').isGonnaBe(true);
|
|
71
|
-
iReckon(sir, Boolean(sigResult.signature)).asTo('signature computed').isGonnaBe(true);
|
|
72
|
-
});
|
|
73
|
-
await ifWe(sir, 'parse SES webhook payloads and evaluate spam verdicts into inbox/junk folders', async () => {
|
|
74
|
-
const receiver = new EmailReceiverAws();
|
|
75
|
-
// Pass verdict payload
|
|
76
|
-
const passPayload = {
|
|
77
|
-
mail: {
|
|
78
|
-
messageId: 'msg-pass-123',
|
|
79
|
-
source: 'alice@example.com',
|
|
80
|
-
destination: ['bob@example.com'],
|
|
81
|
-
commonHeaders: { subject: 'Clean Mail' },
|
|
82
|
-
timestamp: '2026-07-30T18:00:00Z',
|
|
83
|
-
},
|
|
84
|
-
receipt: {
|
|
85
|
-
spamVerdict: { status: 'PASS' },
|
|
86
|
-
virusVerdict: { status: 'PASS' },
|
|
87
|
-
spfVerdict: { status: 'PASS' },
|
|
88
|
-
dkimVerdict: { status: 'PASS' },
|
|
89
|
-
},
|
|
90
|
-
content: 'Clean body',
|
|
91
|
-
};
|
|
92
|
-
const parsedPass = await receiver.parseInboundPayload(passPayload);
|
|
93
|
-
iReckon(sir, parsedPass.folder).asTo('clean email folder').isGonnaBe('inbox');
|
|
94
|
-
iReckon(sir, parsedPass.from.address).asTo('parsed from address').isGonnaBe('alice@example.com');
|
|
95
|
-
iReckon(sir, parsedPass.subject).asTo('parsed subject').isGonnaBe('Clean Mail');
|
|
96
|
-
// Fail verdict payload
|
|
97
|
-
const failPayload = {
|
|
98
|
-
mail: {
|
|
99
|
-
messageId: 'msg-spam-456',
|
|
100
|
-
source: 'spammer@badsite.com',
|
|
101
|
-
destination: ['bob@example.com'],
|
|
102
|
-
commonHeaders: { subject: 'Buy Cheap Stuff' },
|
|
103
|
-
},
|
|
104
|
-
receipt: {
|
|
105
|
-
spamVerdict: { status: 'FAIL' },
|
|
106
|
-
virusVerdict: { status: 'PASS' },
|
|
107
|
-
spfVerdict: { status: 'FAIL' },
|
|
108
|
-
dkimVerdict: { status: 'PASS' },
|
|
109
|
-
},
|
|
110
|
-
};
|
|
111
|
-
const parsedFail = await receiver.parseInboundPayload(failPayload);
|
|
112
|
-
iReckon(sir, parsedFail.folder).asTo('spam email folder').isGonnaBe('junk');
|
|
113
|
-
});
|
|
114
|
-
});
|
|
115
|
-
//# sourceMappingURL=email-service.respec.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-service.respec.mjs","sourceRoot":"","sources":["../../src/email/email-service.respec.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-helper.respec.d.mts","sourceRoot":"","sources":["../../src/serve-gib/bootstrap-helper.respec.mts"],"names":[],"mappings":""}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path';
|
|
2
|
-
import { existsSync, mkdirSync, rmSync } from 'node:fs';
|
|
3
|
-
import { respecfully, iReckon, ifWe } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
|
|
4
|
-
const sir = `[${import.meta.url}]`;
|
|
5
|
-
import { getIbGibAddr } from '@ibgib/ts-gib/dist/helper.mjs';
|
|
6
|
-
import { KeystoneService_V1 } from '@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs';
|
|
7
|
-
import { createStandardPoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';
|
|
8
|
-
import { POOL_ID_DEFAULT } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
|
|
9
|
-
import { GLOBAL_LOG_A_LOT } from './server-constants.mjs';
|
|
10
|
-
import { getDomainRootPath, bootstrapDomainMetaspace } from './bootstrap-helper.mjs';
|
|
11
|
-
const logalot = GLOBAL_LOG_A_LOT;
|
|
12
|
-
/**
|
|
13
|
-
* Minimal mock to satisfy KeystoneService requirements during genesis.
|
|
14
|
-
*/
|
|
15
|
-
class MockMetaspace {
|
|
16
|
-
async getLocalUserSpace() { return new MockSpace(); }
|
|
17
|
-
async put() { }
|
|
18
|
-
async registerNewIbGib() { }
|
|
19
|
-
}
|
|
20
|
-
class MockSpace {
|
|
21
|
-
async witness() { return { data: { success: true } }; }
|
|
22
|
-
}
|
|
23
|
-
await respecfully(sir, 'bootstrap-helper', async () => {
|
|
24
|
-
const lc = `[bootstrap-helper.respec.mts][bootstrap-helper]`;
|
|
25
|
-
const testDataDir = './test-data';
|
|
26
|
-
console.log(`${lc} testDataDir: ${testDataDir} (I: c9f39853a57a5af97ab8ff7882c49826)`);
|
|
27
|
-
// Clean and recreate test-data directory
|
|
28
|
-
if (existsSync(testDataDir)) {
|
|
29
|
-
try {
|
|
30
|
-
rmSync(testDataDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
31
|
-
}
|
|
32
|
-
catch { /* ignore */ }
|
|
33
|
-
}
|
|
34
|
-
mkdirSync(testDataDir, { recursive: true });
|
|
35
|
-
await ifWe(sir, 'calculate balanced domain root paths', async () => {
|
|
36
|
-
const tjpGib = 'abcde1234567890';
|
|
37
|
-
const root = getDomainRootPath(tjpGib, testDataDir);
|
|
38
|
-
// Should be: testDataDir/domains/ab/cd/abcde1234567890
|
|
39
|
-
iReckon(sir, root).includes(join('domains', 'ab', 'cd', tjpGib));
|
|
40
|
-
});
|
|
41
|
-
await ifWe(sir, 'bootstrap a domain metaspace and create the directory', async () => {
|
|
42
|
-
const keystoneAddr = 'keystone_alice^abcde1234567890';
|
|
43
|
-
const metaspace = await bootstrapDomainMetaspace(keystoneAddr, testDataDir);
|
|
44
|
-
iReckon(sir, metaspace).isGonnaBe(metaspace);
|
|
45
|
-
iReckon(sir, metaspace.initialized).isGonnaBe(true);
|
|
46
|
-
const expectedPath = getDomainRootPath('abcde1234567890', testDataDir);
|
|
47
|
-
iReckon(sir, existsSync(expectedPath)).isGonnaBe(true);
|
|
48
|
-
// The ibgib framework uses a specific subdirectory structure for the bootstrap
|
|
49
|
-
const bootstrapFile = join(expectedPath, 'ibgib', '000_zerospace', 'gib', 'bootstrap.json');
|
|
50
|
-
iReckon(sir, existsSync(bootstrapFile)).isGonnaBe(true);
|
|
51
|
-
// Also check that the default space was created
|
|
52
|
-
const defaultSpaceDir = join(expectedPath, 'ibgib', 'default');
|
|
53
|
-
iReckon(sir, existsSync(defaultSpaceDir)).isGonnaBe(true);
|
|
54
|
-
});
|
|
55
|
-
await ifWe(sir, 'integrate with KeystoneService and bootstrap 5 unique domains', async () => {
|
|
56
|
-
const keystoneService = new KeystoneService_V1();
|
|
57
|
-
const mockMetaspace = new MockMetaspace();
|
|
58
|
-
const mockSpace = new MockSpace();
|
|
59
|
-
const config = createStandardPoolConfig({ id: POOL_ID_DEFAULT, salt: POOL_ID_DEFAULT });
|
|
60
|
-
const identities = ['Alice', 'Bob', 'Charlie', 'Dave', 'Eve'];
|
|
61
|
-
for (const name of identities) {
|
|
62
|
-
// 1. Generate an actual genesis keystone for this identity
|
|
63
|
-
const keystone = await keystoneService.genesis({
|
|
64
|
-
masterSecret: `SecretFor_${name}`,
|
|
65
|
-
configs: [config],
|
|
66
|
-
metaspace: mockMetaspace,
|
|
67
|
-
space: mockSpace,
|
|
68
|
-
});
|
|
69
|
-
const addr = getIbGibAddr({ ibGib: keystone });
|
|
70
|
-
const tjpGib = keystone.gib;
|
|
71
|
-
if (logalot) {
|
|
72
|
-
console.log(`[test] Bootstrapping domain for ${name}: ${addr} (I: 7ba45828f2719ca578a1f078ff16e126)`);
|
|
73
|
-
}
|
|
74
|
-
// 2. Drive the bootstrap logic
|
|
75
|
-
const metaspace = await bootstrapDomainMetaspace(addr, testDataDir);
|
|
76
|
-
iReckon(sir, metaspace.initialized).isGonnaBe(true);
|
|
77
|
-
// 3. Verify the unique path
|
|
78
|
-
const expectedPath = getDomainRootPath(tjpGib, testDataDir);
|
|
79
|
-
iReckon(sir, existsSync(expectedPath)).isGonnaBe(true);
|
|
80
|
-
const bootstrapFile = join(expectedPath, 'ibgib', '000_zerospace', 'gib', 'bootstrap.json');
|
|
81
|
-
iReckon(sir, existsSync(bootstrapFile)).isGonnaBe(true);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
//# sourceMappingURL=bootstrap-helper.respec.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-helper.respec.mjs","sourceRoot":"","sources":["../../src/serve-gib/bootstrap-helper.respec.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"health.respec.d.mts","sourceRoot":"","sources":["../../../../src/serve-gib/handlers/api/health.respec.mts"],"names":[],"mappings":""}
|