@furystack/security 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +339 -0
  3. package/README.md +4 -0
  4. package/dist/crypto-password-hasher.d.ts +14 -0
  5. package/dist/crypto-password-hasher.d.ts.map +1 -0
  6. package/dist/crypto-password-hasher.js +39 -0
  7. package/dist/crypto-password-hasher.js.map +1 -0
  8. package/dist/errors/index.d.ts +4 -0
  9. package/dist/errors/index.d.ts.map +1 -0
  10. package/dist/errors/index.js +7 -0
  11. package/dist/errors/index.js.map +1 -0
  12. package/dist/errors/password-complexity-error.d.ts +15 -0
  13. package/dist/errors/password-complexity-error.d.ts.map +1 -0
  14. package/dist/errors/password-complexity-error.js +15 -0
  15. package/dist/errors/password-complexity-error.js.map +1 -0
  16. package/dist/errors/unauthenticated-error.d.ts +6 -0
  17. package/dist/errors/unauthenticated-error.d.ts.map +1 -0
  18. package/dist/errors/unauthenticated-error.js +10 -0
  19. package/dist/errors/unauthenticated-error.js.map +1 -0
  20. package/dist/index.d.ts +9 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +12 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/injector-extensions.d.ts +13 -0
  25. package/dist/injector-extensions.d.ts.map +1 -0
  26. package/dist/injector-extensions.js +11 -0
  27. package/dist/injector-extensions.js.map +1 -0
  28. package/dist/models/index.d.ts +6 -0
  29. package/dist/models/index.d.ts.map +1 -0
  30. package/dist/models/index.js +9 -0
  31. package/dist/models/index.js.map +1 -0
  32. package/dist/models/password-check-result.d.ts +10 -0
  33. package/dist/models/password-check-result.d.ts.map +1 -0
  34. package/dist/models/password-check-result.js +3 -0
  35. package/dist/models/password-check-result.js.map +1 -0
  36. package/dist/models/password-complexity-result.d.ts +10 -0
  37. package/dist/models/password-complexity-result.d.ts.map +1 -0
  38. package/dist/models/password-complexity-result.js +3 -0
  39. package/dist/models/password-complexity-result.js.map +1 -0
  40. package/dist/models/password-complexity-rule.d.ts +6 -0
  41. package/dist/models/password-complexity-rule.d.ts.map +1 -0
  42. package/dist/models/password-complexity-rule.js +3 -0
  43. package/dist/models/password-complexity-rule.js.map +1 -0
  44. package/dist/models/password-credential.d.ts +22 -0
  45. package/dist/models/password-credential.d.ts.map +1 -0
  46. package/dist/models/password-credential.js +10 -0
  47. package/dist/models/password-credential.js.map +1 -0
  48. package/dist/models/password-reset-token.d.ts +15 -0
  49. package/dist/models/password-reset-token.d.ts.map +1 -0
  50. package/dist/models/password-reset-token.js +7 -0
  51. package/dist/models/password-reset-token.js.map +1 -0
  52. package/dist/password-authenticator.d.ts +38 -0
  53. package/dist/password-authenticator.d.ts.map +1 -0
  54. package/dist/password-authenticator.js +99 -0
  55. package/dist/password-authenticator.js.map +1 -0
  56. package/dist/password-authenticator.spec.d.ts +2 -0
  57. package/dist/password-authenticator.spec.d.ts.map +1 -0
  58. package/dist/password-authenticator.spec.js +309 -0
  59. package/dist/password-authenticator.spec.js.map +1 -0
  60. package/dist/password-complexity-rules/contains-lowercase.d.ts +7 -0
  61. package/dist/password-complexity-rules/contains-lowercase.d.ts.map +1 -0
  62. package/dist/password-complexity-rules/contains-lowercase.js +29 -0
  63. package/dist/password-complexity-rules/contains-lowercase.js.map +1 -0
  64. package/dist/password-complexity-rules/contains-lowercase.spec.d.ts +2 -0
  65. package/dist/password-complexity-rules/contains-lowercase.spec.d.ts.map +1 -0
  66. package/dist/password-complexity-rules/contains-lowercase.spec.js +28 -0
  67. package/dist/password-complexity-rules/contains-lowercase.spec.js.map +1 -0
  68. package/dist/password-complexity-rules/contains-uppercase.d.ts +7 -0
  69. package/dist/password-complexity-rules/contains-uppercase.d.ts.map +1 -0
  70. package/dist/password-complexity-rules/contains-uppercase.js +27 -0
  71. package/dist/password-complexity-rules/contains-uppercase.js.map +1 -0
  72. package/dist/password-complexity-rules/contains-uppercase.spec.d.ts +2 -0
  73. package/dist/password-complexity-rules/contains-uppercase.spec.d.ts.map +1 -0
  74. package/dist/password-complexity-rules/contains-uppercase.spec.js +28 -0
  75. package/dist/password-complexity-rules/contains-uppercase.spec.js.map +1 -0
  76. package/dist/password-complexity-rules/index.d.ts +5 -0
  77. package/dist/password-complexity-rules/index.d.ts.map +1 -0
  78. package/dist/password-complexity-rules/index.js +8 -0
  79. package/dist/password-complexity-rules/index.js.map +1 -0
  80. package/dist/password-complexity-rules/max-length.d.ts +7 -0
  81. package/dist/password-complexity-rules/max-length.d.ts.map +1 -0
  82. package/dist/password-complexity-rules/max-length.js +19 -0
  83. package/dist/password-complexity-rules/max-length.js.map +1 -0
  84. package/dist/password-complexity-rules/max-length.spec.d.ts +2 -0
  85. package/dist/password-complexity-rules/max-length.spec.d.ts.map +1 -0
  86. package/dist/password-complexity-rules/max-length.spec.js +17 -0
  87. package/dist/password-complexity-rules/max-length.spec.js.map +1 -0
  88. package/dist/password-complexity-rules/min-length.d.ts +7 -0
  89. package/dist/password-complexity-rules/min-length.d.ts.map +1 -0
  90. package/dist/password-complexity-rules/min-length.js +19 -0
  91. package/dist/password-complexity-rules/min-length.js.map +1 -0
  92. package/dist/password-complexity-rules/min-length.spec.d.ts +2 -0
  93. package/dist/password-complexity-rules/min-length.spec.d.ts.map +1 -0
  94. package/dist/password-complexity-rules/min-length.spec.js +17 -0
  95. package/dist/password-complexity-rules/min-length.spec.js.map +1 -0
  96. package/dist/password-hasher.d.ts +6 -0
  97. package/dist/password-hasher.d.ts.map +1 -0
  98. package/dist/password-hasher.js +18 -0
  99. package/dist/password-hasher.js.map +1 -0
  100. package/dist/security-policy-manager.d.ts +26 -0
  101. package/dist/security-policy-manager.d.ts.map +1 -0
  102. package/dist/security-policy-manager.js +55 -0
  103. package/dist/security-policy-manager.js.map +1 -0
  104. package/dist/security-policy-manager.spec.d.ts +2 -0
  105. package/dist/security-policy-manager.spec.d.ts.map +1 -0
  106. package/dist/security-policy-manager.spec.js +19 -0
  107. package/dist/security-policy-manager.spec.js.map +1 -0
  108. package/dist/security-policy.d.ts +26 -0
  109. package/dist/security-policy.d.ts.map +1 -0
  110. package/dist/security-policy.js +35 -0
  111. package/dist/security-policy.js.map +1 -0
  112. package/package.json +45 -0
  113. package/src/crypto-password-hasher.ts +44 -0
  114. package/src/errors/index.ts +3 -0
  115. package/src/errors/password-complexity-error.ts +9 -0
  116. package/src/errors/unauthenticated-error.ts +4 -0
  117. package/src/index.ts +9 -0
  118. package/src/injector-extensions.ts +21 -0
  119. package/src/models/index.ts +5 -0
  120. package/src/models/password-check-result.ts +11 -0
  121. package/src/models/password-complexity-result.ts +11 -0
  122. package/src/models/password-complexity-rule.ts +6 -0
  123. package/src/models/password-credential.ts +23 -0
  124. package/src/models/password-reset-token.ts +14 -0
  125. package/src/password-authenticator.spec.ts +393 -0
  126. package/src/password-authenticator.ts +101 -0
  127. package/src/password-complexity-rules/contains-lowercase.spec.ts +34 -0
  128. package/src/password-complexity-rules/contains-lowercase.ts +27 -0
  129. package/src/password-complexity-rules/contains-uppercase.spec.ts +34 -0
  130. package/src/password-complexity-rules/contains-uppercase.ts +24 -0
  131. package/src/password-complexity-rules/index.ts +4 -0
  132. package/src/password-complexity-rules/max-length.spec.ts +17 -0
  133. package/src/password-complexity-rules/max-length.ts +16 -0
  134. package/src/password-complexity-rules/min-length.spec.ts +19 -0
  135. package/src/password-complexity-rules/min-length.ts +16 -0
  136. package/src/password-hasher.ts +13 -0
  137. package/src/security-policy-manager.spec.ts +16 -0
  138. package/src/security-policy-manager.ts +53 -0
  139. package/src/security-policy.ts +32 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createContainsLowercasePolicy = void 0;
