This commit is contained in:
		| @@ -25,8 +25,8 @@ describe ('authority', () => { | ||||
|       .uninstall (); | ||||
|   }); | ||||
|  | ||||
|   it ('should create an access token', () => { | ||||
|     const token = auth.sign ('access_token', 60); | ||||
|   it ('should create an access token', async () => { | ||||
|     const token = await auth.sign ('access_token', 60); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
|     const res = auth.verify (token.signature); | ||||
| @@ -44,8 +44,8 @@ describe ('authority', () => { | ||||
|       .toBeUndefined (); | ||||
|   }); | ||||
|  | ||||
|   it ('should create a refresh token', () => { | ||||
|     const token = auth.sign ('refresh_token', 600); | ||||
|   it ('should create a refresh token', async () => { | ||||
|     const token = await auth.sign ('refresh_token', 600); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
|     const res = auth.verify (token.signature); | ||||
| @@ -63,8 +63,8 @@ describe ('authority', () => { | ||||
|       .toBeUndefined (); | ||||
|   }); | ||||
|  | ||||
|   it ('should create a part token', () => { | ||||
|     const token = auth.sign ('part_token', 60, { next_module: '2fa' }); | ||||
|   it ('should create a part token', async () => { | ||||
|     const token = await auth.sign ('part_token', 60, { next_module: '2fa' }); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
|     const res = auth.verify (token.signature); | ||||
| @@ -82,8 +82,8 @@ describe ('authority', () => { | ||||
|       .toBeUndefined (); | ||||
|   }); | ||||
|  | ||||
|   it ('should reject an invalid access token', () => { | ||||
|     const token = auth.sign ('access_token', 60); | ||||
|   it ('should reject an invalid access token', async () => { | ||||
|     const token = await auth.sign ('access_token', 60); | ||||
|     token.signature = modify_signature (token.signature); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
| @@ -102,8 +102,8 @@ describe ('authority', () => { | ||||
|       .toEqual ('invalid signature'); | ||||
|   }); | ||||
|  | ||||
|   it ('should reject blacklisted access token', () => { | ||||
|     const token = auth.sign ('access_token', 60); | ||||
|   it ('should reject blacklisted access token', async () => { | ||||
|     const token = await auth.sign ('access_token', 60); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
|     bl.add_signature (token.id); | ||||
| @@ -122,8 +122,8 @@ describe ('authority', () => { | ||||
|       .toEqual ('blacklisted'); | ||||
|   }); | ||||
|  | ||||
|   it ('should reject an invalid refresh token', () => { | ||||
|     const token = auth.sign ('refresh_token', 600); | ||||
|   it ('should reject an invalid refresh token', async () => { | ||||
|     const token = await auth.sign ('refresh_token', 600); | ||||
|     token.signature = modify_signature (token.signature); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
| @@ -142,8 +142,8 @@ describe ('authority', () => { | ||||
|       .toEqual ('invalid signature'); | ||||
|   }); | ||||
|  | ||||
|   it ('should reject a blacklisted refresh token', () => { | ||||
|     const token = auth.sign ('refresh_token', 600); | ||||
|   it ('should reject a blacklisted refresh token', async () => { | ||||
|     const token = await auth.sign ('refresh_token', 600); | ||||
|     jasmine.clock () | ||||
|       .tick (30000); | ||||
|     bl.add_signature (token.id); | ||||
|   | ||||
| @@ -57,7 +57,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should allow a valid access token', async () => { | ||||
|     const token = authority.sign ('access_token', 60); | ||||
|     const token = await authority.sign ('access_token', 60); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
|       .toEqual (200); | ||||
| @@ -66,7 +66,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should allow a valid access token using cookies', async () => { | ||||
|     const token = authority.sign ('access_token', 60); | ||||
|     const token = await authority.sign ('access_token', 60); | ||||
|     const resp = await get ({ cookie: `cookie_jar=${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
|       .toEqual (200); | ||||
| @@ -75,7 +75,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should correctly deliver token data', async () => { | ||||
|     const token = authority.sign ('access_token', 60, { data: 'foobar' }); | ||||
|     const token = await authority.sign ('access_token', 60, { data: 'foobar' }); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
|       .toEqual (200); | ||||
| @@ -87,7 +87,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should reject an outdated access token', async () => { | ||||
|     const token = authority.sign ('access_token', 60); | ||||
|     const token = await authority.sign ('access_token', 60); | ||||
|     jasmine.clock () | ||||
|       .tick (70000); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
| @@ -98,7 +98,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should reject a blacklisted access token', async () => { | ||||
|     const token = authority.sign ('access_token', 60); | ||||
|     const token = await authority.sign ('access_token', 60); | ||||
|     blacklist.add_signature (token.id); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
| @@ -108,7 +108,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should reject any refresh_token', async () => { | ||||
|     const token = authority.sign ('refresh_token', 60); | ||||
|     const token = await authority.sign ('refresh_token', 60); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
|       .toEqual (302); | ||||
| @@ -117,7 +117,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should reject any part_token', async () => { | ||||
|     const token = authority.sign ('part_token', 60); | ||||
|     const token = await authority.sign ('part_token', 60); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
|       .toEqual (302); | ||||
| @@ -126,7 +126,7 @@ describe ('gateway', () => { | ||||
|   }); | ||||
|  | ||||
|   it ('should reject any noname token', async () => { | ||||
|     const token = authority.sign ('none', 60); | ||||
|     const token = await authority.sign ('none', 60); | ||||
|     const resp = await get ({ authorization: `Bearer ${token.signature}` }); | ||||
|     expect (resp.statusCode) | ||||
|       .toEqual (302); | ||||
|   | ||||
| @@ -20,54 +20,66 @@ describe ('key store', () => { | ||||
|       .mockDate (base_date); | ||||
|   }); | ||||
|  | ||||
|   const keys: {key:string, iat:number}[] = []; | ||||
|   const keys: {key:string, sign:string, iat:number}[] = []; | ||||
|  | ||||
|   it ('should generate a new key', () => { | ||||
|   it ('should generate a new key', async () => { | ||||
|     const iat = (new Date) | ||||
|       .getTime () / 1000; | ||||
|     const duration = 10 * frame; | ||||
|     const key = ks.get_key (iat, duration); | ||||
|     const key = await ks.get_sign_key (iat, duration); | ||||
|     const sign = ks.get_key (iat); | ||||
|     expect (typeof key) | ||||
|       .toEqual ('string'); | ||||
|     expect (key.length) | ||||
|       .toEqual (64); | ||||
|     keys.push ({ iat, key }); | ||||
|     expect (typeof sign) | ||||
|       .toEqual ('string'); | ||||
|     keys.push ({ iat, key, sign }); | ||||
|   }); | ||||
|  | ||||
|   it ('should return the generated key', () => { | ||||
|     const key = ks.get_key (keys[0].iat); | ||||
|   it ('should return the generated key', async () => { | ||||
|     const key = await ks.get_sign_key (keys[0].iat, 1); | ||||
|     expect (key) | ||||
|       .toEqual (keys[0].key); | ||||
|     const sign = ks.get_key (keys[0].iat); | ||||
|     expect (sign) | ||||
|       .toEqual (keys[0].sign); | ||||
|   }); | ||||
|  | ||||
|   it ('should return the same key on a different time', () => { | ||||
|     const key = ks.get_key (keys[0].iat + (frame / 2)); | ||||
|   it ('should return the same key on a different time', async () => { | ||||
|     const key = await ks.get_sign_key (keys[0].iat + (frame / 2), 1); | ||||
|     expect (key) | ||||
|       .toEqual (keys[0].key); | ||||
|     const sign = ks.get_key (keys[0].iat + (frame / 2)); | ||||
|     expect (sign) | ||||
|       .toEqual (keys[0].sign); | ||||
|   }); | ||||
|  | ||||
|   it ('should generate a new key after time frame is over', () => { | ||||
|   it ('should generate a new key after time frame is over', async () => { | ||||
|     jasmine.clock () | ||||
|       .tick (frame * 1000); | ||||
|     const iat = (new Date) | ||||
|       .getTime () / 1000; | ||||
|     const duration = 10 * frame; | ||||
|     const key = ks.get_key (iat, duration); | ||||
|     const key = await ks.get_sign_key (iat, duration); | ||||
|     const sign = ks.get_key (iat); | ||||
|     expect (typeof key) | ||||
|       .toEqual ('string'); | ||||
|     expect (key.length) | ||||
|       .toEqual (64); | ||||
|     expect (key).not.toEqual (keys[0].key); | ||||
|     keys.push ({ iat, key }); | ||||
|     expect (sign).not.toEqual (keys[0].sign); | ||||
|     keys.push ({ iat, key, sign }); | ||||
|   }); | ||||
|  | ||||
|   it ('should return both keys', () => { | ||||
|     const key = ks.get_key (keys[0].iat); | ||||
|     expect (key) | ||||
|       .toEqual (keys[0].key); | ||||
|     const k2 = ks.get_key (keys[1].iat); | ||||
|   it ('should return both keys, but not the first sign key', async () => { | ||||
|     const sign = ks.get_key (keys[0].iat); | ||||
|     expect (sign) | ||||
|       .toEqual (keys[0].sign); | ||||
|     await expectAsync (ks.get_sign_key (keys[0].iat, 1)) | ||||
|       .toBeRejectedWithError ('cannot access already expired keys'); | ||||
|     const k2 = await ks.get_sign_key (keys[1].iat, 1); | ||||
|     const s2 = ks.get_key (keys[1].iat); | ||||
|     expect (k2) | ||||
|       .toEqual (keys[1].key); | ||||
|     expect (s2) | ||||
|       .toEqual (keys[1].sign); | ||||
|   }); | ||||
|  | ||||
|   it ('should throw on non existing key', () => { | ||||
| @@ -82,21 +94,26 @@ describe ('key store', () => { | ||||
|       .toThrowError ('key could not be found'); | ||||
|   }); | ||||
|  | ||||
|   it ('should still retrieve the second key', () => { | ||||
|     const key = ks.get_key (keys[1].iat); | ||||
|     expect (key) | ||||
|       .toEqual (keys[1].key); | ||||
|   }); | ||||
|   it ( | ||||
|     'should still retrieve the second key, but not its sign key', | ||||
|     async () => { | ||||
|       await expectAsync (ks.get_sign_key (keys[1].iat, 1)) | ||||
|         .toBeRejectedWithError ('cannot access already expired keys'); | ||||
|       const sign = ks.get_key (keys[1].iat); | ||||
|       expect (sign) | ||||
|         .toEqual (keys[1].sign); | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   it ('should reject key generation of expired keys', () => { | ||||
|   it ('should reject key generation of expired keys', async () => { | ||||
|     const iat = ((new Date) | ||||
|       .getTime () / 1000) - 2; | ||||
|     const duration = 5; | ||||
|     expect (() => ks.get_key (iat, duration)) | ||||
|       .toThrowError ('cannot create already expired keys'); | ||||
|     await expectAsync (ks.get_sign_key (iat, duration)) | ||||
|       .toBeRejectedWithError ('cannot access already expired keys'); | ||||
|   }); | ||||
|  | ||||
|   it ('key should live as long as the longest created token', () => { | ||||
|   it ('key should live as long as the longest created token', async () => { | ||||
|     const base = new Date; | ||||
|     base.setSeconds (2, 0); | ||||
|     jasmine.clock () | ||||
| @@ -108,21 +125,22 @@ describe ('key store', () => { | ||||
|     const duration1 = frame; | ||||
|     const duration2 = frame * 10; | ||||
|  | ||||
|     const key1 = ks.get_key (iat, duration1); | ||||
|     const key1 = await ks.get_sign_key (iat, duration1); | ||||
|     const step = 0.9 * frame; | ||||
|     jasmine.clock () | ||||
|       .tick (step * 1000); | ||||
|     const key2 = ks.get_key (iat + step, duration2); | ||||
|     const key2 = await ks.get_sign_key (iat + step, duration2); | ||||
|     const sign = ks.get_key (iat); | ||||
|     expect (key1) | ||||
|       .toEqual (key2); | ||||
|     jasmine.clock () | ||||
|       .tick (5000 * frame); | ||||
|     const keyv = ks.get_key (iat + step); | ||||
|     expect (keyv) | ||||
|       .toEqual (key1); | ||||
|     const signv = ks.get_key (iat + step); | ||||
|     expect (signv) | ||||
|       .toEqual (sign); | ||||
|   }); | ||||
|  | ||||
|   // required use case: insert keys for verification of old tokens | ||||
|   // TODO: required use case: insert keys for verification of old tokens | ||||
|  | ||||
|   afterAll (() => { | ||||
|     jasmine.clock () | ||||
|   | ||||
		Reference in New Issue
	
	Block a user