@furystack/security 8.0.4 → 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 +23 -0
- package/README.md +2 -0
- package/esm/password-authenticator.d.ts.map +1 -1
- package/esm/password-authenticator.js +8 -0
- package/esm/password-authenticator.js.map +1 -1
- package/esm/password-authenticator.spec.js +5 -1
- package/esm/password-authenticator.spec.js.map +1 -1
- package/package.json +7 -7
- package/src/models/password-check-result.ts +1 -1
- package/src/password-authenticator.spec.ts +7 -1
- package/src/password-authenticator.ts +10 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
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
|
+
|
|
3
26
|
## [8.0.4] - 2026-09-18
|
|
4
27
|
|
|
5
28
|
### ⬆️ 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;
|
|
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":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAA;AAE/E,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAErG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AA+BpE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA8C,aAAa,CAAC;IAC5F,IAAI,EAAE,0CAA0C;IAChD,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAyB,EAAE;QAClE,MAAM,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAClD,MAAM,eAAe,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAA;QACzD,MAAM,YAAY,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAA;QACtD,MAAM,cAAc,GAAG,wBAAwB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAA;QAChG,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;
|
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/security",
|
|
3
|
-
"version": "8.0.
|
|
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.
|
|
41
|
-
"@furystack/inject": "^13.0.
|
|
42
|
-
"@furystack/repository": "^11.0.
|
|
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.
|
|
47
|
-
"@types/node": "^26.6.
|
|
46
|
+
"@furystack/utils": "^9.0.5",
|
|
47
|
+
"@types/node": "^26.6.6",
|
|
48
48
|
"typescript": "^7.0.2",
|
|
49
|
-
"vitest": "^5.0
|
|
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'
|
|
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 {
|