@furystack/security 7.0.8 → 8.0.0

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 (54) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +9 -3
  3. package/esm/crypto-password-hasher.d.ts +10 -12
  4. package/esm/crypto-password-hasher.d.ts.map +1 -1
  5. package/esm/crypto-password-hasher.js +43 -36
  6. package/esm/crypto-password-hasher.js.map +1 -1
  7. package/esm/helpers.d.ts +20 -7
  8. package/esm/helpers.d.ts.map +1 -1
  9. package/esm/helpers.js +27 -13
  10. package/esm/helpers.js.map +1 -1
  11. package/esm/index.d.ts +3 -1
  12. package/esm/index.d.ts.map +1 -1
  13. package/esm/index.js +3 -1
  14. package/esm/index.js.map +1 -1
  15. package/esm/password-authenticator.d.ts +26 -15
  16. package/esm/password-authenticator.d.ts.map +1 -1
  17. package/esm/password-authenticator.js +73 -109
  18. package/esm/password-authenticator.js.map +1 -1
  19. package/esm/password-authenticator.spec.js +122 -212
  20. package/esm/password-authenticator.spec.js.map +1 -1
  21. package/esm/password-credential-store.d.ts +50 -0
  22. package/esm/password-credential-store.d.ts.map +1 -0
  23. package/esm/password-credential-store.js +73 -0
  24. package/esm/password-credential-store.js.map +1 -0
  25. package/esm/password-credential-store.spec.d.ts +2 -0
  26. package/esm/password-credential-store.spec.d.ts.map +1 -0
  27. package/esm/password-credential-store.spec.js +64 -0
  28. package/esm/password-credential-store.spec.js.map +1 -0
  29. package/esm/password-hasher.d.ts +21 -3
  30. package/esm/password-hasher.d.ts.map +1 -1
  31. package/esm/password-hasher.js +1 -19
  32. package/esm/password-hasher.js.map +1 -1
  33. package/esm/security-policy-manager.d.ts +46 -14
  34. package/esm/security-policy-manager.d.ts.map +1 -1
  35. package/esm/security-policy-manager.js +48 -52
  36. package/esm/security-policy-manager.js.map +1 -1
  37. package/esm/security-policy-manager.spec.js +58 -7
  38. package/esm/security-policy-manager.spec.js.map +1 -1
  39. package/esm/security-policy.d.ts +35 -9
  40. package/esm/security-policy.d.ts.map +1 -1
  41. package/esm/security-policy.js +23 -33
  42. package/esm/security-policy.js.map +1 -1
  43. package/package.json +8 -8
  44. package/src/crypto-password-hasher.ts +46 -39
  45. package/src/helpers.ts +27 -15
  46. package/src/index.ts +3 -2
  47. package/src/password-authenticator.spec.ts +134 -254
  48. package/src/password-authenticator.ts +92 -86
  49. package/src/password-credential-store.spec.ts +77 -0
  50. package/src/password-credential-store.ts +79 -0
  51. package/src/password-hasher.ts +21 -9
  52. package/src/security-policy-manager.spec.ts +63 -7
  53. package/src/security-policy-manager.ts +91 -42
  54. package/src/security-policy.ts +50 -18
@@ -1,6 +1,5 @@
1
- import { addStore, InMemoryStore, StoreManager, User } from '@furystack/core';
2
- import { Injector } from '@furystack/inject';
3
- import { getRepository } from '@furystack/repository';
1
+ import { InMemoryStore } from '@furystack/core';
2
+ import { createInjector } from '@furystack/inject';
4
3
  import { usingAsync } from '@furystack/utils';
5
4
  import { randomBytes } from 'crypto';
6
5
  import { describe, expect, it, vi } from 'vitest';
@@ -10,285 +9,196 @@ import { usePasswordPolicy } from './helpers.js';
10
9
  import { PasswordCredential } from './models/password-credential.js';
11
10
  import { PasswordResetToken } from './models/password-reset-token.js';
12
11
  import { PasswordAuthenticator } from './password-authenticator.js';
12
+ import { PasswordCredentialStore, PasswordResetTokenStore } from './password-credential-store.js';
13
13
  import { createMinLengthComplexityRule } from './password-complexity-rules/min-length.js';
