@furystack/security 8.0.3 → 8.0.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## [8.0.5] - 2026-11-14
4
+
5
+ ### 🧹 Chores
6
+
7
+ - Cleaned up `PasswordCheckResult` by removing an obsolete TODO from the failed-result reason type.
8
+
9
+ ### Dependencies
10
+
11
+ - Patch release to include updated FuryStack dependency versions
12
+
13
+ ### 🐛 Bug Fixes
14
+
15
+ - `resetPasswordForUser` now removes the reset token after a successful password reset so tokens cannot be reused
16
+ - `checkPasswordForUser` performs a dummy verification when the user does not exist to reduce username timing differences
17
+
18
+ ### ⬆️ Dependencies
19
+
20
+ - Updated dependencies
21
+
22
+ ### Documentation
23
+
24
+ - Added cross-link to the in-repo [full-stack monorepo guide](../../docs/getting-started/fullstack-monorepo.md) for password/auth bootstrap and first-user seeding patterns
25
+
26
+ ## [8.0.4] - 2026-09-18
27
+
28
+ ### ⬆️ Dependencies
29
+
30
+ - Updated dependencies
31
+
3
32
  ## [8.0.3] - 2026-08-26
4
33
 
5
34
  ### ⬆️ Dependencies
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Password management, authentication, and authorization utilities for FuryStack.
4
4
 
5
+ For an end-to-end app bootstrap (password policy, stores, auth wiring, seeding first user), see [Full-stack monorepo app](../../docs/getting-started/fullstack-monorepo.md).
6
+
5
7
  ## Installation
6
8
 
