@furystack/security 6.0.38 → 7.0.1
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 +38 -0
- package/esm/helpers.d.ts +7 -2
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js +7 -2
- package/esm/helpers.js.map +1 -1
- package/esm/password-authenticator.d.ts +3 -2
- package/esm/password-authenticator.d.ts.map +1 -1
- package/esm/password-authenticator.js +21 -16
- package/esm/password-authenticator.js.map +1 -1
- package/esm/password-authenticator.spec.js +22 -19
- package/esm/password-authenticator.spec.js.map +1 -1
- package/package.json +5 -4
- package/src/helpers.ts +7 -2
- package/src/password-authenticator.spec.ts +23 -35
- package/src/password-authenticator.ts +20 -15
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [7.0.1] - 2026-02-26
|
|
4
|
+
|
|
5
|
+
### ⬆️ Dependencies
|
|
6
|
+
|
|
7
|
+
- Updated internal `@furystack/*` dependencies
|
|
8
|
+
- Bumped `@types/node` from ^25.3.0 to ^25.3.1
|
|
9
|
+
|
|
10
|
+
## [7.0.0] - 2026-02-26
|
|
11
|
+
|
|
12
|
+
### 💥 Breaking Changes
|
|
13
|
+
|
|
14
|
+
- `PasswordAuthenticator` now operates through the Repository DataSet layer instead of direct `PhysicalStore` access, ensuring authorization hooks and entity-sync events are triggered for credential and reset-token mutations
|
|
15
|
+
- Requires DataSets for `PasswordCredential` and `PasswordResetToken` to be registered via `getRepository(injector).createDataSet()` before instantiating `PasswordAuthenticator`
|
|
16
|
+
|
|
17
|
+
### 🔄 Migration
|
|
18
|
+
|
|
19
|
+
**Before:**
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
addStore(injector, new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' }))
|
|
23
|
+
usePasswordPolicy(injector)
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**After:**
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
addStore(injector, new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' })).addStore(
|
|
30
|
+
new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }),
|
|
31
|
+
)
|
|
32
|
+
getRepository(injector).createDataSet(PasswordCredential, 'userName')
|
|
33
|
+
getRepository(injector).createDataSet(PasswordResetToken, 'token')
|
|
34
|
+
usePasswordPolicy(injector)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 📦 Dependencies
|
|
38
|
+
|
|
39
|
+
- Added `@furystack/repository` for repository layer enforcement
|
|
40
|
+
|
|
3
41
|
## [6.0.38] - 2026-02-22
|
|
4
42
|
|
|
5
43
|
### ⬆️ Dependencies
|
package/esm/helpers.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { Injector } from '@furystack/inject';
|
|
2
2
|
import { SecurityPolicy } from './security-policy.js';
|
|
3
3
|
/**
|
|
4
|
-
* Sets up the @furystack/security with the provided settings
|
|
4
|
+
* Sets up the @furystack/security with the provided settings.
|
|
5
|
+
*
|
|
6
|
+
* **Prerequisite:** DataSets for `PasswordCredential` and `PasswordResetToken` must be registered
|
|
7
|
+
* via `getRepository(injector).createDataSet()` before `PasswordAuthenticator` is instantiated,
|
|
8
|
+
* as it resolves these DataSets through `@Injected`.
|
|
9
|
+
*
|
|
5
10
|
* @param injector The Injector instance
|
|
6
|
-
* @param
|
|
11
|
+
* @param policy The security policy to use
|
|
7
12
|
*/
|
|
8
13
|
export declare const usePasswordPolicy: (injector: Injector, policy?: Partial<SecurityPolicy>) => void;
|
|
9
14
|
//# sourceMappingURL=helpers.d.ts.map
|
package/esm/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,QAAQ,EAAE,SAAS,OAAO,CAAC,cAAc,CAAC,SAQrF,CAAA"}
|
package/esm/helpers.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { SecurityPolicy } from './security-policy.js';
|
|
2
2
|
/**
|
|
3
|
-
* Sets up the @furystack/security with the provided settings
|
|
3
|
+
* Sets up the @furystack/security with the provided settings.
|
|
4
|
+
*
|
|
5
|
+
* **Prerequisite:** DataSets for `PasswordCredential` and `PasswordResetToken` must be registered
|
|
6
|
+
* via `getRepository(injector).createDataSet()` before `PasswordAuthenticator` is instantiated,
|
|
7
|
+
* as it resolves these DataSets through `@Injected`.
|
|
8
|
+
*
|
|
4
9
|
* @param injector The Injector instance
|
|
5
|
-
* @param
|
|
10
|
+
* @param policy The security policy to use
|
|
6
11
|
*/
|
|
7
12
|
export const usePasswordPolicy = (injector, policy) => {
|
|
8
13
|
const plainPolicy = new SecurityPolicy();
|
package/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAkB,EAAE,MAAgC,EAAE,EAAE;IACxF,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAA;IAExC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;IAED,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;AAC3D,CAAC,CAAA"}
|
|
@@ -2,8 +2,9 @@ import type { PasswordCheckResult } from './models/index.js';
|
|
|
2
2
|
import type { PasswordHasher } from './password-hasher.js';
|
|
3
3
|
import { SecurityPolicyManager } from './security-policy-manager.js';
|
|
4
4
|
export declare class PasswordAuthenticator {
|
|
5
|
-
private readonly
|
|
6
|
-
private readonly
|
|
5
|
+
private readonly systemInjector;
|
|
6
|
+
private readonly passwordDataSet;
|
|
7
|
+
private readonly tokenDataSet;
|
|
7
8
|
readonly hasher: PasswordHasher;
|
|
8
9
|
/**
|
|
9
10
|
* @param userName The User's unique name
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-authenticator.d.ts","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password-authenticator.d.ts","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"AAOA,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,qBACa,qBAAqB;IAChC,iBACyB,cAAc,CAAU;IAEjD,iBACyB,eAAe,CAAyC;IAEjF,iBACyB,YAAY,CAAsC;IAE3E,SAGwB,MAAM,EAAE,cAAc,CAAA;IAE9C;;;;OAIG;IACU,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkBxG;;;;;OAKG;IACU,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7G;;;;OAIG;IACU,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5E,aAAa,EAAE,qBAAqB,CAAA;CACpD"}
|
|
@@ -7,8 +7,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
|
-
import {
|
|
10
|
+
import { useSystemIdentityContext } from '@furystack/core';
|
|
11
11
|
import { Injectable, Injected } from '@furystack/inject';
|
|
12
|
+
import { getDataSetFor } from '@furystack/repository';
|
|
12
13
|
import { UnauthenticatedError } from './errors/index.js';
|
|
13
14
|
import { PasswordComplexityError } from './errors/password-complexity-error.js';
|
|
14
15
|
import { PasswordCredential, PasswordResetToken } from './models/index.js';
|
|
@@ -20,7 +21,7 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
20
21
|
* @returns An object that contains an { isValid } value that indicates if the password is valid
|
|
21
22
|
*/
|
|
22
23
|
async checkPasswordForUser(userName, plainPassword) {
|
|
23
|
-
const entry = await this.
|
|
24
|
+
const entry = await this.passwordDataSet.get(this.systemInjector, userName);
|
|
24
25
|
if (!entry) {
|
|
25
26
|
return {
|
|
26
27
|
isValid: false,
|
|
@@ -52,11 +53,11 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
52
53
|
throw new UnauthenticatedError();
|
|
53
54
|
}
|
|
54
55
|
const newCredential = await this.hasher.createCredential(userName, plainPassword);
|
|
55
|
-
const existing = await this.
|
|
56
|
+
const existing = await this.passwordDataSet.get(this.systemInjector, userName);
|
|
56
57
|
if (existing) {
|
|
57
|
-
await this.
|
|
58
|
+
await this.passwordDataSet.remove(this.systemInjector, existing.userName);
|
|
58
59
|
}
|
|
59
|
-
await this.
|
|
60
|
+
await this.passwordDataSet.add(this.systemInjector, newCredential);
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Resets the password with a Password Reset token entry
|
|
@@ -64,12 +65,12 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
64
65
|
* @param plainPassword The new password in plain string
|
|
65
66
|
*/
|
|
66
67
|
async resetPasswordForUser(resetToken, plainPassword) {
|
|
67
|
-
const token = await this.
|
|
68
|
+
const token = await this.tokenDataSet.get(this.systemInjector, resetToken);
|
|
68
69
|
if (!token) {
|
|
69
70
|
throw new UnauthenticatedError();
|
|
70
71
|
}
|
|
71
72
|
if (this.policyManager.hasTokenExpired(token)) {
|
|
72
|
-
await this.
|
|
73
|
+
await this.tokenDataSet.remove(this.systemInjector, resetToken);
|
|
73
74
|
throw new UnauthenticatedError();
|
|
74
75
|
}
|
|
75
76
|
const complexityResult = await this.policyManager.matchPasswordComplexityRules(plainPassword);
|
|
@@ -77,21 +78,25 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
77
78
|
throw new PasswordComplexityError(complexityResult.errors);
|
|
78
79
|
}
|
|
79
80
|
const newCredential = await this.hasher.createCredential(token.userName, plainPassword);
|
|
80
|
-
const existing = await this.
|
|
81
|
+
const existing = await this.passwordDataSet.get(this.systemInjector, token.userName);
|
|
81
82
|
if (existing) {
|
|
82
|
-
await this.
|
|
83
|
+
await this.passwordDataSet.remove(this.systemInjector, existing.userName);
|
|
83
84
|
}
|
|
84
|
-
await this.
|
|
85
|
+
await this.passwordDataSet.add(this.systemInjector, newCredential);
|
|
85
86
|
}
|
|
86
87
|
};
|
|
87
88
|
__decorate([
|
|
88
|
-
Injected((injector) => injector
|
|
89
|
-
__metadata("design:type",
|
|
90
|
-
], PasswordAuthenticator.prototype, "
|
|
89
|
+
Injected((injector) => useSystemIdentityContext({ injector, username: 'PasswordAuthenticator' })),
|
|
90
|
+
__metadata("design:type", Function)
|
|
91
|
+
], PasswordAuthenticator.prototype, "systemInjector", void 0);
|
|
92
|
+
__decorate([
|
|
93
|
+
Injected((injector) => getDataSetFor(injector, PasswordCredential, 'userName')),
|
|
94
|
+
__metadata("design:type", Function)
|
|
95
|
+
], PasswordAuthenticator.prototype, "passwordDataSet", void 0);
|
|
91
96
|
__decorate([
|
|
92
|
-
Injected((injector) => injector
|
|
93
|
-
__metadata("design:type",
|
|
94
|
-
], PasswordAuthenticator.prototype, "
|
|
97
|
+
Injected((injector) => getDataSetFor(injector, PasswordResetToken, 'token')),
|
|
98
|
+
__metadata("design:type", Function)
|
|
99
|
+
], PasswordAuthenticator.prototype, "tokenDataSet", void 0);
|
|
95
100
|
__decorate([
|
|
96
101
|
Injected(function (injector) {
|
|
97
102
|
return injector.getInstance(this.policyManager.policy.hasher);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { addStore, InMemoryStore, StoreManager, User } from '@furystack/core';
|
|
2
2
|
import { Injector } from '@furystack/inject';
|
|
3
|
+
import { getRepository } from '@furystack/repository';
|
|
3
4
|
import { usingAsync } from '@furystack/utils';
|
|
4
5
|
import { randomBytes } from 'crypto';
|
|
5
6
|
import { describe, expect, it, vi } from 'vitest';
|
|
@@ -12,15 +13,25 @@ import { PasswordAuthenticator } from './password-authenticator.js';
|
|
|
12
13
|
import { createMinLengthComplexityRule } from './password-complexity-rules/min-length.js';
|
|
13
14
|
import { SecurityPolicyManager } from './security-policy-manager.js';
|
|
14
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');
|
|
22
|
+
};
|
|
15
23
|
describe('PasswordAuthenticator', () => {
|
|
16
24
|
it('Should be instantiated', async () => {
|
|
17
25
|
await usingAsync(new Injector(), async (i) => {
|
|
26
|
+
setupSecurityStores(i);
|
|
27
|
+
usePasswordPolicy(i);
|
|
18
28
|
const auth = i.getInstance(PasswordAuthenticator);
|
|
19
29
|
expect(auth).toBeInstanceOf(PasswordAuthenticator);
|
|
20
30
|
});
|
|
21
31
|
});
|
|
22
32
|
it('Should inherit policy from the extension method', async () => {
|
|
23
33
|
await usingAsync(new Injector(), async (i) => {
|
|
34
|
+
setupSecurityStores(i);
|
|
24
35
|
usePasswordPolicy(i, {
|
|
25
36
|
passwordComplexityRules: [createMinLengthComplexityRule(3)],
|
|
26
37
|
});
|
|
@@ -34,7 +45,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
34
45
|
await usingAsync(new Injector(), async (i) => {
|
|
35
46
|
const userName = randomString();
|
|
36
47
|
const password = randomString();
|
|
37
|
-
|
|
48
|
+
setupSecurityStores(i);
|
|
38
49
|
usePasswordPolicy(i, {});
|
|
39
50
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
40
51
|
const { hasher } = authenticator;
|
|
@@ -49,7 +60,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
49
60
|
await usingAsync(new Injector(), async (i) => {
|
|
50
61
|
const userName = randomString();
|
|
51
62
|
const password = randomString();
|
|
52
|
-
|
|
63
|
+
setupSecurityStores(i);
|
|
53
64
|
usePasswordPolicy(i);
|
|
54
65
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
55
66
|
const { hasher } = authenticator;
|
|
@@ -65,7 +76,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
65
76
|
await usingAsync(new Injector(), async (i) => {
|
|
66
77
|
const userName = randomString();
|
|
67
78
|
const password = randomString();
|
|
68
|
-
|
|
79
|
+
setupSecurityStores(i);
|
|
69
80
|
usePasswordPolicy(i);
|
|
70
81
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
71
82
|
const { hasher } = authenticator;
|
|
@@ -81,7 +92,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
81
92
|
await usingAsync(new Injector(), async (i) => {
|
|
82
93
|
const userName = randomString();
|
|
83
94
|
const password = randomString();
|
|
84
|
-
|
|
95
|
+
setupSecurityStores(i);
|
|
85
96
|
usePasswordPolicy(i, { passwordExpirationDays: 1 });
|
|
86
97
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
87
98
|
const { hasher } = authenticator;
|
|
@@ -103,7 +114,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
103
114
|
const userName = randomString();
|
|
104
115
|
const lastPassword = randomString();
|
|
105
116
|
const password = randomString();
|
|
106
|
-
|
|
117
|
+
setupSecurityStores(i);
|
|
107
118
|
usePasswordPolicy(i);
|
|
108
119
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
109
120
|
const { hasher } = authenticator;
|
|
@@ -129,7 +140,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
129
140
|
const userName = randomString();
|
|
130
141
|
const lastPassword = randomString();
|
|
131
142
|
const password = '';
|
|
132
|
-
|
|
143
|
+
setupSecurityStores(i);
|
|
133
144
|
usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] });
|
|
134
145
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
135
146
|
const { hasher } = authenticator;
|
|
@@ -156,7 +167,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
156
167
|
const userName = randomString();
|
|
157
168
|
const lastPassword = randomString();
|
|
158
169
|
const password = randomString();
|
|
159
|
-
|
|
170
|
+
setupSecurityStores(i);
|
|
160
171
|
usePasswordPolicy(i);
|
|
161
172
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
162
173
|
const { hasher } = authenticator;
|
|
@@ -186,9 +197,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
186
197
|
const lastPassword = randomString();
|
|
187
198
|
const password = randomString();
|
|
188
199
|
const token = randomString();
|
|
189
|
-
|
|
190
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
191
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
|
|
200
|
+
setupSecurityStores(i);
|
|
192
201
|
usePasswordPolicy(i);
|
|
193
202
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
194
203
|
const { hasher } = authenticator;
|
|
@@ -212,9 +221,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
212
221
|
const lastPassword = randomString();
|
|
213
222
|
const password = '';
|
|
214
223
|
const token = randomString();
|
|
215
|
-
|
|
216
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
217
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
|
|
224
|
+
setupSecurityStores(i);
|
|
218
225
|
usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] });
|
|
219
226
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
220
227
|
const { hasher } = authenticator;
|
|
@@ -238,9 +245,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
238
245
|
const lastPassword = randomString();
|
|
239
246
|
const password = '';
|
|
240
247
|
const token = randomString();
|
|
241
|
-
|
|
242
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
243
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
|
|
248
|
+
setupSecurityStores(i);
|
|
244
249
|
usePasswordPolicy(i);
|
|
245
250
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
246
251
|
const { hasher } = authenticator;
|
|
@@ -264,9 +269,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
264
269
|
const lastPassword = randomString();
|
|
265
270
|
const password = '';
|
|
266
271
|
const token = randomString();
|
|
267
|
-
|
|
268
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
269
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
|
|
272
|
+
setupSecurityStores(i);
|
|
270
273
|
usePasswordPolicy(i, { resetTokenExpirationSeconds: 1 });
|
|
271
274
|
const authenticator = i.getInstance(PasswordAuthenticator);
|
|
272
275
|
const { hasher } = authenticator;
|
|
@@ -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": "
|
|
3
|
+
"version": "7.0.1",
|
|
4
4
|
"description": "Security, password management and authorization related stuff for FuryStack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -37,13 +37,14 @@
|
|
|
37
37
|
"url": "https://github.com/furystack/furystack/issues"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@furystack/core": "^15.2.
|
|
41
|
-
"@furystack/inject": "^12.0.30"
|
|
40
|
+
"@furystack/core": "^15.2.2",
|
|
41
|
+
"@furystack/inject": "^12.0.30",
|
|
42
|
+
"@furystack/repository": "^10.1.3"
|
|
42
43
|
},
|
|
43
44
|
"homepage": "https://github.com/furystack/furystack",
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@furystack/utils": "^8.1.10",
|
|
46
|
-
"@types/node": "^25.3.
|
|
47
|
+
"@types/node": "^25.3.1",
|
|
47
48
|
"typescript": "^5.9.3",
|
|
48
49
|
"vitest": "^4.0.18"
|
|
49
50
|
},
|
package/src/helpers.ts
CHANGED
|
@@ -2,9 +2,14 @@ import type { Injector } from '@furystack/inject'
|
|
|
2
2
|
import { SecurityPolicy } from './security-policy.js'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Sets up the @furystack/security with the provided settings
|
|
5
|
+
* Sets up the @furystack/security with the provided settings.
|
|
6
|
+
*
|
|
7
|
+
* **Prerequisite:** DataSets for `PasswordCredential` and `PasswordResetToken` must be registered
|
|
8
|
+
* via `getRepository(injector).createDataSet()` before `PasswordAuthenticator` is instantiated,
|
|
9
|
+
* as it resolves these DataSets through `@Injected`.
|
|
10
|
+
*
|
|
6
11
|
* @param injector The Injector instance
|
|
7
|
-
* @param
|
|
12
|
+
* @param policy The security policy to use
|
|
8
13
|
*/
|
|
9
14
|
export const usePasswordPolicy = (injector: Injector, policy?: Partial<SecurityPolicy>) => {
|
|
10
15
|
const plainPolicy = new SecurityPolicy()
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { addStore, InMemoryStore, StoreManager, User } from '@furystack/core'
|
|
2
2
|
import { Injector } from '@furystack/inject'
|
|
3
|
+
import { getRepository } from '@furystack/repository'
|
|
3
4
|
import { usingAsync } from '@furystack/utils'
|
|
4
5
|
import { randomBytes } from 'crypto'
|
|
5
6
|
import { describe, expect, it, vi } from 'vitest'
|
|
@@ -15,9 +16,19 @@ import { SecurityPolicyManager } from './security-policy-manager.js'
|
|
|
15
16
|
|
|
16
17
|
const randomString = () => randomBytes(32).toString('hex')
|
|
17
18
|
|
|
19
|
+
const setupSecurityStores = (i: Injector) => {
|
|
20
|
+
addStore(i, new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' }))
|
|
21
|
+
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
22
|
+
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }))
|
|
23
|
+
getRepository(i).createDataSet(PasswordCredential, 'userName')
|
|
24
|
+
getRepository(i).createDataSet(PasswordResetToken, 'token')
|
|
25
|
+
}
|
|
26
|
+
|
|
18
27
|
describe('PasswordAuthenticator', () => {
|
|
19
28
|
it('Should be instantiated', async () => {
|
|
20
29
|
await usingAsync(new Injector(), async (i) => {
|
|
30
|
+
setupSecurityStores(i)
|
|
31
|
+
usePasswordPolicy(i)
|
|
21
32
|
const auth = i.getInstance(PasswordAuthenticator)
|
|
22
33
|
expect(auth).toBeInstanceOf(PasswordAuthenticator)
|
|
23
34
|
})
|
|
@@ -25,6 +36,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
25
36
|
|
|
26
37
|
it('Should inherit policy from the extension method', async () => {
|
|
27
38
|
await usingAsync(new Injector(), async (i) => {
|
|
39
|
+
setupSecurityStores(i)
|
|
28
40
|
usePasswordPolicy(i, {
|
|
29
41
|
passwordComplexityRules: [createMinLengthComplexityRule(3)],
|
|
30
42
|
})
|
|
@@ -40,9 +52,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
40
52
|
const userName = randomString()
|
|
41
53
|
const password = randomString()
|
|
42
54
|
|
|
43
|
-
|
|
44
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
45
|
-
)
|
|
55
|
+
setupSecurityStores(i)
|
|
46
56
|
usePasswordPolicy(i, {})
|
|
47
57
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
48
58
|
const { hasher } = authenticator
|
|
@@ -60,10 +70,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
60
70
|
await usingAsync(new Injector(), async (i) => {
|
|
61
71
|
const userName = randomString()
|
|
62
72
|
const password = randomString()
|
|
63
|
-
|
|
64
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
65
|
-
)
|
|
66
|
-
|
|
73
|
+
setupSecurityStores(i)
|
|
67
74
|
usePasswordPolicy(i)
|
|
68
75
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
69
76
|
const { hasher } = authenticator
|
|
@@ -82,9 +89,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
82
89
|
await usingAsync(new Injector(), async (i) => {
|
|
83
90
|
const userName = randomString()
|
|
84
91
|
const password = randomString()
|
|
85
|
-
|
|
86
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
87
|
-
)
|
|
92
|
+
setupSecurityStores(i)
|
|
88
93
|
usePasswordPolicy(i)
|
|
89
94
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
90
95
|
const { hasher } = authenticator
|
|
@@ -103,10 +108,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
103
108
|
await usingAsync(new Injector(), async (i) => {
|
|
104
109
|
const userName = randomString()
|
|
105
110
|
const password = randomString()
|
|
106
|
-
|
|
107
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
108
|
-
)
|
|
109
|
-
|
|
111
|
+
setupSecurityStores(i)
|
|
110
112
|
usePasswordPolicy(i, { passwordExpirationDays: 1 })
|
|
111
113
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
112
114
|
const { hasher } = authenticator
|
|
@@ -133,9 +135,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
133
135
|
const userName = randomString()
|
|
134
136
|
const lastPassword = randomString()
|
|
135
137
|
const password = randomString()
|
|
136
|
-
|
|
137
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
138
|
-
)
|
|
138
|
+
setupSecurityStores(i)
|
|
139
139
|
usePasswordPolicy(i)
|
|
140
140
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
141
141
|
const { hasher } = authenticator
|
|
@@ -169,9 +169,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
169
169
|
const userName = randomString()
|
|
170
170
|
const lastPassword = randomString()
|
|
171
171
|
const password = ''
|
|
172
|
-
|
|
173
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
174
|
-
)
|
|
172
|
+
setupSecurityStores(i)
|
|
175
173
|
usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] })
|
|
176
174
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
177
175
|
const { hasher } = authenticator
|
|
@@ -209,9 +207,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
209
207
|
const userName = randomString()
|
|
210
208
|
const lastPassword = randomString()
|
|
211
209
|
const password = randomString()
|
|
212
|
-
|
|
213
|
-
new InMemoryStore({ model: User, primaryKey: 'username' }),
|
|
214
|
-
)
|
|
210
|
+
setupSecurityStores(i)
|
|
215
211
|
usePasswordPolicy(i)
|
|
216
212
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
217
213
|
const { hasher } = authenticator
|
|
@@ -252,9 +248,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
252
248
|
const lastPassword = randomString()
|
|
253
249
|
const password = randomString()
|
|
254
250
|
const token = randomString()
|
|
255
|
-
|
|
256
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
257
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }))
|
|
251
|
+
setupSecurityStores(i)
|
|
258
252
|
usePasswordPolicy(i)
|
|
259
253
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
260
254
|
const { hasher } = authenticator
|
|
@@ -282,9 +276,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
282
276
|
const lastPassword = randomString()
|
|
283
277
|
const password = ''
|
|
284
278
|
const token = randomString()
|
|
285
|
-
|
|
286
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
287
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }))
|
|
279
|
+
setupSecurityStores(i)
|
|
288
280
|
usePasswordPolicy(i, { passwordComplexityRules: [createMinLengthComplexityRule(3)] })
|
|
289
281
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
290
282
|
const { hasher } = authenticator
|
|
@@ -311,9 +303,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
311
303
|
const lastPassword = randomString()
|
|
312
304
|
const password = ''
|
|
313
305
|
const token = randomString()
|
|
314
|
-
|
|
315
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
316
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }))
|
|
306
|
+
setupSecurityStores(i)
|
|
317
307
|
usePasswordPolicy(i)
|
|
318
308
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
319
309
|
const { hasher } = authenticator
|
|
@@ -342,9 +332,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
342
332
|
const lastPassword = randomString()
|
|
343
333
|
const password = ''
|
|
344
334
|
const token = randomString()
|
|
345
|
-
|
|
346
|
-
.addStore(new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
347
|
-
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }))
|
|
335
|
+
setupSecurityStores(i)
|
|
348
336
|
usePasswordPolicy(i, { resetTokenExpirationSeconds: 1 })
|
|
349
337
|
const authenticator = i.getInstance(PasswordAuthenticator)
|
|
350
338
|
const { hasher } = authenticator
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { useSystemIdentityContext } from '@furystack/core'
|
|
2
|
+
import type { Injector } from '@furystack/inject'
|
|
3
3
|
import { Injectable, Injected } from '@furystack/inject'
|
|
4
|
+
import type { DataSet } from '@furystack/repository'
|
|
5
|
+
import { getDataSetFor } from '@furystack/repository'
|
|
4
6
|
import { UnauthenticatedError } from './errors/index.js'
|
|
5
7
|
import { PasswordComplexityError } from './errors/password-complexity-error.js'
|
|
6
8
|
import type { PasswordCheckResult } from './models/index.js'
|
|
@@ -10,11 +12,14 @@ import { SecurityPolicyManager } from './security-policy-manager.js'
|
|
|
10
12
|
|
|
11
13
|
@Injectable({ lifetime: 'singleton' })
|
|
12
14
|
export class PasswordAuthenticator {
|
|
13
|
-
@Injected((injector) => injector
|
|
14
|
-
declare private readonly
|
|
15
|
+
@Injected((injector) => useSystemIdentityContext({ injector, username: 'PasswordAuthenticator' }))
|
|
16
|
+
declare private readonly systemInjector: Injector
|
|
15
17
|
|
|
16
|
-
@Injected((injector) => injector
|
|
17
|
-
declare private readonly
|
|
18
|
+
@Injected((injector) => getDataSetFor(injector, PasswordCredential, 'userName'))
|
|
19
|
+
declare private readonly passwordDataSet: DataSet<PasswordCredential, 'userName'>
|
|
20
|
+
|
|
21
|
+
@Injected((injector) => getDataSetFor(injector, PasswordResetToken, 'token'))
|
|
22
|
+
declare private readonly tokenDataSet: DataSet<PasswordResetToken, 'token'>
|
|
18
23
|
|
|
19
24
|
@Injected(function (this: PasswordAuthenticator, injector) {
|
|
20
25
|
return injector.getInstance(this.policyManager.policy.hasher)
|
|
@@ -27,7 +32,7 @@ export class PasswordAuthenticator {
|
|
|
27
32
|
* @returns An object that contains an { isValid } value that indicates if the password is valid
|
|
28
33
|
*/
|
|
29
34
|
public async checkPasswordForUser(userName: string, plainPassword: string): Promise<PasswordCheckResult> {
|
|
30
|
-
const entry = await this.
|
|
35
|
+
const entry = await this.passwordDataSet.get(this.systemInjector, userName)
|
|
31
36
|
if (!entry) {
|
|
32
37
|
return {
|
|
33
38
|
isValid: false,
|
|
@@ -61,11 +66,11 @@ export class PasswordAuthenticator {
|
|
|
61
66
|
throw new UnauthenticatedError()
|
|
62
67
|
}
|
|
63
68
|
const newCredential = await this.hasher.createCredential(userName, plainPassword)
|
|
64
|
-
const existing = await this.
|
|
69
|
+
const existing = await this.passwordDataSet.get(this.systemInjector, userName)
|
|
65
70
|
if (existing) {
|
|
66
|
-
await this.
|
|
71
|
+
await this.passwordDataSet.remove(this.systemInjector, existing.userName)
|
|
67
72
|
}
|
|
68
|
-
await this.
|
|
73
|
+
await this.passwordDataSet.add(this.systemInjector, newCredential)
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
/**
|
|
@@ -74,14 +79,14 @@ export class PasswordAuthenticator {
|
|
|
74
79
|
* @param plainPassword The new password in plain string
|
|
75
80
|
*/
|
|
76
81
|
public async resetPasswordForUser(resetToken: string, plainPassword: string): Promise<void> {
|
|
77
|
-
const token = await this.
|
|
82
|
+
const token = await this.tokenDataSet.get(this.systemInjector, resetToken)
|
|
78
83
|
|
|
79
84
|
if (!token) {
|
|
80
85
|
throw new UnauthenticatedError()
|
|
81
86
|
}
|
|
82
87
|
|
|
83
88
|
if (this.policyManager.hasTokenExpired(token)) {
|
|
84
|
-
await this.
|
|
89
|
+
await this.tokenDataSet.remove(this.systemInjector, resetToken)
|
|
85
90
|
throw new UnauthenticatedError()
|
|
86
91
|
}
|
|
87
92
|
|
|
@@ -91,11 +96,11 @@ export class PasswordAuthenticator {
|
|
|
91
96
|
}
|
|
92
97
|
|
|
93
98
|
const newCredential = await this.hasher.createCredential(token.userName, plainPassword)
|
|
94
|
-
const existing = await this.
|
|
99
|
+
const existing = await this.passwordDataSet.get(this.systemInjector, token.userName)
|
|
95
100
|
if (existing) {
|
|
96
|
-
await this.
|
|
101
|
+
await this.passwordDataSet.remove(this.systemInjector, existing.userName)
|
|
97
102
|
}
|
|
98
|
-
await this.
|
|
103
|
+
await this.passwordDataSet.add(this.systemInjector, newCredential)
|
|
99
104
|
}
|
|
100
105
|
|
|
101
106
|
@Injected(SecurityPolicyManager)
|