@ibgib/web-gib 0.0.56 → 0.0.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/AUTO-GENERATED-version.d.mts +1 -1
  2. package/dist/AUTO-GENERATED-version.mjs +1 -1
  3. package/dist/api/api-index.mjs +1 -1
  4. package/dist/api/api-index.mjs.map +1 -1
  5. package/dist/api/ibgib-api-bridge.d.mts +35 -0
  6. package/dist/api/ibgib-api-bridge.d.mts.map +1 -1
  7. package/dist/api/ibgib-api-bridge.mjs +70 -3
  8. package/dist/api/ibgib-api-bridge.mjs.map +1 -1
  9. package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -1
  10. package/dist/ui/component/identity/add-device/add-device.html +6 -7
  11. package/dist/ui/component/identity/add-device/add-device.mjs +13 -10
  12. package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -1
  13. package/dist/ui/component/identity/keystone-creator/keystone-creator.css +19 -0
  14. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts +1 -0
  15. package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -1
  16. package/dist/ui/component/identity/keystone-creator/keystone-creator.html +10 -0
  17. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +164 -41
  18. package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -1
  19. package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -1
  20. package/dist/ui/component/identity/keystone-details/keystone-details.mjs +9 -8
  21. package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -1
  22. package/package.json +2 -2
  23. package/src/AUTO-GENERATED-version.mts +1 -1
  24. package/src/api/api-index.mts +1 -1
  25. package/src/api/ibgib-api-bridge.mts +94 -4
  26. package/src/identity/sso/{sso-custodian-service.mts → sso-custodian-service.mts.bak} +65 -38
  27. package/src/identity/sso/{sso-custodian-service.respec.mts → sso-custodian-service.respec.mts.bak} +15 -14
  28. package/src/ui/component/identity/add-device/add-device.html +6 -7
  29. package/src/ui/component/identity/add-device/add-device.mts +17 -16
  30. package/src/ui/component/identity/keystone-creator/keystone-creator.css +19 -0
  31. package/src/ui/component/identity/keystone-creator/keystone-creator.html +10 -0
  32. package/src/ui/component/identity/keystone-creator/keystone-creator.mts +180 -55
  33. package/src/ui/component/identity/keystone-details/keystone-details.mts +16 -15
  34. package/dist/identity/sso/sso-config-helper.d.mts +0 -7
  35. package/dist/identity/sso/sso-config-helper.d.mts.map +0 -1
  36. package/dist/identity/sso/sso-config-helper.mjs +0 -42
  37. package/dist/identity/sso/sso-config-helper.mjs.map +0 -1
  38. package/dist/identity/sso/sso-custodian-service.d.mts +0 -139
  39. package/dist/identity/sso/sso-custodian-service.d.mts.map +0 -1
  40. package/dist/identity/sso/sso-custodian-service.mjs +0 -443
  41. package/dist/identity/sso/sso-custodian-service.mjs.map +0 -1
  42. package/dist/identity/sso/sso-custodian-service.respec.d.mts +0 -2
  43. package/dist/identity/sso/sso-custodian-service.respec.d.mts.map +0 -1
  44. package/dist/identity/sso/sso-custodian-service.respec.mjs +0 -254
  45. package/dist/identity/sso/sso-custodian-service.respec.mjs.map +0 -1
  46. /package/src/identity/sso/{sso-config-helper.mts → sso-config-helper.mts.bak} +0 -0