7
9
  ```bash
@@ -1 +1 @@
1
- {"version":3,"file":"password-authenticator.d.ts","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,6GAA6G;IAC7G,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAA;IAC7C;;;OAGG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC3F;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/E;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,WAAW,CAoE1E,CAAA"}
1
+ {"version":3,"file":"password-authenticator.d.ts","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAI7D,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,mBAAmB,CAAA;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEpE;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,6GAA6G;IAC7G,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAA;IAC7C;;;OAGG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC3F;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChG;;;;OAIG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/E;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,WAAW,CA4E1E,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { useSystemIdentityContext } from '@furystack/core';
2
2
  import { defineService } from '@furystack/inject';
3
+ import { randomBytes } from 'crypto';
3
4
  import { UnauthenticatedError } from './errors/index.js';
4
5
  import { PasswordComplexityError } from './errors/password-complexity-error.js';
5
6
  import { PasswordCredentialDataSet, PasswordResetTokenDataSet } from './password-credential-store.js';
@@ -21,9 +22,15 @@ export const PasswordAuthenticator = defineService({
21
22
  const tokenDataSet = inject(PasswordResetTokenDataSet);
22
23
  const systemInjector = useSystemIdentityContext({ injector, username: 'PasswordAuthenticator' });
23
24
  onDispose(() => systemInjector[Symbol.asyncDispose]());
25
+ let dummyCredentialPromise;
26
+ const getDummyCredential = () => {
27
+ dummyCredentialPromise ??= hasher.createCredential('__dummy__', randomBytes(16).toString('hex'));
28
+ return dummyCredentialPromise;
29
+ };
24
30
  const checkPasswordForUser = async (userName, plainPassword) => {
25
31
  const entry = await passwordDataSet.get(systemInjector, userName);
26
32
  if (!entry) {
33
+ await hasher.verifyCredential(plainPassword, await getDummyCredential());
27
34
  return { isValid: false, reason: 'badUsernameOrPassword' };
28
35
  }
29
36
  const result = await hasher.verifyCredential(plainPassword, entry);
@@ -65,6 +72,7 @@ export const PasswordAuthenticator = defineService({
65
72
  throw new PasswordComplexityError(complexityResult.errors);
66
73
  }
67
74
  await replaceCredential(token.userName, plainPassword);
75
+ await tokenDataSet.remove(systemInjector, resetToken);
68
76
  };
69
77
  return {
70
78
  hasher,
@@ -1 +1 @@
1
- {"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"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"}
@@ -60,9 +60,11 @@ describe('PasswordAuthenticator', () => {
60
60
  const authenticator = i.get(PasswordAuthenticator);
61
61
  const credential = await authenticator.hasher.createCredential('someone', 'pw');
62
62
  await i.get(PasswordCredentialStore).add(credential);
63
+ const verifySpy = vi.spyOn(authenticator.hasher, 'verifyCredential');
63
64
  const failure = (await authenticator.checkPasswordForUser('nobody', 'pw'));
64
65
  expect(failure.isValid).toBe(false);
65
66
  expect(failure.reason).toBe('badUsernameOrPassword');
67
+ expect(verifySpy).toHaveBeenCalled();
66
68
  });
67
69
  });
68
70
  it('returns badUsernameOrPassword for the wrong password', async () => {
@@ -144,7 +146,7 @@ describe('PasswordAuthenticator', () => {
144
146
  });
145
147
  });
146
148
  describe('resetPasswordForUser', () => {
147
- it('rotates the credential when the token is valid', async () => {
149
+ it('rotates the credential when the token is valid and removes the token', async () => {
148
150
  await usingAsync(createInjector(), async (i) => {
149
151
  const userName = randomString();
150
152
  const lastPassword = randomString();
@@ -159,6 +161,8 @@ describe('PasswordAuthenticator', () => {
159
161
  await authenticator.resetPasswordForUser(token, password);
160
162
  expect((await authenticator.checkPasswordForUser(userName, password)).isValid).toBe(true);
161
163
  expect((await authenticator.checkPasswordForUser(userName, lastPassword)).reason).toBe('badUsernameOrPassword');
164
+ expect(await i.get(PasswordResetTokenStore).count()).toBe(0);
165
+ await expect(authenticator.resetPasswordForUser(token, randomString())).rejects.toBeInstanceOf(UnauthenticatedError);
162
166
  });
163
167
  });
164
168
  it('throws PasswordComplexityError and preserves the stored credential on complexity failure', async () => {
@@ -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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAiB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACjG,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAA;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEpE,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAE1D;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,CAAC,CAAW,EAAE,EAAE;IAChD,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IAC/G,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;AAC9G,CAAC,CAAA;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC7C,yBAAyB,CAAC,CAAC,CAAC,CAAA;YAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;YACpB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YACzC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;YACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC7C,yBAAyB,CAAC,CAAC,CAAC,CAAA;YAC5B,iBAAiB,CAAC,CAAC,EAAE,EAAE,uBAAuB,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACrF,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YACzC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACrF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;gBAClF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAEpD,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3F,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;gBAC/E,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACpD,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;gBAEpE,MAAM,OAAO,GAAG,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAA8B,CAAA;gBACvG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACnC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;gBACpD,MAAM,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,CAAA;YACtC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;gBACjF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAEpD,MAAM,OAAO,GAAG,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAA8B,CAAA;gBAC1G,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACnC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YACtD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;YACpG,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,EAAE,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC,CAAA;gBACnD,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;gBAClF,MAAM,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAA;gBACpC,iBAAiB,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBAC1D,UAAU,CAAC,YAAY,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAA;gBACzD,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAEpD,MAAM,OAAO,GAAG,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAA8B,CAAA;gBAC3G,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACnC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAChD,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;gBACnC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;gBAC5C,MAAM,aAAa,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,8BAA8B,CAAC,CAAA;gBAC5F,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBACtF,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAE3B,MAAM,aAAa,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAA;gBAExE,MAAM,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAA;gBACxC,MAAM,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClE,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACzF,MAAM,CACH,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAA+B,CAAC,MAAM,CACzG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YACjC,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;gBACnC,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,EAAE,EAAE,uBAAuB,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBACrF,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBACtF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAEpD,MAAM,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC/F,uBAAuB,CACxB,CAAA;gBACD,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/F,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;gBACnC,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBACtF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBAEpD,MAAM,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CACtG,oBAAoB,CACrB,CAAA;gBACD,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/F,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;gBACnC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;gBAC5B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBACtF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACpD,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;gBAElG,MAAM,aAAa,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;gBAEzD,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACzF,MAAM,CACH,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAA+B,CAAC,MAAM,CACzG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;gBAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC5D,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC5F,oBAAoB,CACrB,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;YACxG,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;gBACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;gBAC5B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,EAAE,EAAE,uBAAuB,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBACrF,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBACtF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACpD,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;gBAElG,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAA;gBAC3G,MAAM,CAAC,CAAC,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/F,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,CAAC,CAAA;gBACpB,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAElD,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAA;YAChH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,UAAU,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;gBAC/B,MAAM,YAAY,GAAG,YAAY,EAAE,CAAA;gBACnC,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;gBAC5B,yBAAyB,CAAC,CAAC,CAAC,CAAA;gBAC5B,iBAAiB,CAAC,CAAC,EAAE,EAAE,2BAA2B,EAAE,CAAC,EAAE,CAAC,CAAA;gBACxD,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;gBAClD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;gBACtF,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACpD,MAAM,aAAa,GAAG,IAAI,IAAI,EAAE,CAAA;gBAChC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBAClD,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;gBAErG,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAC5F,oBAAoB,CACrB,CAAA;gBACD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9D,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/security",
3
- "version": "8.0.3",
3
+ "version": "8.0.5",
4
4
  "description": "Security, password management and authorization related stuff for FuryStack",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -37,16 +37,16 @@
37
37
  "url": "https://github.com/furystack/furystack/issues"
38
38
  },
39
39
  "dependencies": {
40
- "@furystack/core": "^17.1.2",
41
- "@furystack/inject": "^13.0.3",
42
- "@furystack/repository": "^11.0.3"
40
+ "@furystack/core": "^17.1.4",
41
+ "@furystack/inject": "^13.0.5",
42
+ "@furystack/repository": "^11.0.5"
43
43
  },
44
44
  "homepage": "https://github.com/furystack/furystack",
45
45
  "devDependencies": {
46
- "@furystack/utils": "^9.0.3",
47
- "@types/node": "^26.3.0",
46
+ "@furystack/utils": "^9.0.5",
47
+ "@types/node": "^26.6.6",
48
48
  "typescript": "^7.0.2",
49
- "vitest": "^4.1.11"
49
+ "vitest": "^5.1.0"
50
50
  },
51
51
  "engines": {
52
52
  "node": ">=24.0.0"
@@ -5,7 +5,7 @@ export interface PasswordCheckSuccessResult {
5
5
 
6
6
  export interface PasswordCheckFailedResult {
7
7
  isValid: false
8
- reason: 'badUsernameOrPassword' | 'passwordExpired' // TODO | 'challengeNeeded'
8
+ reason: 'badUsernameOrPassword' | 'passwordExpired'
9
9
  }
10
10
 
11
11
  export type PasswordCheckResult = PasswordCheckFailedResult | PasswordCheckSuccessResult
@@ -68,10 +68,12 @@ describe('PasswordAuthenticator', () => {
68
68
  const authenticator = i.get(PasswordAuthenticator)
69
69
  const credential = await authenticator.hasher.createCredential('someone', 'pw')
70
70
  await i.get(PasswordCredentialStore).add(credential)
71
+ const verifySpy = vi.spyOn(authenticator.hasher, 'verifyCredential')
71
72
 
72
73
  const failure = (await authenticator.checkPasswordForUser('nobody', 'pw')) as PasswordCheckFailedResult
73
74
  expect(failure.isValid).toBe(false)
74
75
  expect(failure.reason).toBe('badUsernameOrPassword')
76
+ expect(verifySpy).toHaveBeenCalled()
75
77
  })
76
78
  })
77
79
 
@@ -171,7 +173,7 @@ describe('PasswordAuthenticator', () => {
171
173
  })
172
174
 
173
175
  describe('resetPasswordForUser', () => {
174
- it('rotates the credential when the token is valid', async () => {
176
+ it('rotates the credential when the token is valid and removes the token', async () => {
175
177
  await usingAsync(createInjector(), async (i) => {
176
178
  const userName = randomString()
177
179
  const lastPassword = randomString()
@@ -190,6 +192,10 @@ describe('PasswordAuthenticator', () => {
190
192
  expect(
191
193
  ((await authenticator.checkPasswordForUser(userName, lastPassword)) as PasswordCheckFailedResult).reason,
192
194
  ).toBe('badUsernameOrPassword')
195
+ expect(await i.get(PasswordResetTokenStore).count()).toBe(0)
196
+ await expect(authenticator.resetPasswordForUser(token, randomString())).rejects.toBeInstanceOf(
197
+ UnauthenticatedError,
198
+ )
193
199
  })
194
200
  })
195
201
 
@@ -1,8 +1,9 @@
1
1
  import { useSystemIdentityContext } from '@furystack/core'
2
2
  import { defineService, type Token } from '@furystack/inject'
3
+ import { randomBytes } from 'crypto'
3
4
  import { UnauthenticatedError } from './errors/index.js'
4
5
  import { PasswordComplexityError } from './errors/password-complexity-error.js'
5
- import type { PasswordCheckResult } from './models/index.js'
6
+ import type { PasswordCheckResult, PasswordCredential } from './models/index.js'
6
7
  import { PasswordCredentialDataSet, PasswordResetTokenDataSet } from './password-credential-store.js'
7
8
  import type { PasswordHasher } from './password-hasher.js'
8
9
  import { SecurityPolicyManager } from './security-policy-manager.js'
@@ -53,10 +54,17 @@ export const PasswordAuthenticator: Token<PasswordAuthenticator, 'singleton'> =
53
54
  const tokenDataSet = inject(PasswordResetTokenDataSet)
54
55
  const systemInjector = useSystemIdentityContext({ injector, username: 'PasswordAuthenticator' })
55
56
  onDispose(() => systemInjector[Symbol.asyncDispose]())
57
+ let dummyCredentialPromise: Promise<PasswordCredential> | undefined
58
+
59
+ const getDummyCredential = () => {
60
+ dummyCredentialPromise ??= hasher.createCredential('__dummy__', randomBytes(16).toString('hex'))
61
+ return dummyCredentialPromise
62
+ }
56
63
 
57
64
  const checkPasswordForUser = async (userName: string, plainPassword: string): Promise<PasswordCheckResult> => {
58
65
  const entry = await passwordDataSet.get(systemInjector, userName)
59
66
  if (!entry) {
67
+ await hasher.verifyCredential(plainPassword, await getDummyCredential())
60
68
  return { isValid: false, reason: 'badUsernameOrPassword' }
61
69
  }
62
70
  const result = await hasher.verifyCredential(plainPassword, entry)
@@ -101,6 +109,7 @@ export const PasswordAuthenticator: Token<PasswordAuthenticator, 'singleton'> =
101
109
  throw new PasswordComplexityError(complexityResult.errors)
102
110
  }
103
111
  await replaceCredential(token.userName, plainPassword)
112
+ await tokenDataSet.remove(systemInjector, resetToken)
104
113
  }
105
114
 
106
115
  return {