@furystack/security 2.1.16 → 3.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/{dist → esm}/crypto-password-hasher.js +7 -10
- package/esm/crypto-password-hasher.js.map +1 -0
- package/esm/errors/index.js +4 -0
- package/esm/errors/index.js.map +1 -0
- package/esm/errors/password-complexity-error.js +11 -0
- package/esm/errors/password-complexity-error.js.map +1 -0
- package/esm/errors/unauthenticated-error.js +6 -0
- package/{dist → esm}/errors/unauthenticated-error.js.map +1 -1
- package/esm/helpers.js +12 -0
- package/esm/helpers.js.map +1 -0
- package/esm/index.js +9 -0
- package/esm/index.js.map +1 -0
- package/esm/models/index.js +6 -0
- package/esm/models/index.js.map +1 -0
- package/esm/models/password-check-result.js +2 -0
- package/esm/models/password-complexity-result.js +2 -0
- package/esm/models/password-complexity-rule.js +2 -0
- package/esm/models/password-credential.js +6 -0
- package/{dist → esm}/models/password-credential.js.map +1 -1
- package/esm/models/password-reset-token.js +3 -0
- package/{dist → esm}/models/password-reset-token.js.map +1 -1
- package/{dist → esm}/password-authenticator.js +20 -25
- package/esm/password-authenticator.js.map +1 -0
- package/{dist → esm}/password-complexity-rules/contains-lowercase.js +1 -5
- package/esm/password-complexity-rules/contains-lowercase.js.map +1 -0
- package/{dist → esm}/password-complexity-rules/contains-uppercase.js +1 -5
- package/esm/password-complexity-rules/contains-uppercase.js.map +1 -0
- package/esm/password-complexity-rules/index.js +5 -0
- package/{dist → esm}/password-complexity-rules/index.js.map +1 -1
- package/{dist → esm}/password-complexity-rules/max-length.js +1 -5
- package/esm/password-complexity-rules/max-length.js.map +1 -0
- package/{dist → esm}/password-complexity-rules/min-length.js +1 -5
- package/esm/password-complexity-rules/min-length.js.map +1 -0
- package/{dist → esm}/password-hasher.js +3 -6
- package/esm/password-hasher.js.map +1 -0
- package/{dist → esm}/security-policy-manager.js +6 -9
- package/esm/security-policy-manager.js.map +1 -0
- package/{dist → esm}/security-policy.js +5 -8
- package/esm/security-policy.js.map +1 -0
- package/package.json +28 -13
- package/src/helpers.ts +0 -1
- package/src/password-authenticator.spec.ts +4 -3
- package/src/password-authenticator.ts +1 -3
- package/src/password-complexity-rules/contains-lowercase.spec.ts +1 -0
- package/src/password-complexity-rules/contains-uppercase.spec.ts +1 -0
- package/src/password-complexity-rules/max-length.spec.ts +1 -0
- package/src/password-complexity-rules/min-length.spec.ts +1 -0
- package/src/security-policy-manager.spec.ts +1 -0
- package/types/helpers.d.ts +0 -1
- package/types/helpers.d.ts.map +1 -1
- package/types/password-authenticator.d.ts +1 -3
- package/types/password-authenticator.d.ts.map +1 -1
- package/dist/crypto-password-hasher.js.map +0 -1
- package/dist/errors/index.js +0 -20
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/password-complexity-error.js +0 -15
- package/dist/errors/password-complexity-error.js.map +0 -1
- package/dist/errors/unauthenticated-error.js +0 -10
- package/dist/helpers.js +0 -17
- package/dist/helpers.js.map +0 -1
- package/dist/index.js +0 -25
- package/dist/index.js.map +0 -1
- package/dist/models/index.js +0 -22
- package/dist/models/index.js.map +0 -1
- package/dist/models/password-check-result.js +0 -3
- package/dist/models/password-complexity-result.js +0 -3
- package/dist/models/password-complexity-rule.js +0 -3
- package/dist/models/password-credential.js +0 -10
- package/dist/models/password-reset-token.js +0 -7
- package/dist/password-authenticator.js.map +0 -1
- package/dist/password-authenticator.spec.js +0 -292
- package/dist/password-authenticator.spec.js.map +0 -1
- package/dist/password-complexity-rules/contains-lowercase.js.map +0 -1
- package/dist/password-complexity-rules/contains-lowercase.spec.js +0 -28
- package/dist/password-complexity-rules/contains-lowercase.spec.js.map +0 -1
- package/dist/password-complexity-rules/contains-uppercase.js.map +0 -1
- package/dist/password-complexity-rules/contains-uppercase.spec.js +0 -28
- package/dist/password-complexity-rules/contains-uppercase.spec.js.map +0 -1
- package/dist/password-complexity-rules/index.js +0 -21
- package/dist/password-complexity-rules/max-length.js.map +0 -1
- package/dist/password-complexity-rules/max-length.spec.js +0 -17
- package/dist/password-complexity-rules/max-length.spec.js.map +0 -1
- package/dist/password-complexity-rules/min-length.js.map +0 -1
- package/dist/password-complexity-rules/min-length.spec.js +0 -17
- package/dist/password-complexity-rules/min-length.spec.js.map +0 -1
- package/dist/password-hasher.js.map +0 -1
- package/dist/security-policy-manager.js.map +0 -1
- package/dist/security-policy-manager.spec.js +0 -18
- package/dist/security-policy-manager.spec.js.map +0 -1
- package/dist/security-policy.js.map +0 -1
- package/types/password-authenticator.spec.d.ts +0 -2
- package/types/password-authenticator.spec.d.ts.map +0 -1
- package/types/password-complexity-rules/contains-lowercase.spec.d.ts +0 -2
- package/types/password-complexity-rules/contains-lowercase.spec.d.ts.map +0 -1
- package/types/password-complexity-rules/contains-uppercase.spec.d.ts +0 -2
- package/types/password-complexity-rules/contains-uppercase.spec.d.ts.map +0 -1
- package/types/password-complexity-rules/max-length.spec.d.ts +0 -2
- package/types/password-complexity-rules/max-length.spec.d.ts.map +0 -1
- package/types/password-complexity-rules/min-length.spec.d.ts +0 -2
- package/types/password-complexity-rules/min-length.spec.d.ts.map +0 -1
- package/types/security-policy-manager.spec.d.ts +0 -2
- package/types/security-policy-manager.spec.d.ts.map +0 -1
- /package/{dist → esm}/models/password-check-result.js.map +0 -0
- /package/{dist → esm}/models/password-complexity-result.js.map +0 -0
- /package/{dist → esm}/models/password-complexity-rule.js.map +0 -0
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const inject_1 = require("@furystack/inject");
|
|
11
|
-
const crypto_1 = require("crypto");
|
|
7
|
+
import { Injectable } from '@furystack/inject';
|
|
8
|
+
import { randomBytes, pbkdf2 } from 'crypto';
|
|
12
9
|
let CryptoPasswordHasher = class CryptoPasswordHasher {
|
|
13
10
|
constructor() {
|
|
14
11
|
this.iterations = 1000;
|
|
15
12
|
this.keylen = 64;
|
|
16
13
|
}
|
|
17
14
|
async verifyCredential(password, { passwordHash, salt }) {
|
|
18
|
-
const newHash = await new Promise((resolve, reject) =>
|
|
15
|
+
const newHash = await new Promise((resolve, reject) => pbkdf2(password, salt, this.iterations, this.keylen, 'sha512', (err, key) => err ? reject(err) : resolve(key.toString('hex'))));
|
|
19
16
|
if (newHash === passwordHash) {
|
|
20
17
|
return {
|
|
21
18
|
isValid: true,
|
|
@@ -27,8 +24,8 @@ let CryptoPasswordHasher = class CryptoPasswordHasher {
|
|
|
27
24
|
};
|
|
28
25
|
}
|
|
29
26
|
async createCredential(userName, password) {
|
|
30
|
-
const salt =
|
|
31
|
-
const passwordHash = await new Promise((resolve, reject) =>
|
|
27
|
+
const salt = randomBytes(16).toString('hex');
|
|
28
|
+
const passwordHash = await new Promise((resolve, reject) => pbkdf2(password, salt, this.iterations, this.keylen, 'sha512', (err, key) => err ? reject(err) : resolve(key.toString('hex'))));
|
|
32
29
|
return {
|
|
33
30
|
userName,
|
|
34
31
|
salt,
|
|
@@ -38,7 +35,7 @@ let CryptoPasswordHasher = class CryptoPasswordHasher {
|
|
|
38
35
|
}
|
|
39
36
|
};
|
|
40
37
|
CryptoPasswordHasher = __decorate([
|
|
41
|
-
|
|
38
|
+
Injectable({ lifetime: 'singleton' })
|
|
42
39
|
], CryptoPasswordHasher);
|
|
43
|
-
|
|
40
|
+
export { CryptoPasswordHasher };
|
|
44
41
|
//# sourceMappingURL=crypto-password-hasher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-password-hasher.js","sourceRoot":"","sources":["../src/crypto-password-hasher.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAI5C,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IAAjC;QACmB,eAAU,GAAG,IAAI,CAAA;QACjB,WAAM,GAAG,EAAE,CAAA;IAmC9B,CAAC;IAjCQ,KAAK,CAAC,gBAAgB,CAC3B,QAAgB,EAChB,EAAE,YAAY,EAAE,IAAI,EAAsB;QAE1C,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACpD,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAC1E,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACjD,CACF,CAAA;QACD,IAAI,OAAO,KAAK,YAAY,EAAE;YAC5B,OAAO;gBACL,OAAO,EAAE,IAAI;aACd,CAAA;SACF;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,uBAAuB;SAChC,CAAA;IACH,CAAC;IACM,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,QAAgB;QAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,YAAY,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CACjE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAC1E,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CACjD,CACF,CAAA;QACD,OAAO;YACL,QAAQ;YACR,IAAI;YACJ,YAAY;YACZ,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAA;IACH,CAAC;CACF,CAAA;AArCY,oBAAoB;IADhC,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,oBAAoB,CAqChC;SArCY,oBAAoB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAA;AAC3C,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class PasswordComplexityError extends Error {
|
|
2
|
+
/**
|
|
3
|
+
* @param result A detailed error result array
|
|
4
|
+
* @param message The Error message
|
|
5
|
+
*/
|
|
6
|
+
constructor(result, message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.result = result;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=password-complexity-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-complexity-error.js","sourceRoot":"","sources":["../../src/errors/password-complexity-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD;;;OAGG;IACH,YAA4B,MAAgD,EAAE,OAAgB;QAC5F,KAAK,CAAC,OAAO,CAAC,CAAA;QADY,WAAM,GAAN,MAAM,CAA0C;IAE5E,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unauthenticated-error.js","sourceRoot":"","sources":["../../src/errors/unauthenticated-error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unauthenticated-error.js","sourceRoot":"","sources":["../../src/errors/unauthenticated-error.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;CAAG"}
|
package/esm/helpers.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SecurityPolicy } from './security-policy';
|
|
2
|
+
/**
|
|
3
|
+
* Sets up the @furystack/security with the provided settings
|
|
4
|
+
* @param injector The Injector instance
|
|
5
|
+
* @param {Partial<SecurityPolicy>} policy The security policy to use
|
|
6
|
+
*/
|
|
7
|
+
export const usePasswordPolicy = (injector, policy) => {
|
|
8
|
+
const plainPolicy = new SecurityPolicy();
|
|
9
|
+
policy && Object.assign(plainPolicy, policy);
|
|
10
|
+
injector.setExplicitInstance(plainPolicy, SecurityPolicy);
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAkB,EAAE,MAAgC,EAAE,EAAE;IACxF,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAA;IACxC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC5C,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;AAC3D,CAAC,CAAA"}
|
package/esm/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './crypto-password-hasher';
|
|
2
|
+
export * from './errors';
|
|
3
|
+
export * from './models';
|
|
4
|
+
export * from './password-authenticator';
|
|
5
|
+
export * from './password-complexity-rules';
|
|
6
|
+
export * from './password-hasher';
|
|
7
|
+
export * from './security-policy-manager';
|
|
8
|
+
export * from './helpers';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AAEzC,cAAc,WAAW,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,4BAA4B,CAAA;AAC1C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-credential.js","sourceRoot":"","sources":["../../src/models/password-credential.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password-credential.js","sourceRoot":"","sources":["../../src/models/password-credential.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,kBAAkB;CAmB9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-reset-token.js","sourceRoot":"","sources":["../../src/models/password-reset-token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"password-reset-token.js","sourceRoot":"","sources":["../../src/models/password-reset-token.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAkB;CAa9B"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -8,18 +7,16 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
9
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const models_1 = require("./models");
|
|
18
|
-
const password_complexity_error_1 = require("./errors/password-complexity-error");
|
|
10
|
+
import { StoreManager } from '@furystack/core';
|
|
11
|
+
import { Injectable, Injected, Injector } from '@furystack/inject';
|
|
12
|
+
import { SecurityPolicyManager } from './security-policy-manager';
|
|
13
|
+
import { UnauthenticatedError } from './errors';
|
|
14
|
+
import { PasswordCredential, PasswordResetToken } from './models';
|
|
15
|
+
import { PasswordComplexityError } from './errors/password-complexity-error';
|
|
19
16
|
let PasswordAuthenticator = class PasswordAuthenticator {
|
|
20
17
|
constructor() {
|
|
21
|
-
this.getPasswordStore = () => this.injector.getInstance(
|
|
22
|
-
this.getTokenStore = () => this.injector.getInstance(
|
|
18
|
+
this.getPasswordStore = () => this.injector.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName');
|
|
19
|
+
this.getTokenStore = () => this.injector.getInstance(StoreManager).getStoreFor(PasswordResetToken, 'token');
|
|
23
20
|
this.getHasher = () => this.injector.getInstance(this.policyManager.policy.hasher);
|
|
24
21
|
}
|
|
25
22
|
/**
|
|
@@ -46,8 +43,7 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
46
43
|
}
|
|
47
44
|
/**
|
|
48
45
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
46
|
+
*Sets the password for the specific user
|
|
51
47
|
* @param userName The user to set the password for
|
|
52
48
|
* @param lastPassword The last user password
|
|
53
49
|
* @param plainPassword The password as a plain string
|
|
@@ -55,11 +51,11 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
55
51
|
async setPasswordForUser(userName, lastPassword, plainPassword) {
|
|
56
52
|
const complexityResult = await this.policyManager.matchPasswordComplexityRules(plainPassword);
|
|
57
53
|
if (!complexityResult.match) {
|
|
58
|
-
throw new
|
|
54
|
+
throw new PasswordComplexityError(complexityResult.errors);
|
|
59
55
|
}
|
|
60
56
|
const lastResult = await this.checkPasswordForUser(userName, lastPassword);
|
|
61
57
|
if (!lastResult.isValid) {
|
|
62
|
-
throw new
|
|
58
|
+
throw new UnauthenticatedError();
|
|
63
59
|
}
|
|
64
60
|
const store = this.getPasswordStore();
|
|
65
61
|
const newCredential = await this.getHasher().createCredential(userName, plainPassword);
|
|
@@ -69,22 +65,21 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
69
65
|
}
|
|
70
66
|
/**
|
|
71
67
|
* Resets the password with a Password Reset token entry
|
|
72
|
-
*
|
|
73
68
|
* @param resetToken The Reset Token value
|
|
74
69
|
* @param plainPassword The new password in plain string
|
|
75
70
|
*/
|
|
76
71
|
async resetPasswordForUser(resetToken, plainPassword) {
|
|
77
72
|
const token = await this.getTokenStore().get(resetToken);
|
|
78
73
|
if (!token) {
|
|
79
|
-
throw new
|
|
74
|
+
throw new UnauthenticatedError();
|
|
80
75
|
}
|
|
81
76
|
if (this.policyManager.hasTokenExpired(token)) {
|
|
82
77
|
await this.getTokenStore().remove(resetToken); // clean up token
|
|
83
|
-
throw new
|
|
78
|
+
throw new UnauthenticatedError();
|
|
84
79
|
}
|
|
85
80
|
const complexityResult = await this.policyManager.matchPasswordComplexityRules(plainPassword);
|
|
86
81
|
if (!complexityResult.match) {
|
|
87
|
-
throw new
|
|
82
|
+
throw new PasswordComplexityError(complexityResult.errors);
|
|
88
83
|
}
|
|
89
84
|
const newCredential = await this.getHasher().createCredential(token.userName, plainPassword);
|
|
90
85
|
const store = this.getPasswordStore();
|
|
@@ -94,15 +89,15 @@ let PasswordAuthenticator = class PasswordAuthenticator {
|
|
|
94
89
|
}
|
|
95
90
|
};
|
|
96
91
|
__decorate([
|
|
97
|
-
|
|
98
|
-
__metadata("design:type",
|
|
92
|
+
Injected(Injector),
|
|
93
|
+
__metadata("design:type", Injector)
|
|
99
94
|
], PasswordAuthenticator.prototype, "injector", void 0);
|
|
100
95
|
__decorate([
|
|
101
|
-
|
|
102
|
-
__metadata("design:type",
|
|
96
|
+
Injected(SecurityPolicyManager),
|
|
97
|
+
__metadata("design:type", SecurityPolicyManager)
|
|
103
98
|
], PasswordAuthenticator.prototype, "policyManager", void 0);
|
|
104
99
|
PasswordAuthenticator = __decorate([
|
|
105
|
-
|
|
100
|
+
Injectable({ lifetime: 'singleton' })
|
|
106
101
|
], PasswordAuthenticator);
|
|
107
|
-
|
|
102
|
+
export { PasswordAuthenticator };
|
|
108
103
|
//# sourceMappingURL=password-authenticator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-authenticator.js","sourceRoot":"","sources":["../src/password-authenticator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createContainsLowercasePolicy = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @param lowerCaseCount The minimum lower case characters length
|
|
6
3
|
* @returns The created Password Policy object
|
|
7
4
|
*/
|
|
8
|
-
const createContainsLowercasePolicy = (lowerCaseCount) => ({
|
|
5
|
+
export const createContainsLowercasePolicy = (lowerCaseCount) => ({
|
|
9
6
|
name: 'containsLowercase',
|
|
10
7
|
check: async (passwordString) => {
|
|
11
8
|
const actualLowerCaseCount = passwordString.length >= lowerCaseCount
|
|
@@ -25,5 +22,4 @@ const createContainsLowercasePolicy = (lowerCaseCount) => ({
|
|
|
25
22
|
};
|
|
26
23
|
},
|
|
27
24
|
});
|
|
28
|
-
exports.createContainsLowercasePolicy = createContainsLowercasePolicy;
|
|
29
25
|
//# sourceMappingURL=contains-lowercase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contains-lowercase.js","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-lowercase.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,cAAsB,EAA0B,EAAE,CAAC,CAAC;IAChG,IAAI,EAAE,mBAA4B;IAClC,KAAK,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;QACtC,MAAM,oBAAoB,GACxB,cAAc,CAAC,MAAM,IAAI,cAAc;YACrC,CAAC,CAAC,cAAc;iBACX,SAAS,CAAC,KAAK,CAAC;iBAChB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;iBAC9B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM;YAClC,CAAC,CAAC,CAAC,CAAA;QACP,MAAM,OAAO,GAAG,oBAAoB,IAAI,cAAc,CAAA;QACtD,IAAI,OAAO,EAAE;YACX,OAAO,EAAE,OAAO,EAAE,CAAA;SACnB;QACD,OAAO;YACL,OAAO;YACP,OAAO,EAAE,wCAAwC,cAAc,wBAAwB;YACvF,IAAI,EAAE,mBAAmB;SAC1B,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createContainsUppercasePolicy = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @param upperCaseCount The minimum upper case characters length
|
|
6
3
|
* @returns The created Password Policy object
|
|
7
4
|
*/
|
|
8
|
-
const createContainsUppercasePolicy = (upperCaseCount) => ({
|
|
5
|
+
export const createContainsUppercasePolicy = (upperCaseCount) => ({
|
|
9
6
|
name: 'containsUppercase',
|
|
10
7
|
check: async (passwordString) => {
|
|
11
8
|
const actualUpperCaseCount = passwordString
|
|
@@ -23,5 +20,4 @@ const createContainsUppercasePolicy = (upperCaseCount) => ({
|
|
|
23
20
|
};
|
|
24
21
|
},
|
|
25
22
|
});
|
|
26
|
-
exports.createContainsUppercasePolicy = createContainsUppercasePolicy;
|
|
27
23
|
//# sourceMappingURL=contains-uppercase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contains-uppercase.js","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-uppercase.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,cAAsB,EAA0B,EAAE,CAAC,CAAC;IAChG,IAAI,EAAE,mBAA4B;IAClC,KAAK,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;QACtC,MAAM,oBAAoB,GAAG,cAAc;aACxC,SAAS,CAAC,KAAK,CAAC;aAChB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;aAC9B,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAA;QAChC,MAAM,OAAO,GAAG,oBAAoB,IAAI,cAAc,CAAA;QACtD,IAAI,OAAO,EAAE;YACX,OAAO,EAAE,OAAO,EAAE,CAAA;SACnB;QACD,OAAO;YACL,OAAO;YACP,OAAO,EAAE,wCAAwC,cAAc,wBAAwB;YACvF,IAAI,EAAE,mBAAmB;SAC1B,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/password-complexity-rules/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/password-complexity-rules/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createMaxLengthComplexityRule = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @param maxLength The maximum password length
|
|
6
3
|
* @returns The created Password Policy object
|
|
7
4
|
*/
|
|
8
|
-
const createMaxLengthComplexityRule = (maxLength) => ({
|
|
5
|
+
export const createMaxLengthComplexityRule = (maxLength) => ({
|
|
9
6
|
name: 'maxLength',
|
|
10
7
|
check: async (passwordString) => {
|
|
11
8
|
const success = passwordString.length <= maxLength;
|
|
@@ -15,5 +12,4 @@ const createMaxLengthComplexityRule = (maxLength) => ({
|
|
|
15
12
|
return { success, message: `The password has to be maximum ${maxLength} character length`, rule: 'maxLength' };
|
|
16
13
|
},
|
|
17
14
|
});
|
|
18
|
-
exports.createMaxLengthComplexityRule = createMaxLengthComplexityRule;
|
|
19
15
|
//# sourceMappingURL=max-length.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max-length.js","sourceRoot":"","sources":["../../src/password-complexity-rules/max-length.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,SAAiB,EAA0B,EAAE,CAAC,CAAC;IAC3F,IAAI,EAAE,WAAoB;IAC1B,KAAK,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,IAAI,SAAS,CAAA;QAClD,IAAI,OAAO,EAAE;YACX,OAAO,EAAE,OAAO,EAAE,CAAA;SACnB;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kCAAkC,SAAS,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAChH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createMinLengthComplexityRule = void 0;
|
|
4
1
|
/**
|
|
5
2
|
* @param minLength The minimum password length
|
|
6
3
|
* @returns The created Password Policy object
|
|
7
4
|
*/
|
|
8
|
-
const createMinLengthComplexityRule = (minLength) => ({
|
|
5
|
+
export const createMinLengthComplexityRule = (minLength) => ({
|
|
9
6
|
name: 'minLength',
|
|
10
7
|
check: async (passwordString) => {
|
|
11
8
|
const success = passwordString.length >= minLength;
|
|
@@ -15,5 +12,4 @@ const createMinLengthComplexityRule = (minLength) => ({
|
|
|
15
12
|
return { success, message: `The password has to be at least ${minLength} character length`, rule: 'minLength' };
|
|
16
13
|
},
|
|
17
14
|
});
|
|
18
|
-
exports.createMinLengthComplexityRule = createMinLengthComplexityRule;
|
|
19
15
|
//# sourceMappingURL=min-length.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-length.js","sourceRoot":"","sources":["../../src/password-complexity-rules/min-length.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,SAAiB,EAA0B,EAAE,CAAC,CAAC;IAC3F,IAAI,EAAE,WAAoB;IAC1B,KAAK,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,IAAI,SAAS,CAAA;QAClD,IAAI,OAAO,EAAE;YACX,OAAO,EAAE,OAAO,EAAE,CAAA;SACnB;QACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,mCAAmC,SAAS,mBAAmB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IACjH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
exports.PasswordHasher = void 0;
|
|
10
|
-
const inject_1 = require("@furystack/inject");
|
|
7
|
+
import { Injectable } from '@furystack/inject';
|
|
11
8
|
let PasswordHasher = class PasswordHasher {
|
|
12
9
|
createCredential(_userName, _password) {
|
|
13
10
|
throw Error('Set up hasher - TODO');
|
|
@@ -17,7 +14,7 @@ let PasswordHasher = class PasswordHasher {
|
|
|
17
14
|
}
|
|
18
15
|
};
|
|
19
16
|
PasswordHasher = __decorate([
|
|
20
|
-
|
|
17
|
+
Injectable({ lifetime: 'singleton' })
|
|
21
18
|
], PasswordHasher);
|
|
22
|
-
|
|
19
|
+
export { PasswordHasher };
|
|
23
20
|
//# sourceMappingURL=password-hasher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-hasher.js","sourceRoot":"","sources":["../src/password-hasher.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAI9C,IAAa,cAAc,GAA3B,MAAa,cAAc;IAClB,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;QAC1D,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;IAEM,gBAAgB,CAAC,SAAiB,EAAE,WAA+B;QACxE,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IACrC,CAAC;CACF,CAAA;AARY,cAAc;IAD1B,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,cAAc,CAQ1B;SARY,cAAc"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -8,10 +7,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
9
|
};
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const inject_1 = require("@furystack/inject");
|
|
14
|
-
const security_policy_1 = require("./security-policy");
|
|
10
|
+
import { Injectable, Injected } from '@furystack/inject';
|
|
11
|
+
import { SecurityPolicy } from './security-policy';
|
|
15
12
|
let SecurityPolicyManager = class SecurityPolicyManager {
|
|
16
13
|
/**
|
|
17
14
|
* @param password The Plain password string
|
|
@@ -50,11 +47,11 @@ let SecurityPolicyManager = class SecurityPolicyManager {
|
|
|
50
47
|
}
|
|
51
48
|
};
|
|
52
49
|
__decorate([
|
|
53
|
-
|
|
54
|
-
__metadata("design:type",
|
|
50
|
+
Injected(SecurityPolicy),
|
|
51
|
+
__metadata("design:type", SecurityPolicy)
|
|
55
52
|
], SecurityPolicyManager.prototype, "policy", void 0);
|
|
56
53
|
SecurityPolicyManager = __decorate([
|
|
57
|
-
|
|
54
|
+
Injectable({ lifetime: 'singleton' })
|
|
58
55
|
], SecurityPolicyManager);
|
|
59
|
-
|
|
56
|
+
export { SecurityPolicyManager };
|
|
60
57
|
//# sourceMappingURL=security-policy-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-policy-manager.js","sourceRoot":"","sources":["../src/security-policy-manager.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGlD,IAAa,qBAAqB,GAAlC,MAAa,qBAAqB;IAChC;;;OAGG;IACI,KAAK,CAAC,4BAA4B,CAAC,QAAgB;QACxD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACzG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAA;QACxD,IAAI,MAAM,CAAC,MAAM,EAAE;YACjB,OAAO;gBACL,KAAK,EAAE,KAAc;gBACrB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAGnF;aACH,CAAA;SACF;QAED,OAAO;YACL,KAAK,EAAE,IAAa;SACrB,CAAA;IACH,CAAC;IAEM,kBAAkB,CAAC,UAA8B;QACtD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;YACvC,OAAO,KAAK,CAAA;SACb;QACD,MAAM,oBAAoB,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAC9D,oBAAoB,CAAC,OAAO,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA;QACjG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,OAAO,GAAG,GAAG,oBAAoB,CAAA;IACnC,CAAC;IAEM,eAAe,CAAC,KAAyB;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,EAAE;YAC5C,OAAO,KAAK,CAAA;SACb;QACD,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACjD,eAAe,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAA;QAClG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,OAAO,GAAG,GAAG,eAAe,CAAA;IAC9B,CAAC;CAIF,CAAA;AADiB;IADf,QAAQ,CAAC,cAAc,CAAC;8BACA,cAAc;qDAAA;AA5C5B,qBAAqB;IADjC,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,qBAAqB,CA6CjC;SA7CY,qBAAqB"}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const inject_1 = require("@furystack/inject");
|
|
11
|
-
const crypto_password_hasher_1 = require("./crypto-password-hasher");
|
|
7
|
+
import { Injectable } from '@furystack/inject';
|
|
8
|
+
import { CryptoPasswordHasher } from './crypto-password-hasher';
|
|
12
9
|
let SecurityPolicy = class SecurityPolicy {
|
|
13
10
|
constructor() {
|
|
14
11
|
/**
|
|
15
12
|
* A Hasher instance for password hash generation
|
|
16
13
|
*/
|
|
17
|
-
this.hasher =
|
|
14
|
+
this.hasher = CryptoPasswordHasher;
|
|
18
15
|
/**
|
|
19
16
|
* Array of password complexity rules to apply
|
|
20
17
|
*/
|
|
@@ -34,7 +31,7 @@ let SecurityPolicy = class SecurityPolicy {
|
|
|
34
31
|
}
|
|
35
32
|
};
|
|
36
33
|
SecurityPolicy = __decorate([
|
|
37
|
-
|
|
34
|
+
Injectable({ lifetime: 'singleton' })
|
|
38
35
|
], SecurityPolicy);
|
|
39
|
-
|
|
36
|
+
export { SecurityPolicy };
|
|
40
37
|
//# sourceMappingURL=security-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-policy.js","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAK/D,IAAa,cAAc,GAA3B,MAAa,cAAc;IAA3B;QACE;;WAEG;QACH,WAAM,GAAkC,oBAAoB,CAAA;QAE5D;;WAEG;QACH,4BAAuB,GAA6B,EAAE,CAAA;QAEtD;;WAEG;QACH,2BAAsB,GAAG,CAAC,CAAA;QAE1B;;WAEG;QACH,wBAAmB,GAAuB,OAAO,CAAA,CAAC,4CAA4C;QAE9F;;WAEG;QACH,gCAA2B,GAAG,EAAE,CAAA;IAClC,CAAC;CAAA,CAAA;AAzBY,cAAc;IAD1B,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,cAAc,CAyB1B;SAzBY,cAAc"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/security",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Security, password management and authorization related stuff for FuryStack",
|
|
5
|
-
"
|
|
6
|
-
"typings": "./types/index.d.ts",
|
|
7
|
-
"files": [
|
|
8
|
-
"dist",
|
|
9
|
-
"types",
|
|
10
|
-
"src"
|
|
11
|
-
],
|
|
5
|
+
"type": "module",
|
|
12
6
|
"scripts": {
|
|
13
7
|
"fix:prettier": "prettier \"{,!(dist|temp)/**/}*.{ts,tsx}\" --write",
|
|
8
|
+
"build:es6": "tsc --outDir ./esm",
|
|
14
9
|
"build": "tsc -b"
|
|
15
10
|
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./esm/index.js",
|
|
14
|
+
"types": "./types/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
"typesVersions": {
|
|
19
|
+
"*": {
|
|
20
|
+
"*": [
|
|
21
|
+
"types/*"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"esm",
|
|
27
|
+
"types",
|
|
28
|
+
"src"
|
|
29
|
+
],
|
|
16
30
|
"repository": {
|
|
17
31
|
"type": "git",
|
|
18
32
|
"url": "https://github.com/furystack/furystack.git"
|
|
@@ -30,13 +44,14 @@
|
|
|
30
44
|
"url": "https://github.com/furystack/furystack/issues"
|
|
31
45
|
},
|
|
32
46
|
"dependencies": {
|
|
33
|
-
"@furystack/core": "^
|
|
34
|
-
"@furystack/inject": "^
|
|
35
|
-
"@furystack/utils": "^
|
|
47
|
+
"@furystack/core": "^12.0.1",
|
|
48
|
+
"@furystack/inject": "^8.0.1",
|
|
49
|
+
"@furystack/utils": "^4.0.1"
|
|
36
50
|
},
|
|
37
51
|
"homepage": "https://github.com/furystack/furystack",
|
|
38
52
|
"devDependencies": {
|
|
39
|
-
"@types/
|
|
40
|
-
"
|
|
53
|
+
"@types/node": "^18.15.11",
|
|
54
|
+
"typescript": "^5.0.4",
|
|
55
|
+
"vitest": "^0.30.1"
|
|
41
56
|
}
|
|
42
57
|
}
|
package/src/helpers.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { createMinLengthComplexityRule } from './password-complexity-rules'
|
|
|
9
9
|
import { SecurityPolicyManager } from './security-policy-manager'
|
|
10
10
|
import { PasswordComplexityError, UnauthenticatedError } from './errors'
|
|
11
11
|
import { randomBytes } from 'crypto'
|
|
12
|
+
import { describe, it, expect, vi } from 'vitest'
|
|
12
13
|
|
|
13
14
|
const randomString = () => randomBytes(32).toString('hex')
|
|
14
15
|
|
|
@@ -138,7 +139,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
138
139
|
const hasher = authenticator.getHasher()
|
|
139
140
|
const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName')
|
|
140
141
|
const policyManager = i.getInstance(SecurityPolicyManager)
|
|
141
|
-
const pmSpy =
|
|
142
|
+
const pmSpy = vi.spyOn(policyManager, 'matchPasswordComplexityRules')
|
|
142
143
|
|
|
143
144
|
const entry = await hasher.createCredential(userName, lastPassword)
|
|
144
145
|
|
|
@@ -174,7 +175,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
174
175
|
const hasher = authenticator.getHasher()
|
|
175
176
|
const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName')
|
|
176
177
|
const policyManager = i.getInstance(SecurityPolicyManager)
|
|
177
|
-
const pmSpy =
|
|
178
|
+
const pmSpy = vi.spyOn(policyManager, 'matchPasswordComplexityRules')
|
|
178
179
|
|
|
179
180
|
const entry = await hasher.createCredential(userName, lastPassword)
|
|
180
181
|
|
|
@@ -214,7 +215,7 @@ describe('PasswordAuthenticator', () => {
|
|
|
214
215
|
const hasher = authenticator.getHasher()
|
|
215
216
|
const passwordStore = i.getInstance(StoreManager).getStoreFor(PasswordCredential, 'userName')
|
|
216
217
|
const policyManager = i.getInstance(SecurityPolicyManager)
|
|
217
|
-
const pmSpy =
|
|
218
|
+
const pmSpy = vi.spyOn(policyManager, 'matchPasswordComplexityRules')
|
|
218
219
|
|
|
219
220
|
const entry = await hasher.createCredential(userName, lastPassword)
|
|
220
221
|
|