14
14
  import { SecurityPolicyManager } from './security-policy-manager.js';
15
15
  const randomString = () => randomBytes(32).toString('hex');
16
- const setupSecurityStores = (i) => {
17
- addStore(i, new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' }))
18
- .addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
19
- .addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
20
- getRepository(i).createDataSet(PasswordCredential, 'userName');
21
- getRepository(i).createDataSet(PasswordResetToken, 'token');
16
+ /**
17
+ * Binds a fresh in-memory implementation of the two credential stores. The
18
+ * production default factories throw on purpose; tests opt in to memory
19
+ * persistence explicitly per injector.
20
+ */
21
+ const useInMemorySecurityStores = (i) => {
22
+ i.bind(PasswordCredentialStore, () => new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' }));
23
+ i.bind(PasswordResetTokenStore, () => new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
22
24
  };
23
25
  describe('PasswordAuthenticator', () => {
24
- it('Should be instantiated', async () => {
25
- await usingAsync(new Injector(), async (i) => {
26
- setupSecurityStores(i);
26
+ it('resolves to a configured authenticator when stores and policy are set up', async () => {
27
+ await usingAsync(createInjector(), async (i) => {
28
+ useInMemorySecurityStores(i);
27
29
  usePasswordPolicy(i);
28
- const auth = i.getInstance(PasswordAuthenticator);
29
- expect(auth).toBeInstanceOf(PasswordAuthenticator);
30
+ const auth = i.get(PasswordAuthenticator);
31
+ expect(auth.policyManager).toBeDefined();
32
+ expect(auth.hasher).toBeDefined();
30
33
  });
31
34
  });
32
- it('Should inherit policy from the extension method', async () => {
33
- await usingAsync(new Injector(), async (i) => {
34
- setupSecurityStores(i);
35
- usePasswordPolicy(i, {
36
- passwordComplexityRules: [createMinLengthComplexityRule(3)],
37
- });
38
- const auth = i.getInstance(PasswordAuthenticator);
39
- expect(auth).toBeInstanceOf(PasswordAuthenticator);
35
+ it('picks up complexity rules supplied via usePasswordPolicy', async () => {
36
+ await usingAsync(createInjector(), async (i) => {
37
+ useInMemorySecurityStores(i);
38
+ usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] });
39
+ const auth = i.get(PasswordAuthenticator);
40
40
  expect(auth.policyManager.policy.passwordComplexityRules[0].name).toBe('minLength');
41
41
  });
42
42
  });
43
43
  describe('checkPasswordForUser', () => {
44
- it('Should return a truthy value for valid username and password', async () => {
45
- await usingAsync(new Injector(), async (i) => {
44
+ it('returns isValid=true for a valid username and password combination', async () => {
45
+ await usingAsync(createInjector(), async (i) => {
46
46
  const userName = randomString();
47
47
  const password = randomString();
48
- setupSecurityStores(i);
49
- usePasswordPolicy(i, {});
50
- const authenticator = i.getInstance(PasswordAuthenticator);
51
- const { hasher } = authenticator;
52
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
53
- const entry = await hasher.createCredential(userName, password);
54
- await passwordStore.add(entry);
55
- const successResult = await authenticator.checkPasswordForUser(userName, password);
56
- expect(successResult.isValid).toBeTruthy();
48
+ useInMemorySecurityStores(i);
49
+ usePasswordPolicy(i);
50
+ const authenticator = i.get(PasswordAuthenticator);
51
+ const credential = await authenticator.hasher.createCredential(userName, password);
52
+ await i.get(PasswordCredentialStore).add(credential);
53
+ expect((await authenticator.checkPasswordForUser(userName, password)).isValid).toBe(true);
57
54
  });
58
55
  });
59
- it('Should return a falsy value for invalid username', async () => {
60
- await usingAsync(new Injector(), async (i) => {
61
- const userName = randomString();
62
- const password = randomString();
63
- setupSecurityStores(i);
56
+ it('returns badUsernameOrPassword for an unknown username', async () => {
57
+ await usingAsync(createInjector(), async (i) => {
58
+ useInMemorySecurityStores(i);
64
59
  usePasswordPolicy(i);
65
- const authenticator = i.getInstance(PasswordAuthenticator);
66
- const { hasher } = authenticator;
67
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
68
- const entry = await hasher.createCredential(userName, password);
69
- await passwordStore.add(entry);
70
- const failResult = await authenticator.checkPasswordForUser('invalidUsername', password);
71
- expect(failResult.isValid).toBeFalsy();
72
- expect(failResult.reason).toBe('badUsernameOrPassword');
60
+ const authenticator = i.get(PasswordAuthenticator);
61
+ const credential = await authenticator.hasher.createCredential('someone', 'pw');
62
+ await i.get(PasswordCredentialStore).add(credential);
63
+ const failure = (await authenticator.checkPasswordForUser('nobody', 'pw'));
64
+ expect(failure.isValid).toBe(false);
65
+ expect(failure.reason).toBe('badUsernameOrPassword');
73
66
  });
74
67
  });
75
- it('Should return a falsy value for invalid password', async () => {
76
- await usingAsync(new Injector(), async (i) => {
68
+ it('returns badUsernameOrPassword for the wrong password', async () => {
69
+ await usingAsync(createInjector(), async (i) => {
77
70
  const userName = randomString();
78
- const password = randomString();
79
- setupSecurityStores(i);
71
+ useInMemorySecurityStores(i);
80
72
  usePasswordPolicy(i);
81
- const authenticator = i.getInstance(PasswordAuthenticator);
82
- const { hasher } = authenticator;
83
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
84
- const entry = await hasher.createCredential(userName, password);
85
- await passwordStore.add(entry);
86
- const failResult = await authenticator.checkPasswordForUser(userName, 'someInvalidPassword');
87
- expect(failResult.isValid).toBeFalsy();
88
- expect(failResult.reason).toBe('badUsernameOrPassword');
73
+ const authenticator = i.get(PasswordAuthenticator);
74
+ const credential = await authenticator.hasher.createCredential(userName, 'right');
75
+ await i.get(PasswordCredentialStore).add(credential);
76
+ const failure = (await authenticator.checkPasswordForUser(userName, 'wrong'));
77
+ expect(failure.isValid).toBe(false);
78
+ expect(failure.reason).toBe('badUsernameOrPassword');
89
79
  });
90
80
  });
91
- it('Should return a falsy value for an expired password', async () => {
92
- await usingAsync(new Injector(), async (i) => {
81
+ it('returns passwordExpired for a credential older than the configured expiration window', async () => {
82
+ await usingAsync(createInjector(), async (i) => {
93
83
  const userName = randomString();
94
84
  const password = randomString();
95
- setupSecurityStores(i);
85
+ useInMemorySecurityStores(i);
96
86
  usePasswordPolicy(i, { passwordExpirationDays: 1 });
97
- const authenticator = i.getInstance(PasswordAuthenticator);
98
- const { hasher } = authenticator;
99
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
100
- const entry = await hasher.createCredential(userName, password);
101
- const creationDate = new Date();
102
- creationDate.setDate(creationDate.getDate() - 2);
103
- entry.creationDate = creationDate.toISOString();
104
- await passwordStore.add(entry);
105
- const failResult = await authenticator.checkPasswordForUser(userName, password);
106
- expect(failResult.isValid).toBeFalsy();
107
- expect(failResult.reason).toBe('passwordExpired');
87
+ const authenticator = i.get(PasswordAuthenticator);
88
+ const credential = await authenticator.hasher.createCredential(userName, password);
89
+ const olderCreationDate = new Date();
90
+ olderCreationDate.setDate(olderCreationDate.getDate() - 2);
91
+ credential.creationDate = olderCreationDate.toISOString();
92
+ await i.get(PasswordCredentialStore).add(credential);
93
+ const failure = (await authenticator.checkPasswordForUser(userName, password));
94
+ expect(failure.isValid).toBe(false);
95
+ expect(failure.reason).toBe('passwordExpired');
108
96
  });
109
97
  });
110
98
  });
111
99
  describe('setPasswordForUser', () => {
112
- it('Should be able to set the password for the user using the last password', async () => {
113
- await usingAsync(new Injector(), async (i) => {
100
+ it('rotates the credential and keeps only the latest entry', async () => {
101
+ await usingAsync(createInjector(), async (i) => {
114
102
  const userName = randomString();
115
103
  const lastPassword = randomString();
116
104
  const password = randomString();
117
- setupSecurityStores(i);
105
+ useInMemorySecurityStores(i);
118
106
  usePasswordPolicy(i);
119
- const authenticator = i.getInstance(PasswordAuthenticator);
120
- const { hasher } = authenticator;
121
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
122
- const policyManager = i.getInstance(SecurityPolicyManager);
123
- const pmSpy = vi.spyOn(policyManager, 'matchPasswordComplexityRules');
124
- const entry = await hasher.createCredential(userName, lastPassword);
125
- await passwordStore.add(entry);
107
+ const authenticator = i.get(PasswordAuthenticator);
108
+ const store = i.get(PasswordCredentialStore);
109
+ const complexitySpy = vi.spyOn(i.get(SecurityPolicyManager), 'matchPasswordComplexityRules');
110
+ const credential = await authenticator.hasher.createCredential(userName, lastPassword);
111
+ await store.add(credential);
126
112
  await authenticator.setPasswordForUser(userName, lastPassword, password);
127
- expect(pmSpy).toBeCalled();
128
- const entryCount = await passwordStore.count({ userName: { $eq: userName } });
129
- expect(entryCount).toBe(1); // old entry should be removed
130
- const successResult = await authenticator.checkPasswordForUser(userName, password);
131
- expect(successResult.isValid).toBeTruthy();
132
- // Password updated, cannot use the last password
133
- const failResult = await authenticator.checkPasswordForUser(userName, lastPassword);
134
- expect(failResult.isValid).toBeFalsy();
135
- expect(failResult.reason).toBe('badUsernameOrPassword');
113
+ expect(complexitySpy).toHaveBeenCalled();
114
+ expect(await store.count({ userName: { $eq: userName } })).toBe(1);
115
+ expect((await authenticator.checkPasswordForUser(userName, password)).isValid).toBe(true);
116
+ expect((await authenticator.checkPasswordForUser(userName, lastPassword)).reason).toBe('badUsernameOrPassword');
136
117
  });
137
118
  });
138
- it('Should throw PasswordComplexityError if the complexity rules are not respected', async () => {
139
- await usingAsync(new Injector(), async (i) => {
119
+ it('throws PasswordComplexityError when the new password fails a complexity rule', async () => {
120
+ await usingAsync(createInjector(), async (i) => {
140
121
  const userName = randomString();
141
122
  const lastPassword = randomString();
142
- const password = '';
143
- setupSecurityStores(i);
123
+ useInMemorySecurityStores(i);
144
124
  usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] });
145
- const authenticator = i.getInstance(PasswordAuthenticator);
146
- const { hasher } = authenticator;
147
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
148
- const policyManager = i.getInstance(SecurityPolicyManager);
149
- const pmSpy = vi.spyOn(policyManager, 'matchPasswordComplexityRules');
150
- const entry = await hasher.createCredential(userName, lastPassword);
151
- await passwordStore.add(entry);
152
- await expect(authenticator.setPasswordForUser(userName, lastPassword, password)).rejects.toThrowError(PasswordComplexityError);
153
- expect(pmSpy).toBeCalled();
154
- const entryCount = await passwordStore.count({ userName: { $eq: userName } });
155
- expect(entryCount).toBe(1); // old entry should be removed
156
- const failResult = await authenticator.checkPasswordForUser(userName, password);
157
- // Password NOT updated, can use the last password
158
- expect(failResult.isValid).toBeFalsy();
159
- expect(failResult.reason).toBe('badUsernameOrPassword');
160
- // Password NOT updated, cannot use the new password
161
- const successResult = await authenticator.checkPasswordForUser(userName, lastPassword);
162
- expect(successResult.isValid).toBeTruthy();
125
+ const authenticator = i.get(PasswordAuthenticator);
126
+ const credential = await authenticator.hasher.createCredential(userName, lastPassword);
127
+ await i.get(PasswordCredentialStore).add(credential);
128
+ await expect(authenticator.setPasswordForUser(userName, lastPassword, '')).rejects.toBeInstanceOf(PasswordComplexityError);
129
+ expect((await authenticator.checkPasswordForUser(userName, lastPassword)).isValid).toBe(true);
163
130
  });
164
131
  });
165
- it('Should throw UnauthenticatedError if the last password is not valid', async () => {
166
- await usingAsync(new Injector(), async (i) => {
132
+ it('throws UnauthenticatedError when the previous password does not verify', async () => {
133
+ await usingAsync(createInjector(), async (i) => {
167
134
  const userName = randomString();
168
135
  const lastPassword = randomString();
169
- const password = randomString();
170
- setupSecurityStores(i);
136
+ useInMemorySecurityStores(i);
171
137
  usePasswordPolicy(i);
172
- const authenticator = i.getInstance(PasswordAuthenticator);
173
- const { hasher } = authenticator;
174
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
175
- const policyManager = i.getInstance(SecurityPolicyManager);
176
- const pmSpy = vi.spyOn(policyManager, 'matchPasswordComplexityRules');
177
- const entry = await hasher.createCredential(userName, lastPassword);
178
- await passwordStore.add(entry);
179
- await expect(authenticator.setPasswordForUser(userName, 'someBadLastPassword', password)).rejects.toThrowError(UnauthenticatedError);
180
- expect(pmSpy).toBeCalled();
181
- const entryCount = await passwordStore.count({ userName: { $eq: userName } });
182
- expect(entryCount).toBe(1); // old entry should be removed
183
- const failResult = await authenticator.checkPasswordForUser(userName, password);
184
- // Password NOT updated, can use the last password
185
- expect(failResult.isValid).toBeFalsy();
186
- expect(failResult.reason).toBe('badUsernameOrPassword');
187
- // Password NOT updated, cannot use the new password
188
- const successResult = await authenticator.checkPasswordForUser(userName, lastPassword);
189
- expect(successResult.isValid).toBeTruthy();
138
+ const authenticator = i.get(PasswordAuthenticator);
139
+ const credential = await authenticator.hasher.createCredential(userName, lastPassword);
140
+ await i.get(PasswordCredentialStore).add(credential);
141
+ await expect(authenticator.setPasswordForUser(userName, 'wrong', randomString())).rejects.toBeInstanceOf(UnauthenticatedError);
142
+ expect((await authenticator.checkPasswordForUser(userName, lastPassword)).isValid).toBe(true);
190
143
  });
191
144
  });
192
145
  });
193
146
  describe('resetPasswordForUser', () => {
194
- it('Should reset the password with the valid token', async () => {
195
- await usingAsync(new Injector(), async (i) => {
147
+ it('rotates the credential when the token is valid', async () => {
148
+ await usingAsync(createInjector(), async (i) => {
196
149
  const userName = randomString();
197
150
  const lastPassword = randomString();
198
151
  const password = randomString();
199
152
  const token = randomString();
200
- setupSecurityStores(i);
153
+ useInMemorySecurityStores(i);
201
154
  usePasswordPolicy(i);
202
- const authenticator = i.getInstance(PasswordAuthenticator);
203
- const { hasher } = authenticator;
204
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
205
- const resetTokenStore = i.getInstance(StoreManager).getStoreFor(PasswordResetToken, 'token');
206
- const entry = await hasher.createCredential(userName, lastPassword);
207
- await passwordStore.add(entry);
208
- await resetTokenStore.add({ userName, createdAt: new Date().toISOString(), token });
155
+ const authenticator = i.get(PasswordAuthenticator);
156
+ const credential = await authenticator.hasher.createCredential(userName, lastPassword);
157
+ await i.get(PasswordCredentialStore).add(credential);
158
+ await i.get(PasswordResetTokenStore).add({ userName, createdAt: new Date().toISOString(), token });
209
159
  await authenticator.resetPasswordForUser(token, password);
210
- const successResult = await authenticator.checkPasswordForUser(userName, password);
211
- expect(successResult.isValid).toBeTruthy();
212
- // Password updated, cannot use the last password
213
- const failResult = await authenticator.checkPasswordForUser(userName, lastPassword);
214
- expect(failResult.isValid).toBeFalsy();
215
- expect(failResult.reason).toBe('badUsernameOrPassword');
160
+ expect((await authenticator.checkPasswordForUser(userName, password)).isValid).toBe(true);
161
+ expect((await authenticator.checkPasswordForUser(userName, lastPassword)).reason).toBe('badUsernameOrPassword');
216
162
  });
217
163
  });
218
- it('Should throw PasswordComplexityError if the complexity rules are not respected', async () => {
219
- await usingAsync(new Injector(), async (i) => {
164
+ it('throws PasswordComplexityError and preserves the stored credential on complexity failure', async () => {
165
+ await usingAsync(createInjector(), async (i) => {
220
166
  const userName = randomString();
221
167
  const lastPassword = randomString();
222
- const password = '';
223
168
  const token = randomString();
224
- setupSecurityStores(i);
169
+ useInMemorySecurityStores(i);
225
170
  usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] });
226
- const authenticator = i.getInstance(PasswordAuthenticator);
227
- const { hasher } = authenticator;
228
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
229
- const resetTokenStore = i.getInstance(StoreManager).getStoreFor(PasswordResetToken, 'token');
230
- const entry = await hasher.createCredential(userName, lastPassword);
231
- await passwordStore.add(entry);
232
- await resetTokenStore.add({ userName, createdAt: new Date().toISOString(), token });
233
- await expect(authenticator.resetPasswordForUser(token, password)).rejects.toThrowError(PasswordComplexityError);
234
- const successResult = await authenticator.checkPasswordForUser(userName, lastPassword);
235
- expect(successResult.isValid).toBeTruthy();
236
- // Password updated, cannot use the last password
237
- const failResult = await authenticator.checkPasswordForUser(userName, password);
238
- expect(failResult.isValid).toBeFalsy();
239
- expect(failResult.reason).toBe('badUsernameOrPassword');
171
+ const authenticator = i.get(PasswordAuthenticator);
172
+ const credential = await authenticator.hasher.createCredential(userName, lastPassword);
173
+ await i.get(PasswordCredentialStore).add(credential);
174
+ await i.get(PasswordResetTokenStore).add({ userName, createdAt: new Date().toISOString(), token });
175
+ await expect(authenticator.resetPasswordForUser(token, '')).rejects.toBeInstanceOf(PasswordComplexityError);
176
+ expect((await authenticator.checkPasswordForUser(userName, lastPassword)).isValid).toBe(true);
240
177
  });
241
178
  });
242
- it('Should throw UnauthenticatedError if the token is not valid', async () => {
243
- await usingAsync(new Injector(), async (i) => {
244
- const userName = randomString();
245
- const lastPassword = randomString();
246
- const password = '';
247
- const token = randomString();
248
- setupSecurityStores(i);
179
+ it('throws UnauthenticatedError when the token does not exist', async () => {
180
+ await usingAsync(createInjector(), async (i) => {
181
+ useInMemorySecurityStores(i);
249
182
  usePasswordPolicy(i);
250
- const authenticator = i.getInstance(PasswordAuthenticator);
251
- const { hasher } = authenticator;
252
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
253
- const resetTokenStore = i.getInstance(StoreManager).getStoreFor(PasswordResetToken, 'token');
254
- const entry = await hasher.createCredential(userName, lastPassword);
255
- await passwordStore.add(entry);
256
- await resetTokenStore.add({ userName, createdAt: new Date().toISOString(), token });
257
- await expect(authenticator.resetPasswordForUser('someBadToken', password)).rejects.toThrowError(UnauthenticatedError);
258
- const successResult = await authenticator.checkPasswordForUser(userName, lastPassword);
259
- expect(successResult.isValid).toBeTruthy();
260
- // Password updated, cannot use the last password
261
- const failResult = await authenticator.checkPasswordForUser(userName, password);
262
- expect(failResult.isValid).toBeFalsy();
263
- expect(failResult.reason).toBe('badUsernameOrPassword');
183
+ const authenticator = i.get(PasswordAuthenticator);
184
+ await expect(authenticator.resetPasswordForUser('unknown', 'pw')).rejects.toBeInstanceOf(UnauthenticatedError);
264
185
  });
265
186
  });
266
- it('Should throw UnauthenticatedError and clean up token if the token has been expired', async () => {
267
- await usingAsync(new Injector(), async (i) => {
187
+ it('throws UnauthenticatedError and removes the expired token', async () => {
188
+ await usingAsync(createInjector(), async (i) => {
268
189
  const userName = randomString();
269
190
  const lastPassword = randomString();
270
- const password = '';
271
191
  const token = randomString();
272
- setupSecurityStores(i);
192
+ useInMemorySecurityStores(i);
273
193
  usePasswordPolicy(i, { resetTokenExpirationSeconds: 1 });
274
- const authenticator = i.getInstance(PasswordAuthenticator);
275
- const { hasher } = authenticator;
276
- const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
277
- const resetTokenStore = i.getInstance(StoreManager).getStoreFor(PasswordResetToken, 'token');
278
- const entry = await hasher.createCredential(userName, lastPassword);
279
- await passwordStore.add(entry);
280
- const creationDate = new Date();
281
- creationDate.setDate(creationDate.getDate() - 2);
282
- await resetTokenStore.add({ userName, createdAt: creationDate.toISOString(), token });
283
- await expect(authenticator.resetPasswordForUser(token, password)).rejects.toThrowError(UnauthenticatedError);
284
- const successResult = await authenticator.checkPasswordForUser(userName, lastPassword);
285
- expect(successResult.isValid).toBeTruthy();
286
- // Password updated, cannot use the last password
287
- const failResult = await authenticator.checkPasswordForUser(userName, password);
288
- expect(failResult.isValid).toBeFalsy();
289
- expect(failResult.reason).toBe('badUsernameOrPassword');
290
- const tokenCount = await resetTokenStore.count();
291
- expect(tokenCount).toBe(0);
194
+ const authenticator = i.get(PasswordAuthenticator);
195
+ const credential = await authenticator.hasher.createCredential(userName, lastPassword);
196
+ await i.get(PasswordCredentialStore).add(credential);
197
+ const pastCreatedAt = new Date();
198
+ pastCreatedAt.setDate(pastCreatedAt.getDate() - 2);
199
+ await i.get(PasswordResetTokenStore).add({ userName, createdAt: pastCreatedAt.toISOString(), token });
200
+ await expect(authenticator.resetPasswordForUser(token, randomString())).rejects.toBeInstanceOf(UnauthenticatedError);
201
+ expect(await i.get(PasswordResetTokenStore).count()).toBe(0);
292
202
  });
293
203
  });
294
204
  });
@@ -1 +1 @@
1
- {"version":3,"file":"password-authenticator.spec.js","sourceRoot":"","sources":["../src/password-authenticator.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"password-authenticator.spec.js","sourceRoot":"","sources":["../src/password-authenticator.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { type StoreToken } from '@furystack/core';
2
+ import { type DataSetToken } from '@furystack/repository';
3
+ import { PasswordCredential } from './models/password-credential.js';
4
+ import { PasswordResetToken } from './models/password-reset-token.js';
5
+ /**
6
+ * Error thrown by the default factories of {@link PasswordCredentialStore}
7
+ * and {@link PasswordResetTokenStore} when they are resolved without a
8
+ * caller-provided override.
9
+ *
10
+ * Password credentials and reset tokens **must** survive process restarts,
11
+ * so security refuses to fall back to an in-memory store. Applications
12
+ * must bind a persistent implementation before resolving the
13
+ * {@link PasswordAuthenticator}.
14
+ */
15
+ export declare class SecurityStoreNotConfiguredError extends Error {
16
+ constructor(storeName: string);
17
+ }
18
+ /**
19
+ * Store token for persisted {@link PasswordCredential} records. The default
20
+ * factory deliberately throws — applications are expected to rebind this
21
+ * token on their root injector with a persistent backing store before
22
+ * resolving any service that depends on it.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * injector.bind(PasswordCredentialStore, () => myPersistentCredentialStore)
27
+ * ```
28
+ */
29
+ export declare const PasswordCredentialStore: StoreToken<PasswordCredential, 'userName'>;
30
+ /**
31
+ * Store token for persisted {@link PasswordResetToken} records. Shares the
32
+ * throw-by-default contract with {@link PasswordCredentialStore}.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * injector.bind(PasswordResetTokenStore, () => myPersistentTokenStore)
37
+ * ```
38
+ */
39
+ export declare const PasswordResetTokenStore: StoreToken<PasswordResetToken, 'token'>;
40
+ /**
41
+ * Data set token over {@link PasswordCredentialStore}. The security services
42
+ * route all credential I/O through this dataset so authorization, hooks and
43
+ * change events can be layered on top of the raw store.
44
+ */
45
+ export declare const PasswordCredentialDataSet: DataSetToken<PasswordCredential, 'userName'>;
46
+ /**
47
+ * Data set token over {@link PasswordResetTokenStore}.
48
+ */
49
+ export declare const PasswordResetTokenDataSet: DataSetToken<PasswordResetToken, 'token'>;
50
+ //# sourceMappingURL=password-credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-credential-store.d.ts","sourceRoot":"","sources":["../src/password-credential-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AAErE;;;;;;;;;GASG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;gBAC5C,SAAS,EAAE,MAAM;CAM9B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,EAAE,UAAU,CAAC,kBAAkB,EAAE,UAAU,CAO7E,CAAA;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAO1E,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,YAAY,CAAC,kBAAkB,EAAE,UAAU,CAGjF,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAG9E,CAAA"}
@@ -0,0 +1,73 @@
1
+ import { defineStore } from '@furystack/core';
2
+ import { defineDataSet } from '@furystack/repository';
3
+ import { PasswordCredential } from './models/password-credential.js';
4
+ import { PasswordResetToken } from './models/password-reset-token.js';
5
+ /**
6
+ * Error thrown by the default factories of {@link PasswordCredentialStore}
7
+ * and {@link PasswordResetTokenStore} when they are resolved without a
8
+ * caller-provided override.
9
+ *
10
+ * Password credentials and reset tokens **must** survive process restarts,
11
+ * so security refuses to fall back to an in-memory store. Applications
12
+ * must bind a persistent implementation before resolving the
13
+ * {@link PasswordAuthenticator}.
14
+ */
15
+ export class SecurityStoreNotConfiguredError extends Error {
16
+ constructor(storeName) {
17
+ super(`Security store '${storeName}' has not been configured. Bind a persistent PhysicalStore for ${storeName} before resolving the PasswordAuthenticator.`);
18
+ this.name = 'SecurityStoreNotConfiguredError';
19
+ }
20
+ }
21
+ /**
22
+ * Store token for persisted {@link PasswordCredential} records. The default
23
+ * factory deliberately throws — applications are expected to rebind this
24
+ * token on their root injector with a persistent backing store before
25
+ * resolving any service that depends on it.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * injector.bind(PasswordCredentialStore, () => myPersistentCredentialStore)
30
+ * ```
31
+ */
32
+ export const PasswordCredentialStore = defineStore({
33
+ name: 'furystack/security/PasswordCredentialStore',
34
+ model: PasswordCredential,
35
+ primaryKey: 'userName',
36
+ factory: () => {
37
+ throw new SecurityStoreNotConfiguredError('PasswordCredentialStore');
38
+ },
39
+ });
40
+ /**
41
+ * Store token for persisted {@link PasswordResetToken} records. Shares the
42
+ * throw-by-default contract with {@link PasswordCredentialStore}.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * injector.bind(PasswordResetTokenStore, () => myPersistentTokenStore)
47
+ * ```
48
+ */
49
+ export const PasswordResetTokenStore = defineStore({
50
+ name: 'furystack/security/PasswordResetTokenStore',
51
+ model: PasswordResetToken,
52
+ primaryKey: 'token',
53
+ factory: () => {
54
+ throw new SecurityStoreNotConfiguredError('PasswordResetTokenStore');
55
+ },
56
+ });
57
+ /**
58
+ * Data set token over {@link PasswordCredentialStore}. The security services
59
+ * route all credential I/O through this dataset so authorization, hooks and
60
+ * change events can be layered on top of the raw store.
61
+ */
62
+ export const PasswordCredentialDataSet = defineDataSet({
63
+ name: 'furystack/security/PasswordCredentialDataSet',
64
+ store: PasswordCredentialStore,
65
+ });
66
+ /**
67
+ * Data set token over {@link PasswordResetTokenStore}.
68
+ */
69
+ export const PasswordResetTokenDataSet = defineDataSet({
70
+ name: 'furystack/security/PasswordResetTokenDataSet',
71
+ store: PasswordResetTokenStore,
72
+ });
73
+ //# sourceMappingURL=password-credential-store.js.map