@@ -1,254 +0,0 @@
1
- import { generateKeyPairSync, createSign } from 'node:crypto';
2
- import { respecfully, ifWeMight, iReckon, firstOfAll, lastOfAll } from '@ibgib/helper-gib/dist/respec-gib/respec-gib.mjs';
3
- import { SsoCustodianService } from './sso-custodian-service.mjs';
4
- import { POOL_ID_MANAGE } from '@ibgib/core-gib/dist/keystone/keystone-constants.mjs';
5
- import { createStandardPoolConfig } from '@ibgib/core-gib/dist/keystone/keystone-config-builder.mjs';
6
- const maam = `[${import.meta.url}]`, sir = maam;
7
- await respecfully(sir, 'SsoCustodianService', async () => {
8
- let mockPrivateKey;
9
- let mockPublicKeyJwk;
10
- let originalFetch;
11
- firstOfAll(sir, async () => {
12
- // Generate mock RSA key pair
13
- const { privateKey, publicKey } = generateKeyPairSync('rsa', {
14
- modulusLength: 2048
15
- });
16
- mockPrivateKey = privateKey;
17
- // Export public key as JWK
18
- mockPublicKeyJwk = publicKey.export({ format: 'jwk' });
19
- mockPublicKeyJwk.kid = 'mock-kid-123';
20
- mockPublicKeyJwk.alg = 'RS256';
21
- mockPublicKeyJwk.use = 'sig';
22
- // Mock global fetch to return JWKS containing the mock public key
23
- originalFetch = globalThis.fetch;
24
- globalThis.fetch = async (url, options) => {
25
- if (url === 'https://www.googleapis.com/oauth2/v3/certs') {
26
- return {
27
- ok: true,
28
- status: 200,
29
- json: async () => ({
30
- keys: [mockPublicKeyJwk]
31
- })
32
- };
33
- }
34
- return {
35
- ok: false,
36
- status: 404,
37
- text: async () => 'Not Found'
38
- };
39
- };
40
- });
41
- lastOfAll(sir, async () => {
42
- // Restore global fetch
43
- if (originalFetch) {
44
- globalThis.fetch = originalFetch;
45
- }
46
- });
47
- await ifWeMight(sir, 'verify dynamic RSA RS256 JWT signature successfully', async () => {
48
- const config = {
49
- ssoServerKdfSecret: 'mock-kdf-secret',
50
- sessionSecret: 'mock-session-secret',
51
- providers: {
52
- google: {
53
- providerId: 'google',
54
- clientId: 'google-client-id-123',
55
- clientSecret: 'google-client-secret-123',
56
- tokenUrl: 'https://oauth2.googleapis.com/token',
57
- userInfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo',
58
- jwksUrl: 'https://www.googleapis.com/oauth2/v3/certs'
59
- }
60
- }
61
- };
62
- const service = new SsoCustodianService(config);
63
- // 1. Build JWT Header & Payload
64
- const header = { alg: 'RS256', kid: 'mock-kid-123', typ: 'JWT' };
65
- const payload = {
66
- sub: 'user-sub-999',
67
- email: 'user@example.com',
68
- name: 'John Doe',
69
- aud: 'google-client-id-123',
70
- iss: 'https://accounts.google.com',
71
- exp: Math.floor(Date.now() / 1000) + 3600 // expires in 1 hour
72
- };
73
- const headerB64 = Buffer.from(JSON.stringify(header)).toString('base64url');
74
- const payloadB64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
75
- const data = `${headerB64}.${payloadB64}`;
76
- // 2. Sign JWT using private key
77
- const sign = createSign('RSA-SHA256');
78
- sign.update(data);
79
- const signatureB64 = sign.sign(mockPrivateKey, 'base64url');
80
- const mockJwtToken = `${data}.${signatureB64}`;
81
- // 3. Verify signature via service
82
- const decodedPayload = await service.verifyJwt(mockJwtToken, config.providers.google);
83
- iReckon(sir, decodedPayload.sub).isGonnaBe('user-sub-999');
84
- iReckon(sir, decodedPayload.email).isGonnaBe('user@example.com');
85
- iReckon(sir, decodedPayload.name).isGonnaBe('John Doe');
86
- });
87
- await ifWeMight(sir, 'fail validation if JWT has invalid signature', async () => {
88
- const config = {
89
- ssoServerKdfSecret: 'mock-kdf-secret',
90
- sessionSecret: 'mock-session-secret',
91
- providers: {
92
- google: {
93
- providerId: 'google',
94
- clientId: 'google-client-id-123',
95
- clientSecret: 'google-client-secret-123',
96
- tokenUrl: 'https://oauth2.googleapis.com/token',
97
- userInfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo',
98
- jwksUrl: 'https://www.googleapis.com/oauth2/v3/certs'
99
- }
100
- }
101
- };
102
- const service = new SsoCustodianService(config);
103
- const header = { alg: 'RS256', kid: 'mock-kid-123', typ: 'JWT' };
104
- const payload = {
105
- sub: 'user-sub-999',
106
- aud: 'google-client-id-123',
107
- exp: Math.floor(Date.now() / 1000) + 3600
108
- };
109
- const headerB64 = Buffer.from(JSON.stringify(header)).toString('base64url');
110
- const payloadB64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
111
- const data = `${headerB64}.${payloadB64}`;
112
- // Create signature using a different/unregistered RSA key
113
- const { privateKey: badPrivateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
114
- const sign = createSign('RSA-SHA256');
115
- sign.update(data);
116
- const badSignatureB64 = sign.sign(badPrivateKey, 'base64url');
117
- const badJwtToken = `${data}.${badSignatureB64}`;
118
- let verifyError;
119
- try {
120
- await service.verifyJwt(badJwtToken, config.providers.google);
121
- }
122
- catch (error) {
123
- verifyError = error;
124
- }
125
- iReckon(sir, verifyError).not.isGonnaBeUndefined();
126
- iReckon(sir, verifyError.message).includes('Cryptographic signature verification failed');
127
- });
128
- await ifWeMight(sir, 'derive server-delegate secret deterministically', async () => {
129
- const config = {
130
- ssoServerKdfSecret: 'high-entropy-server-kdf-secret',
131
- sessionSecret: 'session-secret-123',
132
- providers: {}
133
- };
134
- const service = new SsoCustodianService(config);
135
- const key = 'google:123456789';
136
- const nonce1 = 'nonce-abc-123';
137
- const nonce2 = 'nonce-def-456';
138
- const secret1_a = await service.deriveServerDelegateSecret(key, nonce1);
139
- const secret1_b = await service.deriveServerDelegateSecret(key, nonce1);
140
- const secret2 = await service.deriveServerDelegateSecret(key, nonce2);
141
- // Identical inputs must yield identical outputs
142
- iReckon(sir, secret1_a).isGonnaBe(secret1_b);
143
- // Different nonces must yield different outputs
144
- iReckon(sir, secret1_a).not.isGonnaBe(secret2);
145
- // Derived secrets must be string type with high entropy
146
- iReckon(sir, typeof secret1_a).isGonnaBe('string');
147
- iReckon(sir, secret1_a.length).isGonnaBe(128); // sha512 output in hex/base64 wrap
148
- });
149
- await ifWeMight(sir, 'create custodian challenge pool successfully', async () => {
150
- const config = {
151
- ssoServerKdfSecret: 'high-entropy-server-kdf-secret',
152
- sessionSecret: 'session-secret-123',
153
- providers: {}
154
- };
155
- const service = new SsoCustodianService(config);
156
- const key = 'google:123456789';
157
- const nonce = 'nonce-abc-123';
158
- // 1. Create a mock target keystone containing a 'manage' pool
159
- const userManageConfig = createStandardPoolConfig({
160
- id: POOL_ID_MANAGE,
161
- salt: 'user-manage-salt'
162
- });
163
- userManageConfig.behavior.size = 12; // custom size for verification
164
- const mockTargetKeystone = {
165
- ib: 'keystone^some-tjp-addr',
166
- gib: 'some-gib-value',
167
- data: {
168
- challengePools: [
169
- {
170
- id: 'manage',
171
- config: userManageConfig,
172
- challenges: { 'chal1': 'val1' }
173
- }
174
- ],
175
- n: 0
176
- }
177
- };
178
- // 2. Mock metaspace and space calls
179
- const mockSpace = {};
180
- const mockMetaspace = {
181
- getLatestAddr: async () => 'latest-keystone-addr',
182
- get: async () => ({
183
- success: true,
184
- ibGibs: [mockTargetKeystone]
185
- })
186
- };
187
- const custodianPool = await service.createCustodianChallengePool({
188
- providerId: 'google',
189
- providerKey: key,
190
- userNonce: nonce,
191
- keystoneAddr: 'some-tjp-addr',
192
- metaspace: mockMetaspace,
193
- space: mockSpace
194
- });
195
- iReckon(sir, custodianPool).not.isGonnaBeUndefined();
196
- iReckon(sir, custodianPool.id).willEqual('custodian-manage-google');
197
- iReckon(sir, custodianPool.isForeign).isGonnaBeTrue();
198
- iReckon(sir, custodianPool.metadata?.providerKey).willEqual(key);
199
- // Replicated behavior size from parent manage pool config
200
- iReckon(sir, custodianPool.config.behavior.size).willEqual(userManageConfig.behavior.size);
201
- // Structural validation of challenges
202
- const challengesCount = Object.keys(custodianPool.challenges).length;
203
- iReckon(sir, challengesCount).willEqual(custodianPool.config.behavior.size);
204
- });
205
- await ifWeMight(sir, 'revoke tokens successfully, making the correct http fetch calls', async () => {
206
- const config = {
207
- ssoServerKdfSecret: 'high-entropy-server-kdf-secret',
208
- sessionSecret: 'session-secret-123',
209
- providers: {
210
- google: {
211
- providerId: 'google',
212
- clientId: 'google-client-id-abc',
213
- clientSecret: 'google-client-secret-abc',
214
- tokenUrl: 'https://oauth2.googleapis.com/token',
215
- userInfoUrl: 'https://openidconnect.googleapis.com/v1/userinfo'
216
- },
217
- github: {
218
- providerId: 'github',
219
- clientId: 'github-client-id-xyz',
220
- clientSecret: 'github-client-secret-xyz',
221
- tokenUrl: 'https://github.com/login/oauth/access_token',
222
- userInfoUrl: 'https://api.github.com/user'
223
- }
224
- }
225
- };
226
- const service = new SsoCustodianService(config);
227
- const originalFetch = globalThis.fetch;
228
- let fetchCalls = [];
229
- globalThis.fetch = (async (url, options) => {
230
- fetchCalls.push({ url, options });
231
- return {
232
- ok: true,
233
- status: 200,
234
- text: async () => 'ok'
235
- };
236
- });
237
- try {
238
- // Revoke Google token
239
- await service.revokeToken('google', 'google-test-token-123');
240
- iReckon(sir, fetchCalls.length).willEqual(1);
241
- iReckon(sir, fetchCalls[0].url).includes('google-test-token-123');
242
- // Revoke GitHub token
243
- await service.revokeToken('github', 'github-test-token-456');
244
- iReckon(sir, fetchCalls.length).willEqual(2);
245
- iReckon(sir, fetchCalls[1].url).includes('/applications/github-client-id-xyz/grant');
246
- iReckon(sir, fetchCalls[1].options.method).willEqual('DELETE');
247
- iReckon(sir, fetchCalls[1].options.headers['Authorization']).includes('Basic');
248
- }
249
- finally {
250
- globalThis.fetch = originalFetch;
251
- }
252
- });
253
- });
254
- //# sourceMappingURL=sso-custodian-service.respec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sso-custodian-service.respec.mjs","sourceRoot":"","sources":["../../../src/identity/sso/sso-custodian-service.respec.mts"],"names":[],"mappings":"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"}