@triangular/password-checker 4.0.0 → 8.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 (33) hide show
  1. package/README.md +15 -6
  2. package/esm2020/lib/password-checker-lib.directive.mjs +79 -0
  3. package/esm2020/lib/password-checker-lib.module.mjs +30 -0
  4. package/esm2020/lib/password-checker.config.mjs +3 -0
  5. package/esm2020/public_api.mjs +6 -0
  6. package/esm2020/triangular-password-checker.mjs +5 -0
  7. package/fesm2015/triangular-password-checker.mjs +119 -0
  8. package/fesm2015/triangular-password-checker.mjs.map +1 -0
  9. package/fesm2020/triangular-password-checker.mjs +117 -0
  10. package/fesm2020/triangular-password-checker.mjs.map +1 -0
  11. package/lib/password-checker-lib.directive.d.ts +3 -0
  12. package/lib/password-checker-lib.module.d.ts +6 -0
  13. package/package.json +26 -14
  14. package/triangular-password-checker.d.ts +1 -1
  15. package/bundles/triangular-password-checker.umd.js +0 -315
  16. package/bundles/triangular-password-checker.umd.js.map +0 -1
  17. package/bundles/triangular-password-checker.umd.min.js +0 -2
  18. package/bundles/triangular-password-checker.umd.min.js.map +0 -1
  19. package/esm2015/lib/password-checker-lib.directive.js +0 -79
  20. package/esm2015/lib/password-checker-lib.module.js +0 -28
  21. package/esm2015/lib/password-checker.config.js +0 -3
  22. package/esm2015/public_api.js +0 -6
  23. package/esm2015/triangular-password-checker.js +0 -6
  24. package/esm5/lib/password-checker-lib.directive.js +0 -82
  25. package/esm5/lib/password-checker-lib.module.js +0 -33
  26. package/esm5/lib/password-checker.config.js +0 -3
  27. package/esm5/public_api.js +0 -6
  28. package/esm5/triangular-password-checker.js +0 -6
  29. package/fesm2015/triangular-password-checker.js +0 -112
  30. package/fesm2015/triangular-password-checker.js.map +0 -1
  31. package/fesm5/triangular-password-checker.js +0 -120
  32. package/fesm5/triangular-password-checker.js.map +0 -1
  33. package/triangular-password-checker.metadata.json +0 -1