4
+ /**
5
+ * @param lowerCaseCount The minimum lower case characters length
6
+ * @returns The created Password Policy object
7
+ */
8
+ const createContainsLowercasePolicy = (lowerCaseCount) => ({
9
+ name: 'containsLowercase',
10
+ check: async (passwordString) => {
11
+ const actualLowerCaseCount = passwordString.length >= lowerCaseCount
12
+ ? passwordString
13
+ .normalize('NFD')
14
+ .replace(/\p{Diacritic}/gu, '')
15
+ .replace(/[^a-z]/g, '').length
16
+ : 0;
17
+ const success = actualLowerCaseCount >= lowerCaseCount;
18
+ if (success) {
19
+ return { success };
20
+ }
21
+ return {
22
+ success,
23
+ message: `The password should contain at least ${lowerCaseCount} lower case characters`,
24
+ rule: 'containsLowercase',
25
+ };
26
+ },
27
+ });
28
+ exports.createContainsLowercasePolicy = createContainsLowercasePolicy;
29
+ //# 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;AACI,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;AApBW,QAAA,6BAA6B,iCAoBxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contains-lowercase.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains-lowercase.spec.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-lowercase.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const contains_lowercase_1 = require("./contains-lowercase");
4
+ describe('Contains-lowercase', () => {
5
+ it('Should fail if the password is shorter than expected', async () => {
6
+ const policy = (0, contains_lowercase_1.createContainsLowercasePolicy)(3);
7
+ const result = await policy.check('');
8
+ expect(result.success).toBe(false);
9
+ expect(result.message).toBe('The password should contain at least 3 lower case characters');
10
+ });
11
+ it('Should fail if the password does not contain enough lowercase chars', async () => {
12
+ const policy = (0, contains_lowercase_1.createContainsLowercasePolicy)(3);
13
+ const result = await policy.check('ASD12345(=/!+');
14
+ expect(result.success).toBe(false);
15
+ expect(result.message).toBe('The password should contain at least 3 lower case characters');
16
+ });
17
+ it('Should succeed if the password contains enough lowercase chars', async () => {
18
+ const policy = (0, contains_lowercase_1.createContainsLowercasePolicy)(3);
19
+ const result = await policy.check('asd');
20
+ expect(result.success).toBe(true);
21
+ });
22
+ it('Should succeed if the password contains enough lowercase chars supporting special ones', async () => {
23
+ const policy = (0, contains_lowercase_1.createContainsLowercasePolicy)(3);
24
+ const result = await policy.check('éáő');
25
+ expect(result.success).toBe(true);
26
+ });
27
+ });
28
+ //# sourceMappingURL=contains-lowercase.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains-lowercase.spec.js","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-lowercase.spec.ts"],"names":[],"mappings":";;AACA,6DAAoE;AAEpE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAE,MAAyC,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7D,8DAA8D,CAC/D,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAE,MAAyC,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7D,8DAA8D,CAC/D,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { PasswordComplexityRule } from '../models';
2
+ /**
3
+ * @param upperCaseCount The minimum upper case characters length
4
+ * @returns The created Password Policy object
5
+ */
6
+ export declare const createContainsUppercasePolicy: (upperCaseCount: number) => PasswordComplexityRule;
7
+ //# sourceMappingURL=contains-uppercase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains-uppercase.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-uppercase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAElD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,mBAAoB,MAAM,KAAG,sBAiBrE,CAAA"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createContainsUppercasePolicy = void 0;
4
+ /**
5
+ * @param upperCaseCount The minimum upper case characters length
6
+ * @returns The created Password Policy object
7
+ */
8
+ const createContainsUppercasePolicy = (upperCaseCount) => ({
9
+ name: 'containsUppercase',
10
+ check: async (passwordString) => {
11
+ const actualUpperCaseCount = passwordString
12
+ .normalize('NFD')
13
+ .replace(/\p{Diacritic}/gu, '')
14
+ .replace(/[^A-Z]/g, '').length;
15
+ const success = actualUpperCaseCount >= upperCaseCount;
16
+ if (success) {
17
+ return { success };
18
+ }
19
+ return {
20
+ success,
21
+ message: `The password should contain at least ${upperCaseCount} upper case characters`,
22
+ rule: 'containsUppercase',
23
+ };
24
+ },
25
+ });
26
+ exports.createContainsUppercasePolicy = createContainsUppercasePolicy;
27
+ //# 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;AACI,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;AAjBW,QAAA,6BAA6B,iCAiBxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contains-uppercase.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains-uppercase.spec.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-uppercase.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const contains_uppercase_1 = require("./contains-uppercase");
4
+ describe('Contains-uppercase', () => {
5
+ it('Should fail if the password is shorter than expected', async () => {
6
+ const policy = (0, contains_uppercase_1.createContainsUppercasePolicy)(3);
7
+ const result = await policy.check('');
8
+ expect(result.success).toBe(false);
9
+ expect(result.message).toBe('The password should contain at least 3 upper case characters');
10
+ });
11
+ it('Should fail if the password does not contain enough lowercase chars', async () => {
12
+ const policy = (0, contains_uppercase_1.createContainsUppercasePolicy)(3);
13
+ const result = await policy.check('asd12345(=/!+');
14
+ expect(result.success).toBe(false);
15
+ expect(result.message).toBe('The password should contain at least 3 upper case characters');
16
+ });
17
+ it('Should succeed if the password contains enough lowercase chars', async () => {
18
+ const policy = (0, contains_uppercase_1.createContainsUppercasePolicy)(3);
19
+ const result = await policy.check('ASD');
20
+ expect(result.success).toBe(true);
21
+ });
22
+ it('Should succeed if the password contains enough lowercase chars supporting special ones', async () => {
23
+ const policy = (0, contains_uppercase_1.createContainsUppercasePolicy)(3);
24
+ const result = await policy.check('ÉÁÍ');
25
+ expect(result.success).toBe(true);
26
+ });
27
+ });
28
+ //# sourceMappingURL=contains-uppercase.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contains-uppercase.spec.js","sourceRoot":"","sources":["../../src/password-complexity-rules/contains-uppercase.spec.ts"],"names":[],"mappings":";;AACA,6DAAoE;AAEpE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAE,MAAyC,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7D,8DAA8D,CAC/D,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAE,MAAyC,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7D,8DAA8D,CAC/D,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,MAAM,GAAG,IAAA,kDAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './contains-lowercase';
2
+ export * from './contains-uppercase';
3
+ export * from './max-length';
4
+ export * from './min-length';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","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"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./contains-lowercase"), exports);
5
+ tslib_1.__exportStar(require("./contains-uppercase"), exports);
6
+ tslib_1.__exportStar(require("./max-length"), exports);
7
+ tslib_1.__exportStar(require("./min-length"), exports);
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/password-complexity-rules/index.ts"],"names":[],"mappings":";;;AAAA,+DAAoC;AACpC,+DAAoC;AACpC,uDAA4B;AAC5B,uDAA4B"}
@@ -0,0 +1,7 @@
1
+ import type { PasswordComplexityRule } from '../models';
2
+ /**
3
+ * @param maxLength The maximum password length
4
+ * @returns The created Password Policy object
5
+ */
6
+ export declare const createMaxLengthComplexityRule: (maxLength: number) => PasswordComplexityRule;
7
+ //# sourceMappingURL=max-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-length.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/max-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,cAAe,MAAM,KAAG,sBAShE,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMaxLengthComplexityRule = void 0;
4
+ /**
5
+ * @param maxLength The maximum password length
6
+ * @returns The created Password Policy object
7
+ */
8
+ const createMaxLengthComplexityRule = (maxLength) => ({
9
+ name: 'maxLength',
10
+ check: async (passwordString) => {
11
+ const success = passwordString.length <= maxLength;
12
+ if (success) {
13
+ return { success };
14
+ }
15
+ return { success, message: `The password has to be maximum ${maxLength} character length`, rule: 'maxLength' };
16
+ },
17
+ });
18
+ exports.createMaxLengthComplexityRule = createMaxLengthComplexityRule;
19
+ //# 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;AACI,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;AATW,QAAA,6BAA6B,iCASxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=max-length.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-length.spec.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/max-length.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const max_length_1 = require("./max-length");
4
+ describe('max-length', () => {
5
+ it('Should fail if the password is longer than expected', async () => {
6
+ const policy = (0, max_length_1.createMaxLengthComplexityRule)(3);
7
+ const result = await policy.check('asdasd123');
8
+ expect(result.success).toBe(false);
9
+ expect(result.message).toBe('The password has to be maximum 3 character length');
10
+ });
11
+ it('Should fail if the password does not contain enough lowercase chars', async () => {
12
+ const policy = (0, max_length_1.createMaxLengthComplexityRule)(3);
13
+ const result = await policy.check('asd');
14
+ expect(result.success).toBe(true);
15
+ });
16
+ });
17
+ //# sourceMappingURL=max-length.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-length.spec.js","sourceRoot":"","sources":["../../src/password-complexity-rules/max-length.spec.ts"],"names":[],"mappings":";;AACA,6CAA4D;AAE5D,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,GAAG,IAAA,0CAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAE,MAAyC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IACtH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,IAAA,0CAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { PasswordComplexityRule } from '../models';
2
+ /**
3
+ * @param minLength The minimum password length
4
+ * @returns The created Password Policy object
5
+ */
6
+ export declare const createMinLengthComplexityRule: (minLength: number) => PasswordComplexityRule;
7
+ //# sourceMappingURL=min-length.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-length.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/min-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,cAAe,MAAM,KAAG,sBAShE,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMinLengthComplexityRule = void 0;
4
+ /**
5
+ * @param minLength The minimum password length
6
+ * @returns The created Password Policy object
7
+ */
8
+ const createMinLengthComplexityRule = (minLength) => ({
9
+ name: 'minLength',
10
+ check: async (passwordString) => {
11
+ const success = passwordString.length >= minLength;
12
+ if (success) {
13
+ return { success };
14
+ }
15
+ return { success, message: `The password has to be at least ${minLength} character length`, rule: 'minLength' };
16
+ },
17
+ });
18
+ exports.createMinLengthComplexityRule = createMinLengthComplexityRule;
19
+ //# 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;AACI,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;AATW,QAAA,6BAA6B,iCASxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=min-length.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-length.spec.d.ts","sourceRoot":"","sources":["../../src/password-complexity-rules/min-length.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const min_length_1 = require("./min-length");
4
+ describe('min-length', () => {
5
+ it('Should fail if the password is shorter than expected', async () => {
6
+ const policy = (0, min_length_1.createMinLengthComplexityRule)(3);
7
+ const result = await policy.check('');
8
+ expect(result.success).toBe(false);
9
+ expect(result.message).toBe('The password has to be at least 3 character length');
10
+ });
11
+ it('Should fail if the password does not contain enough lowercase chars', async () => {
12
+ const policy = (0, min_length_1.createMinLengthComplexityRule)(3);
13
+ const result = await policy.check('asd12345(=/!+');
14
+ expect(result.success).toBe(true);
15
+ });
16
+ });
17
+ //# sourceMappingURL=min-length.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-length.spec.js","sourceRoot":"","sources":["../../src/password-complexity-rules/min-length.spec.ts"],"names":[],"mappings":";;AACA,6CAA4D;AAE5D,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAG,IAAA,0CAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,CAAE,MAAyC,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7D,oDAAoD,CACrD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,MAAM,GAAG,IAAA,0CAA6B,EAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { PasswordCheckResult, PasswordCredential } from './models';
2
+ export declare class PasswordHasher {
3
+ createCredential(_userName: string, _password: string): Promise<PasswordCredential>;
4
+ verifyCredential(_password: string, _credential: PasswordCredential): Promise<PasswordCheckResult>;
5
+ }
6
+ //# sourceMappingURL=password-hasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-hasher.d.ts","sourceRoot":"","sources":["../src/password-hasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElE,qBACa,cAAc;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAInF,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAG1G"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PasswordHasher = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const inject_1 = require("@furystack/inject");
6
+ let PasswordHasher = class PasswordHasher {
7
+ createCredential(_userName, _password) {
8
+ throw Error('Set up hasher - TODO');
9
+ }
10
+ verifyCredential(_password, _credential) {
11
+ throw Error('Set up hasher - TODO');
12
+ }
13
+ };
14
+ PasswordHasher = tslib_1.__decorate([
15
+ (0, inject_1.Injectable)({ lifetime: 'singleton' })
16
+ ], PasswordHasher);
17
+ exports.PasswordHasher = PasswordHasher;
18
+ //# sourceMappingURL=password-hasher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-hasher.js","sourceRoot":"","sources":["../src/password-hasher.ts"],"names":[],"mappings":";;;;AAAA,8CAA8C;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,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,cAAc,CAQ1B;AARY,wCAAc"}
@@ -0,0 +1,26 @@
1
+ import { PasswordCredential, PasswordResetToken } from './models';
2
+ import { SecurityPolicy } from './security-policy';
3
+ export declare class SecurityPolicyManager {
4
+ readonly policy: SecurityPolicy;
5
+ /**
6
+ * @param password The Plain password string
7
+ * @returns if the password matches the complexity rules
8
+ */
9
+ matchPasswordComplexityRules(password: string): Promise<{
10
+ match: false;
11
+ errors: {
12
+ message: string;
13
+ rule: string;
14
+ }[];
15
+ } | {
16
+ match: true;
17
+ errors?: undefined;
18
+ }>;
19
+ hasPasswordExpired(credential: PasswordCredential): boolean;
20
+ hasTokenExpired(token: PasswordResetToken): boolean;
21
+ /**
22
+ * @param policy The related Password Policy object
23
+ */
24
+ constructor(policy: SecurityPolicy);
25
+ }
26
+ //# sourceMappingURL=security-policy-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy-manager.d.ts","sourceRoot":"","sources":["../src/security-policy-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,qBACa,qBAAqB;aA8CJ,MAAM,EAAE,cAAc;IA7ClD;;;OAGG;IACU,4BAA4B,CAAC,QAAQ,EAAE,MAAM;;;qBAOzC,MAAM;kBACT,MAAM;;;;;;IAUb,kBAAkB,CAAC,UAAU,EAAE,kBAAkB;IAUjD,eAAe,CAAC,KAAK,EAAE,kBAAkB;IAUhD;;OAEG;gBACyB,MAAM,EAAE,cAAc;CACnD"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecurityPolicyManager = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const inject_1 = require("@furystack/inject");
6
+ const security_policy_1 = require("./security-policy");
7
+ let SecurityPolicyManager = class SecurityPolicyManager {
8
+ /**
9
+ * @param policy The related Password Policy object
10
+ */
11
+ constructor(policy) {
12
+ this.policy = policy;
13
+ }
14
+ /**
15
+ * @param password The Plain password string
16
+ * @returns if the password matches the complexity rules
17
+ */
18
+ async matchPasswordComplexityRules(password) {
19
+ const result = await Promise.all(this.policy.passwordComplexityRules.map((rule) => rule.check(password)));
20
+ const failed = result.filter((r) => r.success === false);
21
+ if (failed.length) {
22
+ return {
23
+ match: false,
24
+ errors: failed.map((f) => f.success === false && { message: f.message, rule: f.rule }),
25
+ };
26
+ }
27
+ return {
28
+ match: true,
29
+ };
30
+ }
31
+ hasPasswordExpired(credential) {
32
+ if (!this.policy.passwordExpirationDays) {
33
+ return false;
34
+ }
35
+ const credentialExpiration = new Date(credential.creationDate);
36
+ credentialExpiration.setDate(credentialExpiration.getDate() + this.policy.passwordExpirationDays);
37
+ const now = new Date();
38
+ return now > credentialExpiration;
39
+ }
40
+ hasTokenExpired(token) {
41
+ if (!this.policy.resetTokenExpirationSeconds) {
42
+ return false;
43
+ }
44
+ const tokenExpiration = new Date(token.createdAt);
45
+ tokenExpiration.setSeconds(tokenExpiration.getSeconds() + this.policy.resetTokenExpirationSeconds);
46
+ const now = new Date();
47
+ return now > tokenExpiration;
48
+ }
49
+ };
50
+ SecurityPolicyManager = tslib_1.__decorate([
51
+ (0, inject_1.Injectable)({ lifetime: 'singleton' }),
52
+ tslib_1.__metadata("design:paramtypes", [security_policy_1.SecurityPolicy])
53
+ ], SecurityPolicyManager);
54
+ exports.SecurityPolicyManager = SecurityPolicyManager;
55
+ //# 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,8CAA8C;AAE9C,uDAAkD;AAGlD,IAAa,qBAAqB,GAAlC,MAAa,qBAAqB;IA2ChC;;OAEG;IACH,YAA4B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IA7CtD;;;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;CAMF,CAAA;AA/CY,qBAAqB;IADjC,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;6CA+CA,gCAAc;GA9CvC,qBAAqB,CA+CjC;AA/CY,sDAAqB"}
@@ -0,0 +1,2 @@
1
+ import './injector-extensions';
2
+ //# sourceMappingURL=security-policy-manager.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy-manager.spec.d.ts","sourceRoot":"","sources":["../src/security-policy-manager.spec.ts"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const inject_1 = require("@furystack/inject");
4
+ const utils_1 = require("@furystack/utils");
5
+ const uuid_1 = require("uuid");
6
+ require("./injector-extensions");
7
+ const security_policy_manager_1 = require("./security-policy-manager");
8
+ describe('SecurityPolicyManager', () => {
9
+ it('Should return false when no token expiration has been set', () => {
10
+ (0, utils_1.using)(new inject_1.Injector(), (i) => {
11
+ i.usePasswordPolicy({ resetTokenExpirationSeconds: 0 });
12
+ const result = i
13
+ .getInstance(security_policy_manager_1.SecurityPolicyManager)
14
+ .hasTokenExpired({ createdAt: new Date().toISOString(), token: (0, uuid_1.v4)(), userName: (0, uuid_1.v4)() });
15
+ expect(result).toBeFalsy();
16
+ });
17
+ });
18
+ });
19
+ //# sourceMappingURL=security-policy-manager.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy-manager.spec.js","sourceRoot":"","sources":["../src/security-policy-manager.spec.ts"],"names":[],"mappings":";;AAAA,8CAA4C;AAC5C,4CAAwC;AACxC,+BAAyB;AACzB,iCAA8B;AAC9B,uEAAiE;AACjE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,IAAA,aAAK,EAAC,IAAI,iBAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC1B,CAAC,CAAC,iBAAiB,CAAC,EAAE,2BAA2B,EAAE,CAAC,EAAE,CAAC,CAAA;YACvD,MAAM,MAAM,GAAG,CAAC;iBACb,WAAW,CAAC,+CAAqB,CAAC;iBAClC,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAA,SAAE,GAAE,EAAE,QAAQ,EAAE,IAAA,SAAE,GAAE,EAAE,CAAC,CAAA;YACxF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { Constructable } from '@furystack/inject';
2
+ import { PasswordComplexityRule } from './models';
3
+ import { PasswordHasher } from './password-hasher';
4
+ export declare class SecurityPolicy {
5
+ /**
6
+ * A Hasher instance for password hash generation
7
+ */
8
+ hasher: Constructable<PasswordHasher>;
9
+ /**
10
+ * Array of password complexity rules to apply
11
+ */
12
+ passwordComplexityRules: PasswordComplexityRule[];
13
+ /**
14
+ * The password expiration in days
15
+ */
16
+ passwordExpirationDays: number;
17
+ /**
18
+ * Defines if the login needs a second factor authentication
19
+ */
20
+ requireSecondFactor: 'never' | 'always';
21
+ /**
22
+ * The Password Reset Token expiration in seconds
23
+ */
24
+ resetTokenExpirationSeconds: number;
25
+ }
26
+ //# sourceMappingURL=security-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy.d.ts","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAc,MAAM,mBAAmB,CAAA;AAE7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,qBACa,cAAc;IACzB;;OAEG;IACH,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,CAAuB;IAE5D;;OAEG;IACH,uBAAuB,EAAE,sBAAsB,EAAE,CAAK;IAEtD;;OAEG;IACH,sBAAsB,SAAI;IAE1B;;OAEG;IACH,mBAAmB,EAAE,OAAO,GAAG,QAAQ,CAAU;IAEjD;;OAEG;IACH,2BAA2B,SAAK;CACjC"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecurityPolicy = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const inject_1 = require("@furystack/inject");
6
+ const crypto_password_hasher_1 = require("./crypto-password-hasher");
7
+ let SecurityPolicy = class SecurityPolicy {
8
+ constructor() {
9
+ /**
10
+ * A Hasher instance for password hash generation
11
+ */
12
+ this.hasher = crypto_password_hasher_1.CryptoPasswordHasher;
13
+ /**
14
+ * Array of password complexity rules to apply
15
+ */
16
+ this.passwordComplexityRules = [];
17
+ /**
18
+ * The password expiration in days
19
+ */
20
+ this.passwordExpirationDays = 0;
21
+ /**
22
+ * Defines if the login needs a second factor authentication
23
+ */
24
+ this.requireSecondFactor = 'never'; // TODO - Challenge based on trusted devices
25
+ /**
26
+ * The Password Reset Token expiration in seconds
27
+ */
28
+ this.resetTokenExpirationSeconds = 15;
29
+ }
30
+ };
31
+ SecurityPolicy = tslib_1.__decorate([
32
+ (0, inject_1.Injectable)({ lifetime: 'singleton' })
33
+ ], SecurityPolicy);
34
+ exports.SecurityPolicy = SecurityPolicy;
35
+ //# sourceMappingURL=security-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-policy.js","sourceRoot":"","sources":["../src/security-policy.ts"],"names":[],"mappings":";;;;AAAA,8CAA6D;AAC7D,qEAA+D;AAK/D,IAAa,cAAc,GAA3B,MAAa,cAAc;IAA3B;QACE;;WAEG;QACH,WAAM,GAAkC,6CAAoB,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,IAAA,mBAAU,EAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,cAAc,CAyB1B;AAzBY,wCAAc"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@furystack/security",
3
+ "version": "1.0.0",
4
+ "description": "Security, password management and authorization related stuff for FuryStack",
5
+ "main": "dist/index.js",
6
+ "typings": "./dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "src",
10
+ "test"
11
+ ],
12
+ "scripts": {
13
+ "fix:prettier": "prettier \"{,!(dist|temp)/**/}*.{ts,tsx}\" --write",
14
+ "build": "tsc -b"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/furystack/furystack.git"
19
+ },
20
+ "keywords": [
21
+ "furystack",
22
+ "security"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "author": "Gallay Lajos <gallay.lajos@gmail.com>",
28
+ "license": "GPL-2.0",
29
+ "bugs": {
30
+ "url": "https://github.com/furystack/furystack/issues"
31
+ },
32
+ "dependencies": {
33
+ "@furystack/core": "^10.4.9",
34
+ "@furystack/inject": "^5.0.6",
35
+ "@furystack/utils": "^2.0.5",
36
+ "tslib": "^2.3.1",
37
+ "uuid": "^8.3.2"
38
+ },
39
+ "homepage": "https://github.com/furystack/furystack",
40
+ "devDependencies": {
41
+ "@types/jest": "^27.4.1",
42
+ "@types/node": "^17.0.23",
43
+ "@types/uuid": "^8.3.4"
44
+ }
45
+ }