package/README.md CHANGED
@@ -7,12 +7,16 @@ Protect your users from re-using a password known to be hacked with this simple
7
7
  If you just want to use the library to verify the passwords given by your users, follow the following 4 simple steps. For contributing, or building the library locally, see the section on [building](#building) the library.
8
8
 
9
9
  Supported Angular Versions
10
- | Angular Version | Password Checker Version |
11
- | --------------- | ------------------------ |
12
- | 6.x | 1.0.0 |
13
- | 7.x | 2.2.0 |
14
- | 8.x | 3.0.0 |
15
- | 9.x | 4.0.0 |
10
+ | Angular Version | Password Checker Version |
11
+ | ---------------- | ------------------------ |
12
+ | 6.x | 1.0.0 |
13
+ | 7.x | 2.2.0 |
14
+ | 8.x | 3.0.0 |
15
+ | 9.x | 4.0.0 |
16
+ | 10.x | 5.0.0 |
17
+ | 11.x | 6.0.0 |
18
+ | 12.x | 7.0.0 |
19
+ | 13.x | 8.0.0 |
16
20
 
17
21
  ### Step 1: Install
18
22
 
@@ -167,6 +171,11 @@ We use [SemVer](http://semver.org/) for versioning.
167
171
  - 1.0.0: Initial Release
168
172
  - 2.2.0: Code Improvements and Angular 7.x
169
173
  - 3.0.0: Angular 8.x
174
+ - 4.0.0: Angular 9.x
175
+ - 5.0.0: Angular 10.x
176
+ - 6.0.0: Angular 11.x
177
+ - 7.0.0: Angular 12.x
178
+ - 8.0.0: Angular 13.x
170
179
 
171
180
  ## Authors
172
181
 
@@ -0,0 +1,79 @@
1
+ import { timer } from 'rxjs';
2
+ import { map, switchMap } from 'rxjs/operators';
3
+ import { NG_ASYNC_VALIDATORS } from '@angular/forms';
4
+ import { Directive, Inject, Input, Optional } from '@angular/core';
5
+ import sha1 from 'crypto-js/sha1';
6
+ import { PasswordCheckerConfigValue } from './password-checker.config';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ export class PasswordCheckerLibDirective {
10
+ constructor(http, config) {
11
+ this.http = http;
12
+ if (!config) {
13
+ // default initialization in constructor didn't work.
14
+ // conflict with @Optional()?
15
+ config = {};
16
+ }
17
+ this.pwnedPasswordApi =
18
+ config.pwnedPasswordApi
19
+ || 'https://api.pwnedpasswords.com/range/';
20
+ this.pwnedPasswordMinimumOccurrenceForError =
21
+ config.pwnedPasswordMinimumOccurrenceForError
22
+ || 1;
23
+ this.pwnedPasswordApiCallDebounceTime =
24
+ config.pwnedPasswordApiCallDebounceTime
25
+ || 400;
26
+ }
27
+ validate(control) {
28
+ const pw = ''.concat(control.value);
29
+ return timer(this.pwnedPasswordApiCallDebounceTime).pipe(map(() => {
30
+ const pwSha1 = sha1(pw).toString().toUpperCase();
31
+ return {
32
+ firstPart: pwSha1.substring(0, 5),
33
+ lastPart: pwSha1.substring(5),
34
+ };
35
+ }), switchMap((hash) => this.http.get(`${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }).pipe(map(passwords => passwords.split(/[\r\n]+/)), map(passwords => passwords.map((password) => {
36
+ const split = password.split(':');
37
+ return {
38
+ hash: split[0],
39
+ count: parseInt(split[1], 10),
40
+ };
41
+ })), map(passwords => passwords.find(password => password.hash === hash.lastPart)))), map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError
42
+ ? { pwnedPasswordOccurrence: password.count }
43
+ : null));
44
+ }
45
+ }
46
+ PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
47
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
48
+ {
49
+ provide: NG_ASYNC_VALIDATORS,
50
+ useExisting: PasswordCheckerLibDirective,
51
+ multi: true,
52
+ },
53
+ ], ngImport: i0 });
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
55
+ type: Directive,
56
+ args: [{
57
+ // eslint-disable-next-line @angular-eslint/directive-selector
58
+ selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
59
+ providers: [
60
+ {
61
+ provide: NG_ASYNC_VALIDATORS,
62
+ useExisting: PasswordCheckerLibDirective,
63
+ multi: true,
64
+ },
65
+ ]
66
+ }]
67
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
68
+ type: Optional
69
+ }, {
70
+ type: Inject,
71
+ args: [PasswordCheckerConfigValue]
72
+ }] }]; }, propDecorators: { pwnedPasswordApi: [{
73
+ type: Input
74
+ }], pwnedPasswordMinimumOccurrenceForError: [{
75
+ type: Input
76
+ }], pwnedPasswordApiCallDebounceTime: [{
77
+ type: Input
78
+ }] } });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBbUMsbUJBQW1CLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLElBQUksTUFBTSxnQkFBZ0IsQ0FBQztBQUNsQyxPQUFPLEVBQWtDLDBCQUEwQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQWF2RyxNQUFNLE9BQU8sMkJBQTJCO0lBT3RDLFlBQ1UsSUFBZ0IsRUFDd0IsTUFBc0M7UUFEOUUsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUl4QixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gscURBQXFEO1lBQ3JELDZCQUE2QjtZQUM3QixNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsZ0JBQWdCO1lBQ25CLE1BQU0sQ0FBQyxnQkFBZ0I7bUJBQ3BCLHVDQUF1QyxDQUFDO1FBQzdDLElBQUksQ0FBQyxzQ0FBc0M7WUFDekMsTUFBTSxDQUFDLHNDQUFzQzttQkFDMUMsQ0FBQyxDQUFDO1FBQ1AsSUFBSSxDQUFDLGdDQUFnQztZQUNuQyxNQUFNLENBQUMsZ0NBQWdDO21CQUNwQyxHQUFHLENBQUM7SUFDWCxDQUFDO0lBRUQsUUFBUSxDQUFDLE9BQXdCO1FBQy9CLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLElBQUksQ0FDdEQsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNQLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVqRCxPQUFPO2dCQUNMLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pDLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUM5QixDQUFDO1FBQ0osQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUNQLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDckIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUNyRSxDQUFDLElBQUksQ0FDTixHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQzVDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQzlCLENBQUM7UUFDSixDQUFDLENBQ0YsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUM5RSxDQUNGLEVBQ0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLHNDQUFzQztZQUN2RixDQUFDLENBQUMsRUFBRSx1QkFBdUIsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQzdDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FDVixDQUFDO0lBQ0osQ0FBQzs7d0hBOURVLDJCQUEyQiw0Q0FTaEIsMEJBQTBCOzRHQVRyQywyQkFBMkIsdVZBUjNCO1FBQ0w7WUFDRSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFdBQVcsRUFBRSwyQkFBMkI7WUFDeEMsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGOzJGQUVNLDJCQUEyQjtrQkFYdkMsU0FBUzttQkFBQztvQkFDVCwrREFBK0Q7b0JBQy9ELFFBQVEsRUFBRSxvSEFBb0g7b0JBQzlILFNBQVMsRUFBRTt3QkFDTDs0QkFDRSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLDZCQUE2Qjs0QkFDeEMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ047OzBCQVVJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMEJBQTBCOzRDQU52QyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csc0NBQXNDO3NCQUE5QyxLQUFLO2dCQUNHLGdDQUFnQztzQkFBeEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3IsIE5HX0FTWU5DX1ZBTElEQVRPUlMsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEluamVjdCwgSW5wdXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHNoYTEgZnJvbSAnY3J5cHRvLWpzL3NoYTEnO1xuaW1wb3J0IHsgUGFydGlhbCwgUGFzc3dvcmRDaGVja2VyQ29uZmlnLCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci5jb25maWcnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW3B3bmVkUGFzc3dvcmRWYWxpZGF0b3JdW2Zvcm1Db250cm9sTmFtZV0sIFtwd25lZFBhc3N3b3JkVmFsaWRhdG9yXVtuZ01vZGVsXSxbcHduZWRQYXNzd29yZFZhbGlkYXRvcl1bZm9ybUNvbnRyb2xdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBOR19BU1lOQ19WQUxJREFUT1JTLFxuICAgICAgICAgIHVzZUV4aXN0aW5nOiBQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmUsXG4gICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFzeW5jVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBwd25lZFBhc3N3b3JkTWluaW11bU9jY3VycmVuY2VGb3JFcnJvclZhbHVlOiBudW1iZXI7XG5cbiAgQElucHV0KCkgcHduZWRQYXNzd29yZEFwaTogc3RyaW5nO1xuICBASW5wdXQoKSBwd25lZFBhc3N3b3JkTWluaW11bU9jY3VycmVuY2VGb3JFcnJvcjogbnVtYmVyO1xuICBASW5wdXQoKSBwd25lZFBhc3N3b3JkQXBpQ2FsbERlYm91bmNlVGltZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBhc3N3b3JkQ2hlY2tlckNvbmZpZ1ZhbHVlKSBjb25maWc6IFBhcnRpYWw8UGFzc3dvcmRDaGVja2VyQ29uZmlnPixcbiAgICApIHtcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICAvLyBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGluIGNvbnN0cnVjdG9yIGRpZG4ndCB3b3JrLlxuICAgICAgLy8gY29uZmxpY3Qgd2l0aCBAT3B0aW9uYWwoKT9cbiAgICAgIGNvbmZpZyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMucHduZWRQYXNzd29yZEFwaSA9XG4gICAgICBjb25maWcucHduZWRQYXNzd29yZEFwaVxuICAgICAgfHwgJ2h0dHBzOi8vYXBpLnB3bmVkcGFzc3dvcmRzLmNvbS9yYW5nZS8nO1xuICAgIHRoaXMucHduZWRQYXNzd29yZE1pbmltdW1PY2N1cnJlbmNlRm9yRXJyb3IgPVxuICAgICAgY29uZmlnLnB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yXG4gICAgICB8fCAxO1xuICAgIHRoaXMucHduZWRQYXNzd29yZEFwaUNhbGxEZWJvdW5jZVRpbWUgPVxuICAgICAgY29uZmlnLnB3bmVkUGFzc3dvcmRBcGlDYWxsRGVib3VuY2VUaW1lXG4gICAgICB8fCA0MDA7XG4gIH1cblxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBPYnNlcnZhYmxlPFZhbGlkYXRpb25FcnJvcnN8bnVsbD4ge1xuICAgIGNvbnN0IHB3ID0gJycuY29uY2F0KGNvbnRyb2wudmFsdWUpO1xuXG4gICAgcmV0dXJuIHRpbWVyKHRoaXMucHduZWRQYXNzd29yZEFwaUNhbGxEZWJvdW5jZVRpbWUpLnBpcGUoXG4gICAgICBtYXAoKCkgPT4ge1xuICAgICAgICBjb25zdCBwd1NoYTEgPSBzaGExKHB3KS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmaXJzdFBhcnQ6IHB3U2hhMS5zdWJzdHJpbmcoMCwgNSksXG4gICAgICAgICAgbGFzdFBhcnQ6IHB3U2hhMS5zdWJzdHJpbmcoNSksXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgKGhhc2gpID0+IHRoaXMuaHR0cC5nZXQoXG4gICAgICAgICAgYCR7dGhpcy5wd25lZFBhc3N3b3JkQXBpfSR7aGFzaC5maXJzdFBhcnR9YCwgIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfVxuICAgICAgICAgICkucGlwZShcbiAgICAgICAgICBtYXAocGFzc3dvcmRzID0+IHBhc3N3b3Jkcy5zcGxpdCgvW1xcclxcbl0rLykpLFxuICAgICAgICAgIG1hcChwYXNzd29yZHMgPT4gcGFzc3dvcmRzLm1hcCgocGFzc3dvcmQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSAgcGFzc3dvcmQuc3BsaXQoJzonKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhhc2g6IHNwbGl0WzBdLFxuICAgICAgICAgICAgICAgIGNvdW50OiBwYXJzZUludChzcGxpdFsxXSwgMTApLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICkpLFxuICAgICAgICAgIG1hcChwYXNzd29yZHMgPT4gcGFzc3dvcmRzLmZpbmQocGFzc3dvcmQgPT4gcGFzc3dvcmQuaGFzaCA9PT0gaGFzaC5sYXN0UGFydCkpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIG1hcChwYXNzd29yZCA9PiBwYXNzd29yZCAmJiBwYXNzd29yZC5jb3VudCA+PSB0aGlzLnB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yXG4gICAgICAgID8geyBwd25lZFBhc3N3b3JkT2NjdXJyZW5jZTogcGFzc3dvcmQuY291bnQgfVxuICAgICAgICA6IG51bGwpLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,30 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { PasswordCheckerLibDirective } from './password-checker-lib.directive';
3
+ import { HttpClientModule } from '@angular/common/http';
4
+ import { PasswordCheckerConfigValue } from './password-checker.config';
5
+ import * as i0 from "@angular/core";
6
+ export class PasswordCheckerModule {
7
+ static forRoot(config = {}) {
8
+ return {
9
+ ngModule: PasswordCheckerModule,
10
+ providers: [
11
+ {
12
+ provide: PasswordCheckerConfigValue,
13
+ useValue: config,
14
+ }
15
+ ]
16
+ };
17
+ }
18
+ }
19
+ PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
20
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
21
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
23
+ type: NgModule,
24
+ args: [{
25
+ declarations: [PasswordCheckerLibDirective],
26
+ imports: [HttpClientModule],
27
+ exports: [PasswordCheckerLibDirective]
28
+ }]
29
+ }] });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFrQywwQkFBMEIsRUFBRSxNQUFNLDJCQUEyQixDQUFDOztBQU92RyxNQUFNLE9BQU8scUJBQXFCO0lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBeUMsRUFBRTtRQUN4RCxPQUFPO1lBQ0wsUUFBUSxFQUFFLHFCQUFxQjtZQUMvQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLDBCQUEwQjtvQkFDbkMsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7a0hBWFUscUJBQXFCO21IQUFyQixxQkFBcUIsaUJBSmpCLDJCQUEyQixhQUNoQyxnQkFBZ0IsYUFDaEIsMkJBQTJCO21IQUUxQixxQkFBcUIsWUFIdkIsQ0FBQyxnQkFBZ0IsQ0FBQzsyRkFHaEIscUJBQXFCO2tCQUxqQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLDJCQUEyQixDQUFDO29CQUMzQyxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDM0IsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7aUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci1saWIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBQYXJ0aWFsLCBQYXNzd29yZENoZWNrZXJDb25maWcsIFBhc3N3b3JkQ2hlY2tlckNvbmZpZ1ZhbHVlIH0gZnJvbSAnLi9wYXNzd29yZC1jaGVja2VyLmNvbmZpZyc7XG5cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1Bhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZV0sXG4gIGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSxcbiAgZXhwb3J0czogW1Bhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZV1cbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVja2VyTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoY29uZmlnOiBQYXJ0aWFsPFBhc3N3b3JkQ2hlY2tlckNvbmZpZz4gPSB7fSk6IE1vZHVsZVdpdGhQcm92aWRlcnM8UGFzc3dvcmRDaGVja2VyTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBQYXNzd29yZENoZWNrZXJNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFBhc3N3b3JkQ2hlY2tlckNvbmZpZ1ZhbHVlLFxuICAgICAgICAgIHVzZVZhbHVlOiBjb25maWcsXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wYXNzd29yZC1jaGVja2VyLWxpYi9zcmMvbGliL3Bhc3N3b3JkLWNoZWNrZXIuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFZN0MsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxjQUFjLENBQWlDLHlCQUF5QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGFydGlhbDxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiBUW1BdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZENoZWNrZXJDb25maWcge1xuICBwd25lZFBhc3N3b3JkQXBpOiBzdHJpbmc7XG4gIHB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yOiBudW1iZXI7XG4gIHB3bmVkUGFzc3dvcmRBcGlDYWxsRGVib3VuY2VUaW1lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPFBhc3N3b3JkQ2hlY2tlckNvbmZpZz4+KCdQQVNTV09SRF9DSEVDS0VSX0NPTkZJRycpO1xuIl19
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Public API Surface of password-checker-lib
3
+ */
4
+ export * from './lib/password-checker-lib.directive';
5
+ export * from './lib/password-checker-lib.module';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3Bhc3N3b3JkLWNoZWNrZXItbGliL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBwYXNzd29yZC1jaGVja2VyLWxpYlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3Bhc3N3b3JkLWNoZWNrZXItbGliLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUnO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public_api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpYW5ndWxhci1wYXNzd29yZC1jaGVja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvcGFzc3dvcmQtY2hlY2tlci1saWIvc3JjL3RyaWFuZ3VsYXItcGFzc3dvcmQtY2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuIl19
@@ -0,0 +1,119 @@
1
+ import { timer } from 'rxjs';
2
+ import { map, switchMap } from 'rxjs/operators';
3
+ import { NG_ASYNC_VALIDATORS } from '@angular/forms';
4
+ import * as i0 from '@angular/core';
5
+ import { InjectionToken, Directive, Optional, Inject, Input, NgModule } from '@angular/core';
6
+ import sha1 from 'crypto-js/sha1';
7
+ import * as i1 from '@angular/common/http';
8
+ import { HttpClientModule } from '@angular/common/http';
9
+
10
+ const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
11
+
12
+ class PasswordCheckerLibDirective {
13
+ constructor(http, config) {
14
+ this.http = http;
15
+ if (!config) {
16
+ // default initialization in constructor didn't work.
17
+ // conflict with @Optional()?
18
+ config = {};
19
+ }
20
+ this.pwnedPasswordApi =
21
+ config.pwnedPasswordApi
22
+ || 'https://api.pwnedpasswords.com/range/';
23
+ this.pwnedPasswordMinimumOccurrenceForError =
24
+ config.pwnedPasswordMinimumOccurrenceForError
25
+ || 1;
26
+ this.pwnedPasswordApiCallDebounceTime =
27
+ config.pwnedPasswordApiCallDebounceTime
28
+ || 400;
29
+ }
30
+ validate(control) {
31
+ const pw = ''.concat(control.value);
32
+ return timer(this.pwnedPasswordApiCallDebounceTime).pipe(map(() => {
33
+ const pwSha1 = sha1(pw).toString().toUpperCase();
34
+ return {
35
+ firstPart: pwSha1.substring(0, 5),
36
+ lastPart: pwSha1.substring(5),
37
+ };
38
+ }), switchMap((hash) => this.http.get(`${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }).pipe(map(passwords => passwords.split(/[\r\n]+/)), map(passwords => passwords.map((password) => {
39
+ const split = password.split(':');
40
+ return {
41
+ hash: split[0],
42
+ count: parseInt(split[1], 10),
43
+ };
44
+ })), map(passwords => passwords.find(password => password.hash === hash.lastPart)))), map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError
45
+ ? { pwnedPasswordOccurrence: password.count }
46
+ : null));
47
+ }
48
+ }
49
+ PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
51
+ {
52
+ provide: NG_ASYNC_VALIDATORS,
53
+ useExisting: PasswordCheckerLibDirective,
54
+ multi: true,
55
+ },
56
+ ], ngImport: i0 });
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
58
+ type: Directive,
59
+ args: [{
60
+ // eslint-disable-next-line @angular-eslint/directive-selector
61
+ selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
62
+ providers: [
63
+ {
64
+ provide: NG_ASYNC_VALIDATORS,
65
+ useExisting: PasswordCheckerLibDirective,
66
+ multi: true,
67
+ },
68
+ ]
69
+ }]
70
+ }], ctorParameters: function () {
71
+ return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
72
+ type: Optional
73
+ }, {
74
+ type: Inject,
75
+ args: [PasswordCheckerConfigValue]
76
+ }] }];
77
+ }, propDecorators: { pwnedPasswordApi: [{
78
+ type: Input
79
+ }], pwnedPasswordMinimumOccurrenceForError: [{
80
+ type: Input
81
+ }], pwnedPasswordApiCallDebounceTime: [{
82
+ type: Input
83
+ }] } });
84
+
85
+ class PasswordCheckerModule {
86
+ static forRoot(config = {}) {
87
+ return {
88
+ ngModule: PasswordCheckerModule,
89
+ providers: [
90
+ {
91
+ provide: PasswordCheckerConfigValue,
92
+ useValue: config,
93
+ }
94
+ ]
95
+ };
96
+ }
97
+ }
98
+ PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
99
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
100
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
101
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
102
+ type: NgModule,
103
+ args: [{
104
+ declarations: [PasswordCheckerLibDirective],
105
+ imports: [HttpClientModule],
106
+ exports: [PasswordCheckerLibDirective]
107
+ }]
108
+ }] });
109
+
110
+ /*
111
+ * Public API Surface of password-checker-lib
112
+ */
113
+
114
+ /**
115
+ * Generated bundle index. Do not edit.
116
+ */
117
+
118
+ export { PasswordCheckerLibDirective, PasswordCheckerModule };
119
+ //# sourceMappingURL=triangular-password-checker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triangular-password-checker.mjs","sources":["../../../projects/password-checker-lib/src/lib/password-checker.config.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.directive.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.module.ts","../../../projects/password-checker-lib/src/public_api.ts","../../../projects/password-checker-lib/src/triangular-password-checker.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type Partial<T> = {\n [P in keyof T]?: T[P];\n};\n\nexport interface PasswordCheckerConfig {\n pwnedPasswordApi: string;\n pwnedPasswordMinimumOccurrenceForError: number;\n pwnedPasswordApiCallDebounceTime: number;\n}\n\nexport const PasswordCheckerConfigValue = new InjectionToken<Partial<PasswordCheckerConfig>>('PASSWORD_CHECKER_CONFIG');\n","import { Observable, timer } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';\nimport { Directive, Inject, Input, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport sha1 from 'crypto-js/sha1';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: PasswordCheckerLibDirective,\n multi: true,\n },\n ]\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\n private pwnedPasswordMinimumOccurrenceForErrorValue: number;\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PasswordCheckerConfigValue) config: Partial<PasswordCheckerConfig>,\n ) {\n\n if (!config) {\n // default initialization in constructor didn't work.\n // conflict with @Optional()?\n config = {};\n }\n\n this.pwnedPasswordApi =\n config.pwnedPasswordApi\n || 'https://api.pwnedpasswords.com/range/';\n this.pwnedPasswordMinimumOccurrenceForError =\n config.pwnedPasswordMinimumOccurrenceForError\n || 1;\n this.pwnedPasswordApiCallDebounceTime =\n config.pwnedPasswordApiCallDebounceTime\n || 400;\n }\n\n validate(control: AbstractControl): Observable<ValidationErrors|null> {\n const pw = ''.concat(control.value);\n\n return timer(this.pwnedPasswordApiCallDebounceTime).pipe(\n map(() => {\n const pwSha1 = sha1(pw).toString().toUpperCase();\n\n return {\n firstPart: pwSha1.substring(0, 5),\n lastPart: pwSha1.substring(5),\n };\n }),\n switchMap(\n (hash) => this.http.get(\n `${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }\n ).pipe(\n map(passwords => passwords.split(/[\\r\\n]+/)),\n map(passwords => passwords.map((password) => {\n const split = password.split(':');\n\n return {\n hash: split[0],\n count: parseInt(split[1], 10),\n };\n }\n )),\n map(passwords => passwords.find(password => password.hash === hash.lastPart)),\n ),\n ),\n map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError\n ? { pwnedPasswordOccurrence: password.count }\n : null),\n );\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { PasswordCheckerLibDirective } from './password-checker-lib.directive';\nimport { HttpClientModule } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({\n declarations: [PasswordCheckerLibDirective],\n imports: [HttpClientModule],\n exports: [PasswordCheckerLibDirective]\n})\nexport class PasswordCheckerModule {\n static forRoot(config: Partial<PasswordCheckerConfig> = {}): ModuleWithProviders<PasswordCheckerModule> {\n return {\n ngModule: PasswordCheckerModule,\n providers: [\n {\n provide: PasswordCheckerConfigValue,\n useValue: config,\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of password-checker-lib\n */\n\nexport * from './lib/password-checker-lib.directive';\nexport * from './lib/password-checker-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { timer } from 'rxjs';
2
+ import { map, switchMap } from 'rxjs/operators';
3
+ import { NG_ASYNC_VALIDATORS } from '@angular/forms';
4
+ import * as i0 from '@angular/core';
5
+ import { InjectionToken, Directive, Optional, Inject, Input, NgModule } from '@angular/core';
6
+ import sha1 from 'crypto-js/sha1';
7
+ import * as i1 from '@angular/common/http';
8
+ import { HttpClientModule } from '@angular/common/http';
9
+
10
+ const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
11
+
12
+ class PasswordCheckerLibDirective {
13
+ constructor(http, config) {
14
+ this.http = http;
15
+ if (!config) {
16
+ // default initialization in constructor didn't work.
17
+ // conflict with @Optional()?
18
+ config = {};
19
+ }
20
+ this.pwnedPasswordApi =
21
+ config.pwnedPasswordApi
22
+ || 'https://api.pwnedpasswords.com/range/';
23
+ this.pwnedPasswordMinimumOccurrenceForError =
24
+ config.pwnedPasswordMinimumOccurrenceForError
25
+ || 1;
26
+ this.pwnedPasswordApiCallDebounceTime =
27
+ config.pwnedPasswordApiCallDebounceTime
28
+ || 400;
29
+ }
30
+ validate(control) {
31
+ const pw = ''.concat(control.value);
32
+ return timer(this.pwnedPasswordApiCallDebounceTime).pipe(map(() => {
33
+ const pwSha1 = sha1(pw).toString().toUpperCase();
34
+ return {
35
+ firstPart: pwSha1.substring(0, 5),
36
+ lastPart: pwSha1.substring(5),
37
+ };
38
+ }), switchMap((hash) => this.http.get(`${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }).pipe(map(passwords => passwords.split(/[\r\n]+/)), map(passwords => passwords.map((password) => {
39
+ const split = password.split(':');
40
+ return {
41
+ hash: split[0],
42
+ count: parseInt(split[1], 10),
43
+ };
44
+ })), map(passwords => passwords.find(password => password.hash === hash.lastPart)))), map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError
45
+ ? { pwnedPasswordOccurrence: password.count }
46
+ : null));
47
+ }
48
+ }
49
+ PasswordCheckerLibDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, deps: [{ token: i1.HttpClient }, { token: PasswordCheckerConfigValue, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
50
+ PasswordCheckerLibDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.0.2", type: PasswordCheckerLibDirective, selector: "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", inputs: { pwnedPasswordApi: "pwnedPasswordApi", pwnedPasswordMinimumOccurrenceForError: "pwnedPasswordMinimumOccurrenceForError", pwnedPasswordApiCallDebounceTime: "pwnedPasswordApiCallDebounceTime" }, providers: [
51
+ {
52
+ provide: NG_ASYNC_VALIDATORS,
53
+ useExisting: PasswordCheckerLibDirective,
54
+ multi: true,
55
+ },
56
+ ], ngImport: i0 });
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerLibDirective, decorators: [{
58
+ type: Directive,
59
+ args: [{
60
+ // eslint-disable-next-line @angular-eslint/directive-selector
61
+ selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
62
+ providers: [
63
+ {
64
+ provide: NG_ASYNC_VALIDATORS,
65
+ useExisting: PasswordCheckerLibDirective,
66
+ multi: true,
67
+ },
68
+ ]
69
+ }]
70
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
71
+ type: Optional
72
+ }, {
73
+ type: Inject,
74
+ args: [PasswordCheckerConfigValue]
75
+ }] }]; }, propDecorators: { pwnedPasswordApi: [{
76
+ type: Input
77
+ }], pwnedPasswordMinimumOccurrenceForError: [{
78
+ type: Input
79
+ }], pwnedPasswordApiCallDebounceTime: [{
80
+ type: Input
81
+ }] } });
82
+
83
+ class PasswordCheckerModule {
84
+ static forRoot(config = {}) {
85
+ return {
86
+ ngModule: PasswordCheckerModule,
87
+ providers: [
88
+ {
89
+ provide: PasswordCheckerConfigValue,
90
+ useValue: config,
91
+ }
92
+ ]
93
+ };
94
+ }
95
+ }
96
+ PasswordCheckerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
97
+ PasswordCheckerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, declarations: [PasswordCheckerLibDirective], imports: [HttpClientModule], exports: [PasswordCheckerLibDirective] });
98
+ PasswordCheckerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, imports: [[HttpClientModule]] });
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: PasswordCheckerModule, decorators: [{
100
+ type: NgModule,
101
+ args: [{
102
+ declarations: [PasswordCheckerLibDirective],
103
+ imports: [HttpClientModule],
104
+ exports: [PasswordCheckerLibDirective]
105
+ }]
106
+ }] });
107
+
108
+ /*
109
+ * Public API Surface of password-checker-lib
110
+ */
111
+
112
+ /**
113
+ * Generated bundle index. Do not edit.
114
+ */
115
+
116
+ export { PasswordCheckerLibDirective, PasswordCheckerModule };
117
+ //# sourceMappingURL=triangular-password-checker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triangular-password-checker.mjs","sources":["../../../projects/password-checker-lib/src/lib/password-checker.config.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.directive.ts","../../../projects/password-checker-lib/src/lib/password-checker-lib.module.ts","../../../projects/password-checker-lib/src/public_api.ts","../../../projects/password-checker-lib/src/triangular-password-checker.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport type Partial<T> = {\n [P in keyof T]?: T[P];\n};\n\nexport interface PasswordCheckerConfig {\n pwnedPasswordApi: string;\n pwnedPasswordMinimumOccurrenceForError: number;\n pwnedPasswordApiCallDebounceTime: number;\n}\n\nexport const PasswordCheckerConfigValue = new InjectionToken<Partial<PasswordCheckerConfig>>('PASSWORD_CHECKER_CONFIG');\n","import { Observable, timer } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AbstractControl, AsyncValidator, NG_ASYNC_VALIDATORS, ValidationErrors } from '@angular/forms';\nimport { Directive, Inject, Input, Optional } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport sha1 from 'crypto-js/sha1';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',\n providers: [\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: PasswordCheckerLibDirective,\n multi: true,\n },\n ]\n})\nexport class PasswordCheckerLibDirective implements AsyncValidator {\n private pwnedPasswordMinimumOccurrenceForErrorValue: number;\n\n @Input() pwnedPasswordApi: string;\n @Input() pwnedPasswordMinimumOccurrenceForError: number;\n @Input() pwnedPasswordApiCallDebounceTime: number;\n\n constructor(\n private http: HttpClient,\n @Optional() @Inject(PasswordCheckerConfigValue) config: Partial<PasswordCheckerConfig>,\n ) {\n\n if (!config) {\n // default initialization in constructor didn't work.\n // conflict with @Optional()?\n config = {};\n }\n\n this.pwnedPasswordApi =\n config.pwnedPasswordApi\n || 'https://api.pwnedpasswords.com/range/';\n this.pwnedPasswordMinimumOccurrenceForError =\n config.pwnedPasswordMinimumOccurrenceForError\n || 1;\n this.pwnedPasswordApiCallDebounceTime =\n config.pwnedPasswordApiCallDebounceTime\n || 400;\n }\n\n validate(control: AbstractControl): Observable<ValidationErrors|null> {\n const pw = ''.concat(control.value);\n\n return timer(this.pwnedPasswordApiCallDebounceTime).pipe(\n map(() => {\n const pwSha1 = sha1(pw).toString().toUpperCase();\n\n return {\n firstPart: pwSha1.substring(0, 5),\n lastPart: pwSha1.substring(5),\n };\n }),\n switchMap(\n (hash) => this.http.get(\n `${this.pwnedPasswordApi}${hash.firstPart}`, { responseType: 'text' }\n ).pipe(\n map(passwords => passwords.split(/[\\r\\n]+/)),\n map(passwords => passwords.map((password) => {\n const split = password.split(':');\n\n return {\n hash: split[0],\n count: parseInt(split[1], 10),\n };\n }\n )),\n map(passwords => passwords.find(password => password.hash === hash.lastPart)),\n ),\n ),\n map(password => password && password.count >= this.pwnedPasswordMinimumOccurrenceForError\n ? { pwnedPasswordOccurrence: password.count }\n : null),\n );\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { PasswordCheckerLibDirective } from './password-checker-lib.directive';\nimport { HttpClientModule } from '@angular/common/http';\nimport { Partial, PasswordCheckerConfig, PasswordCheckerConfigValue } from './password-checker.config';\n\n@NgModule({\n declarations: [PasswordCheckerLibDirective],\n imports: [HttpClientModule],\n exports: [PasswordCheckerLibDirective]\n})\nexport class PasswordCheckerModule {\n static forRoot(config: Partial<PasswordCheckerConfig> = {}): ModuleWithProviders<PasswordCheckerModule> {\n return {\n ngModule: PasswordCheckerModule,\n providers: [\n {\n provide: PasswordCheckerConfigValue,\n useValue: config,\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of password-checker-lib\n */\n\nexport * from './lib/password-checker-lib.directive';\nexport * from './lib/password-checker-lib.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Observable } from 'rxjs';
2
2
  import { AbstractControl, AsyncValidator, ValidationErrors } from '@angular/forms';
3
3
  import { HttpClient } from '@angular/common/http';
4
4
  import { Partial, PasswordCheckerConfig } from './password-checker.config';
5
+ import * as i0 from "@angular/core";
5
6
  export declare class PasswordCheckerLibDirective implements AsyncValidator {
6
7
  private http;
7
8
  private pwnedPasswordMinimumOccurrenceForErrorValue;
@@ -10,4 +11,6 @@ export declare class PasswordCheckerLibDirective implements AsyncValidator {
10
11
  pwnedPasswordApiCallDebounceTime: number;
11
12
  constructor(http: HttpClient, config: Partial<PasswordCheckerConfig>);
12
13
  validate(control: AbstractControl): Observable<ValidationErrors | null>;
14
+ static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerLibDirective, [null, { optional: true; }]>;
15
+ static ɵdir: i0.ɵɵDirectiveDeclaration<PasswordCheckerLibDirective, "[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]", never, { "pwnedPasswordApi": "pwnedPasswordApi"; "pwnedPasswordMinimumOccurrenceForError": "pwnedPasswordMinimumOccurrenceForError"; "pwnedPasswordApiCallDebounceTime": "pwnedPasswordApiCallDebounceTime"; }, {}, never>;
13
16
  }
@@ -1,5 +1,11 @@
1
1
  import { ModuleWithProviders } from '@angular/core';
2
2
  import { Partial, PasswordCheckerConfig } from './password-checker.config';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./password-checker-lib.directive";
5
+ import * as i2 from "@angular/common/http";
3
6
  export declare class PasswordCheckerModule {
4
7
  static forRoot(config?: Partial<PasswordCheckerConfig>): ModuleWithProviders<PasswordCheckerModule>;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<PasswordCheckerModule, never>;
9
+ static ɵmod: i0.ɵɵNgModuleDeclaration<PasswordCheckerModule, [typeof i1.PasswordCheckerLibDirective], [typeof i2.HttpClientModule], [typeof i1.PasswordCheckerLibDirective]>;
10
+ static ɵinj: i0.ɵɵInjectorDeclaration<PasswordCheckerModule>;
5
11
  }
package/package.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@triangular/password-checker",
3
- "version": "4.0.0",
3
+ "version": "8.0.0",
4
4
  "peerDependencies": {
5
- "@angular/common": "^9.0.0",
6
- "@angular/core": "^9.0.0",
7
- "crypto-js": "^3.1.9-1",
8
- "tslib": "^1.10.0"
5
+ "@angular/common": "^13.0.0",
6
+ "@angular/core": "^13.0.0",
7
+ "crypto-js": "^3.3.0"
9
8
  },
10
9
  "homepage": "https://password.akehir.com",
11
10
  "license": "MIT",
@@ -22,14 +21,27 @@
22
21
  "email": "raphael@ochsenbe.in",
23
22
  "url": "https://akehir.com/"
24
23
  },
25
- "main": "bundles/triangular-password-checker.umd.js",
26
- "module": "fesm5/triangular-password-checker.js",
27
- "es2015": "fesm2015/triangular-password-checker.js",
28
- "esm5": "esm5/triangular-password-checker.js",
29
- "esm2015": "esm2015/triangular-password-checker.js",
30
- "fesm5": "fesm5/triangular-password-checker.js",
31
- "fesm2015": "fesm2015/triangular-password-checker.js",
24
+ "dependencies": {
25
+ "tslib": "^2.0.0"
26
+ },
27
+ "module": "fesm2015/triangular-password-checker.mjs",
28
+ "es2020": "fesm2020/triangular-password-checker.mjs",
29
+ "esm2020": "esm2020/triangular-password-checker.mjs",
30
+ "fesm2020": "fesm2020/triangular-password-checker.mjs",
31
+ "fesm2015": "fesm2015/triangular-password-checker.mjs",
32
32
  "typings": "triangular-password-checker.d.ts",
33
- "metadata": "triangular-password-checker.metadata.json",
33
+ "exports": {
34
+ "./package.json": {
35
+ "default": "./package.json"
36
+ },
37
+ ".": {
38
+ "types": "./triangular-password-checker.d.ts",
39
+ "esm2020": "./esm2020/triangular-password-checker.mjs",
40
+ "es2020": "./fesm2020/triangular-password-checker.mjs",
41
+ "es2015": "./fesm2015/triangular-password-checker.mjs",
42
+ "node": "./fesm2015/triangular-password-checker.mjs",
43
+ "default": "./fesm2020/triangular-password-checker.mjs"
44
+ }
45
+ },
34
46
  "sideEffects": false
35
- }
47
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Generated bundle index. Do not edit.
3
3
  */
4
+ /// <amd-module name="@triangular/password-checker" />
4
5
  export * from './public_api';
5
- export { Partial as ɵa, PasswordCheckerConfigValue as ɵb } from './lib/password-checker.config';