@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.
- package/README.md +15 -6
- package/esm2020/lib/password-checker-lib.directive.mjs +79 -0
- package/esm2020/lib/password-checker-lib.module.mjs +30 -0
- package/esm2020/lib/password-checker.config.mjs +3 -0
- package/esm2020/public_api.mjs +6 -0
- package/esm2020/triangular-password-checker.mjs +5 -0
- package/fesm2015/triangular-password-checker.mjs +119 -0
- package/fesm2015/triangular-password-checker.mjs.map +1 -0
- package/fesm2020/triangular-password-checker.mjs +117 -0
- package/fesm2020/triangular-password-checker.mjs.map +1 -0
- package/lib/password-checker-lib.directive.d.ts +3 -0
- package/lib/password-checker-lib.module.d.ts +6 -0
- package/package.json +26 -14
- package/triangular-password-checker.d.ts +1 -1
- package/bundles/triangular-password-checker.umd.js +0 -315
- package/bundles/triangular-password-checker.umd.js.map +0 -1
- package/bundles/triangular-password-checker.umd.min.js +0 -2
- package/bundles/triangular-password-checker.umd.min.js.map +0 -1
- package/esm2015/lib/password-checker-lib.directive.js +0 -79
- package/esm2015/lib/password-checker-lib.module.js +0 -28
- package/esm2015/lib/password-checker.config.js +0 -3
- package/esm2015/public_api.js +0 -6
- package/esm2015/triangular-password-checker.js +0 -6
- package/esm5/lib/password-checker-lib.directive.js +0 -82
- package/esm5/lib/password-checker-lib.module.js +0 -33
- package/esm5/lib/password-checker.config.js +0 -3
- package/esm5/public_api.js +0 -6
- package/esm5/triangular-password-checker.js +0 -6
- package/fesm2015/triangular-password-checker.js +0 -112
- package/fesm2015/triangular-password-checker.js.map +0 -1
- package/fesm5/triangular-password-checker.js +0 -120
- package/fesm5/triangular-password-checker.js.map +0 -1
- package/triangular-password-checker.metadata.json +0 -1
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __param } from "tslib";
|
|
2
|
-
import { timer } from 'rxjs';
|
|
3
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
5
|
-
import { Directive, Inject, Input, Optional } from '@angular/core';
|
|
6
|
-
import { HttpClient } from '@angular/common/http';
|
|
7
|
-
import sha1 from 'crypto-js/sha1';
|
|
8
|
-
import { PasswordCheckerConfigValue } from './password-checker.config';
|
|
9
|
-
var PasswordCheckerLibDirective = /** @class */ (function () {
|
|
10
|
-
function PasswordCheckerLibDirective(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
|
-
PasswordCheckerLibDirective_1 = PasswordCheckerLibDirective;
|
|
28
|
-
PasswordCheckerLibDirective.prototype.validate = function (control) {
|
|
29
|
-
var _this = this;
|
|
30
|
-
var pw = ''.concat(control.value);
|
|
31
|
-
return timer(this.pwnedPasswordApiCallDebounceTime).pipe(map(function () {
|
|
32
|
-
var pwSha1 = sha1(pw).toString().toUpperCase();
|
|
33
|
-
return {
|
|
34
|
-
firstPart: pwSha1.substring(0, 5),
|
|
35
|
-
lastPart: pwSha1.substring(5),
|
|
36
|
-
};
|
|
37
|
-
}), switchMap(function (hash) { return _this.http.get("" + _this.pwnedPasswordApi + hash.firstPart, { responseType: 'text' }).pipe(map(function (passwords) { return passwords.split(/[\r\n]+/); }), map(function (passwords) { return passwords.map(function (password) {
|
|
38
|
-
var split = password.split(':');
|
|
39
|
-
return {
|
|
40
|
-
hash: split[0],
|
|
41
|
-
count: parseInt(split[1], 10),
|
|
42
|
-
};
|
|
43
|
-
}); }), map(function (passwords) { return passwords.find(function (password) { return password.hash === hash.lastPart; }); })); }), map(function (password) { return password && password.count >= _this.pwnedPasswordMinimumOccurrenceForError
|
|
44
|
-
? { pwnedPasswordOccurrence: password.count }
|
|
45
|
-
: null; }));
|
|
46
|
-
};
|
|
47
|
-
var PasswordCheckerLibDirective_1;
|
|
48
|
-
PasswordCheckerLibDirective.ctorParameters = function () { return [
|
|
49
|
-
{ type: HttpClient },
|
|
50
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PasswordCheckerConfigValue,] }] }
|
|
51
|
-
]; };
|
|
52
|
-
__decorate([
|
|
53
|
-
Input(),
|
|
54
|
-
__metadata("design:type", String)
|
|
55
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordApi", void 0);
|
|
56
|
-
__decorate([
|
|
57
|
-
Input(),
|
|
58
|
-
__metadata("design:type", Number)
|
|
59
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordMinimumOccurrenceForError", void 0);
|
|
60
|
-
__decorate([
|
|
61
|
-
Input(),
|
|
62
|
-
__metadata("design:type", Number)
|
|
63
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordApiCallDebounceTime", void 0);
|
|
64
|
-
PasswordCheckerLibDirective = PasswordCheckerLibDirective_1 = __decorate([
|
|
65
|
-
Directive({
|
|
66
|
-
// tslint:disable-next-line directive-selector
|
|
67
|
-
selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
|
|
68
|
-
providers: [
|
|
69
|
-
{
|
|
70
|
-
provide: NG_ASYNC_VALIDATORS,
|
|
71
|
-
useExisting: PasswordCheckerLibDirective_1,
|
|
72
|
-
multi: true,
|
|
73
|
-
},
|
|
74
|
-
]
|
|
75
|
-
}),
|
|
76
|
-
__param(1, Optional()), __param(1, Inject(PasswordCheckerConfigValue)),
|
|
77
|
-
__metadata("design:paramtypes", [HttpClient, Object])
|
|
78
|
-
], PasswordCheckerLibDirective);
|
|
79
|
-
return PasswordCheckerLibDirective;
|
|
80
|
-
}());
|
|
81
|
-
export { PasswordCheckerLibDirective };
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRyaWFuZ3VsYXIvcGFzc3dvcmQtY2hlY2tlci8iLCJzb3VyY2VzIjpbImxpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBYyxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQW1DLG1CQUFtQixFQUFvQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sSUFBSSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xDLE9BQU8sRUFBa0MsMEJBQTBCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQWF2RztJQU9FLHFDQUNVLElBQWdCLEVBQ3dCLE1BQXNDO1FBRDlFLFNBQUksR0FBSixJQUFJLENBQVk7UUFJeEIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLHFEQUFxRDtZQUNyRCw2QkFBNkI7WUFDN0IsTUFBTSxHQUFHLEVBQUUsQ0FBQztTQUNiO1FBRUQsSUFBSSxDQUFDLGdCQUFnQjtZQUNuQixNQUFNLENBQUMsZ0JBQWdCO21CQUNwQix1Q0FBdUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsc0NBQXNDO1lBQ3pDLE1BQU0sQ0FBQyxzQ0FBc0M7bUJBQzFDLENBQUMsQ0FBQztRQUNQLElBQUksQ0FBQyxnQ0FBZ0M7WUFDbkMsTUFBTSxDQUFDLGdDQUFnQzttQkFDcEMsR0FBRyxDQUFDO0lBQ1gsQ0FBQztvQ0EzQlUsMkJBQTJCO0lBNkJ0Qyw4Q0FBUSxHQUFSLFVBQVMsT0FBd0I7UUFBakMsaUJBaUNDO1FBaENDLElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLElBQUksQ0FDdEQsR0FBRyxDQUFDO1lBQ0YsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRWpELE9BQU87Z0JBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDakMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2FBQzlCLENBQUM7UUFDSixDQUFDLENBQUMsRUFDRixTQUFTLENBQ1AsVUFBQyxJQUFJLElBQUssT0FBQSxLQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDckIsS0FBRyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVcsRUFBRyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FDckUsQ0FBQyxJQUFJLENBQ04sR0FBRyxDQUFDLFVBQUEsU0FBUyxJQUFJLE9BQUEsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBMUIsQ0FBMEIsQ0FBQyxFQUM1QyxHQUFHLENBQUMsVUFBQSxTQUFTLElBQUksT0FBQSxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUMsUUFBUTtZQUNwQyxJQUFNLEtBQUssR0FBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQzlCLENBQUM7UUFDSixDQUFDLENBQ0YsRUFSZ0IsQ0FRaEIsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxVQUFBLFNBQVMsSUFBSSxPQUFBLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQS9CLENBQStCLENBQUMsRUFBM0QsQ0FBMkQsQ0FBQyxDQUM5RSxFQWRTLENBY1QsQ0FDRixFQUNELEdBQUcsQ0FBQyxVQUFBLFFBQVEsSUFBSSxPQUFBLFFBQVEsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUksQ0FBQyxzQ0FBc0M7WUFDdkYsQ0FBQyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRTtZQUM3QyxDQUFDLENBQUMsSUFBSSxFQUZRLENBRVIsQ0FBQyxDQUNWLENBQUM7SUFDSixDQUFDOzs7Z0JBdERlLFVBQVU7Z0RBQ3ZCLFFBQVEsWUFBSSxNQUFNLFNBQUMsMEJBQTBCOztJQU52QztRQUFSLEtBQUssRUFBRTs7eUVBQTBCO0lBQ3pCO1FBQVIsS0FBSyxFQUFFOzsrRkFBZ0Q7SUFDL0M7UUFBUixLQUFLLEVBQUU7O3lGQUEwQztJQUx2QywyQkFBMkI7UUFYdkMsU0FBUyxDQUFDO1lBQ1QsOENBQThDO1lBQzlDLFFBQVEsRUFBRSxvSEFBb0g7WUFDOUgsU0FBUyxFQUFFO2dCQUNMO29CQUNFLE9BQU8sRUFBRSxtQkFBbUI7b0JBQzVCLFdBQVcsRUFBRSw2QkFBMkI7b0JBQ3hDLEtBQUssRUFBRSxJQUFJO2lCQUNaO2FBQ0Y7U0FDTixDQUFDO1FBVUcsV0FBQSxRQUFRLEVBQUUsQ0FBQSxFQUFFLFdBQUEsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUE7eUNBRGpDLFVBQVU7T0FSZiwyQkFBMkIsQ0ErRHZDO0lBQUQsa0NBQUM7Q0FBQSxBQS9ERCxJQStEQztTQS9EWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEFzeW5jVmFsaWRhdG9yLCBOR19BU1lOQ19WQUxJREFUT1JTLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBJbmplY3QsIElucHV0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCBzaGExIGZyb20gJ2NyeXB0by1qcy9zaGExJztcbmltcG9ydCB7IFBhcnRpYWwsIFBhc3N3b3JkQ2hlY2tlckNvbmZpZywgUGFzc3dvcmRDaGVja2VyQ29uZmlnVmFsdWUgfSBmcm9tICcuL3Bhc3N3b3JkLWNoZWNrZXIuY29uZmlnJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbcHduZWRQYXNzd29yZFZhbGlkYXRvcl1bZm9ybUNvbnRyb2xOYW1lXSwgW3B3bmVkUGFzc3dvcmRWYWxpZGF0b3JdW25nTW9kZWxdLFtwd25lZFBhc3N3b3JkVmFsaWRhdG9yXVtmb3JtQ29udHJvbF0nLFxuICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICAgICAgdXNlRXhpc3Rpbmc6IFBhc3N3b3JkQ2hlY2tlckxpYkRpcmVjdGl2ZSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVja2VyTGliRGlyZWN0aXZlIGltcGxlbWVudHMgQXN5bmNWYWxpZGF0b3Ige1xuICBwcml2YXRlIHB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yVmFsdWU6IG51bWJlcjtcblxuICBASW5wdXQoKSBwd25lZFBhc3N3b3JkQXBpOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yOiBudW1iZXI7XG4gIEBJbnB1dCgpIHB3bmVkUGFzc3dvcmRBcGlDYWxsRGVib3VuY2VUaW1lOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUGFzc3dvcmRDaGVja2VyQ29uZmlnVmFsdWUpIGNvbmZpZzogUGFydGlhbDxQYXNzd29yZENoZWNrZXJDb25maWc+LFxuICAgICkge1xuXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIC8vIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gaW4gY29uc3RydWN0b3IgZGlkbid0IHdvcmsuXG4gICAgICAvLyBjb25mbGljdCB3aXRoIEBPcHRpb25hbCgpP1xuICAgICAgY29uZmlnID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5wd25lZFBhc3N3b3JkQXBpID1cbiAgICAgIGNvbmZpZy5wd25lZFBhc3N3b3JkQXBpXG4gICAgICB8fCAnaHR0cHM6Ly9hcGkucHduZWRwYXNzd29yZHMuY29tL3JhbmdlLyc7XG4gICAgdGhpcy5wd25lZFBhc3N3b3JkTWluaW11bU9jY3VycmVuY2VGb3JFcnJvciA9XG4gICAgICBjb25maWcucHduZWRQYXNzd29yZE1pbmltdW1PY2N1cnJlbmNlRm9yRXJyb3JcbiAgICAgIHx8IDE7XG4gICAgdGhpcy5wd25lZFBhc3N3b3JkQXBpQ2FsbERlYm91bmNlVGltZSA9XG4gICAgICBjb25maWcucHduZWRQYXNzd29yZEFwaUNhbGxEZWJvdW5jZVRpbWVcbiAgICAgIHx8IDQwMDtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9yc3xudWxsPiB7XG4gICAgY29uc3QgcHcgPSAnJy5jb25jYXQoY29udHJvbC52YWx1ZSk7XG5cbiAgICByZXR1cm4gdGltZXIodGhpcy5wd25lZFBhc3N3b3JkQXBpQ2FsbERlYm91bmNlVGltZSkucGlwZShcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHB3U2hhMSA9IHNoYTEocHcpLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpcnN0UGFydDogcHdTaGExLnN1YnN0cmluZygwLCA1KSxcbiAgICAgICAgICBsYXN0UGFydDogcHdTaGExLnN1YnN0cmluZyg1KSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAoaGFzaCkgPT4gdGhpcy5odHRwLmdldChcbiAgICAgICAgICBgJHt0aGlzLnB3bmVkUGFzc3dvcmRBcGl9JHtoYXNoLmZpcnN0UGFydH1gLCAgeyByZXNwb25zZVR5cGU6ICd0ZXh0JyB9XG4gICAgICAgICAgKS5waXBlKFxuICAgICAgICAgIG1hcChwYXNzd29yZHMgPT4gcGFzc3dvcmRzLnNwbGl0KC9bXFxyXFxuXSsvKSksXG4gICAgICAgICAgbWFwKHBhc3N3b3JkcyA9PiBwYXNzd29yZHMubWFwKChwYXNzd29yZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzcGxpdCA9ICBwYXNzd29yZC5zcGxpdCgnOicpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaGFzaDogc3BsaXRbMF0sXG4gICAgICAgICAgICAgICAgY291bnQ6IHBhcnNlSW50KHNwbGl0WzFdLCAxMCksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKSksXG4gICAgICAgICAgbWFwKHBhc3N3b3JkcyA9PiBwYXNzd29yZHMuZmluZChwYXNzd29yZCA9PiBwYXNzd29yZC5oYXNoID09PSBoYXNoLmxhc3RQYXJ0KSksXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgbWFwKHBhc3N3b3JkID0+IHBhc3N3b3JkICYmIHBhc3N3b3JkLmNvdW50ID49IHRoaXMucHduZWRQYXNzd29yZE1pbmltdW1PY2N1cnJlbmNlRm9yRXJyb3JcbiAgICAgICAgPyB7IHB3bmVkUGFzc3dvcmRPY2N1cnJlbmNlOiBwYXNzd29yZC5jb3VudCB9XG4gICAgICAgIDogbnVsbCksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { NgModule } from '@angular/core';
|
|
3
|
-
import { PasswordCheckerLibDirective } from './password-checker-lib.directive';
|
|
4
|
-
import { HttpClientModule } from '@angular/common/http';
|
|
5
|
-
import { PasswordCheckerConfigValue } from './password-checker.config';
|
|
6
|
-
var PasswordCheckerModule = /** @class */ (function () {
|
|
7
|
-
function PasswordCheckerModule() {
|
|
8
|
-
}
|
|
9
|
-
PasswordCheckerModule_1 = PasswordCheckerModule;
|
|
10
|
-
PasswordCheckerModule.forRoot = function (config) {
|
|
11
|
-
if (config === void 0) { config = {}; }
|
|
12
|
-
return {
|
|
13
|
-
ngModule: PasswordCheckerModule_1,
|
|
14
|
-
providers: [
|
|
15
|
-
{
|
|
16
|
-
provide: PasswordCheckerConfigValue,
|
|
17
|
-
useValue: config,
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
var PasswordCheckerModule_1;
|
|
23
|
-
PasswordCheckerModule = PasswordCheckerModule_1 = __decorate([
|
|
24
|
-
NgModule({
|
|
25
|
-
declarations: [PasswordCheckerLibDirective],
|
|
26
|
-
imports: [HttpClientModule],
|
|
27
|
-
exports: [PasswordCheckerLibDirective]
|
|
28
|
-
})
|
|
29
|
-
], PasswordCheckerModule);
|
|
30
|
-
return PasswordCheckerModule;
|
|
31
|
-
}());
|
|
32
|
-
export { PasswordCheckerModule };
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci1saWIubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRyaWFuZ3VsYXIvcGFzc3dvcmQtY2hlY2tlci8iLCJzb3VyY2VzIjpbImxpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBa0MsMEJBQTBCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU92RztJQUFBO0lBWUEsQ0FBQzs4QkFaWSxxQkFBcUI7SUFDekIsNkJBQU8sR0FBZCxVQUFlLE1BQTJDO1FBQTNDLHVCQUFBLEVBQUEsV0FBMkM7UUFDeEQsT0FBTztZQUNMLFFBQVEsRUFBRSx1QkFBcUI7WUFDL0IsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSwwQkFBMEI7b0JBQ25DLFFBQVEsRUFBRSxNQUFNO2lCQUNqQjthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7O0lBWFUscUJBQXFCO1FBTGpDLFFBQVEsQ0FBQztZQUNSLFlBQVksRUFBRSxDQUFDLDJCQUEyQixDQUFDO1lBQzNDLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO1lBQzNCLE9BQU8sRUFBRSxDQUFDLDJCQUEyQixDQUFDO1NBQ3ZDLENBQUM7T0FDVyxxQkFBcUIsQ0FZakM7SUFBRCw0QkFBQztDQUFBLEFBWkQsSUFZQztTQVpZLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmUgfSBmcm9tICcuL3Bhc3N3b3JkLWNoZWNrZXItbGliLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgUGFydGlhbCwgUGFzc3dvcmRDaGVja2VyQ29uZmlnLCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSB9IGZyb20gJy4vcGFzc3dvcmQtY2hlY2tlci5jb25maWcnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmVdLFxuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtQYXNzd29yZENoZWNrZXJMaWJEaXJlY3RpdmVdXG59KVxuZXhwb3J0IGNsYXNzIFBhc3N3b3JkQ2hlY2tlck1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KGNvbmZpZzogUGFydGlhbDxQYXNzd29yZENoZWNrZXJDb25maWc+ID0ge30pOiBNb2R1bGVXaXRoUHJvdmlkZXJzPFBhc3N3b3JkQ2hlY2tlck1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogUGFzc3dvcmRDaGVja2VyTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSxcbiAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
-
export var PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtY2hlY2tlci5jb25maWcuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AdHJpYW5ndWxhci9wYXNzd29yZC1jaGVja2VyLyIsInNvdXJjZXMiOlsibGliL3Bhc3N3b3JkLWNoZWNrZXIuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFZN0MsTUFBTSxDQUFDLElBQU0sMEJBQTBCLEdBQUcsSUFBSSxjQUFjLENBQWlDLHlCQUF5QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgUGFydGlhbDxUPiA9IHtcbiAgW1AgaW4ga2V5b2YgVF0/OiBUW1BdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZENoZWNrZXJDb25maWcge1xuICBwd25lZFBhc3N3b3JkQXBpOiBzdHJpbmc7XG4gIHB3bmVkUGFzc3dvcmRNaW5pbXVtT2NjdXJyZW5jZUZvckVycm9yOiBudW1iZXI7XG4gIHB3bmVkUGFzc3dvcmRBcGlDYWxsRGVib3VuY2VUaW1lOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPFBhc3N3b3JkQ2hlY2tlckNvbmZpZz4+KCdQQVNTV09SRF9DSEVDS0VSX0NPTkZJRycpO1xuIl19
|
package/esm5/public_api.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B0cmlhbmd1bGFyL3Bhc3N3b3JkLWNoZWNrZXIvIiwic291cmNlcyI6WyJwdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBwYXNzd29yZC1jaGVja2VyLWxpYlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3Bhc3N3b3JkLWNoZWNrZXItbGliLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wYXNzd29yZC1jaGVja2VyLWxpYi5tb2R1bGUnO1xuIl19
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public_api';
|
|
5
|
-
export { PasswordCheckerConfigValue as ɵb } from './lib/password-checker.config';
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpYW5ndWxhci1wYXNzd29yZC1jaGVja2VyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRyaWFuZ3VsYXIvcGFzc3dvcmQtY2hlY2tlci8iLCJzb3VyY2VzIjpbInRyaWFuZ3VsYXItcGFzc3dvcmQtY2hlY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBRTdCLE9BQU8sRUFBZSwwQkFBMEIsSUFBSSxFQUFFLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcblxuZXhwb3J0IHtQYXJ0aWFsIGFzIMm1YSxQYXNzd29yZENoZWNrZXJDb25maWdWYWx1ZSBhcyDJtWJ9IGZyb20gJy4vbGliL3Bhc3N3b3JkLWNoZWNrZXIuY29uZmlnJzsiXX0=
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __param } from 'tslib';
|
|
2
|
-
import { timer } from 'rxjs';
|
|
3
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
5
|
-
import { InjectionToken, Optional, Inject, Input, Directive, NgModule } from '@angular/core';
|
|
6
|
-
import { HttpClient, HttpClientModule } from '@angular/common/http';
|
|
7
|
-
import sha1 from 'crypto-js/sha1';
|
|
8
|
-
|
|
9
|
-
const PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
|
|
10
|
-
|
|
11
|
-
var PasswordCheckerLibDirective_1;
|
|
12
|
-
let PasswordCheckerLibDirective = PasswordCheckerLibDirective_1 = 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.ctorParameters = () => [
|
|
50
|
-
{ type: HttpClient },
|
|
51
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PasswordCheckerConfigValue,] }] }
|
|
52
|
-
];
|
|
53
|
-
__decorate([
|
|
54
|
-
Input(),
|
|
55
|
-
__metadata("design:type", String)
|
|
56
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordApi", void 0);
|
|
57
|
-
__decorate([
|
|
58
|
-
Input(),
|
|
59
|
-
__metadata("design:type", Number)
|
|
60
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordMinimumOccurrenceForError", void 0);
|
|
61
|
-
__decorate([
|
|
62
|
-
Input(),
|
|
63
|
-
__metadata("design:type", Number)
|
|
64
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordApiCallDebounceTime", void 0);
|
|
65
|
-
PasswordCheckerLibDirective = PasswordCheckerLibDirective_1 = __decorate([
|
|
66
|
-
Directive({
|
|
67
|
-
// tslint:disable-next-line directive-selector
|
|
68
|
-
selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
|
|
69
|
-
providers: [
|
|
70
|
-
{
|
|
71
|
-
provide: NG_ASYNC_VALIDATORS,
|
|
72
|
-
useExisting: PasswordCheckerLibDirective_1,
|
|
73
|
-
multi: true,
|
|
74
|
-
},
|
|
75
|
-
]
|
|
76
|
-
}),
|
|
77
|
-
__param(1, Optional()), __param(1, Inject(PasswordCheckerConfigValue)),
|
|
78
|
-
__metadata("design:paramtypes", [HttpClient, Object])
|
|
79
|
-
], PasswordCheckerLibDirective);
|
|
80
|
-
|
|
81
|
-
var PasswordCheckerModule_1;
|
|
82
|
-
let PasswordCheckerModule = PasswordCheckerModule_1 = class PasswordCheckerModule {
|
|
83
|
-
static forRoot(config = {}) {
|
|
84
|
-
return {
|
|
85
|
-
ngModule: PasswordCheckerModule_1,
|
|
86
|
-
providers: [
|
|
87
|
-
{
|
|
88
|
-
provide: PasswordCheckerConfigValue,
|
|
89
|
-
useValue: config,
|
|
90
|
-
}
|
|
91
|
-
]
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
PasswordCheckerModule = PasswordCheckerModule_1 = __decorate([
|
|
96
|
-
NgModule({
|
|
97
|
-
declarations: [PasswordCheckerLibDirective],
|
|
98
|
-
imports: [HttpClientModule],
|
|
99
|
-
exports: [PasswordCheckerLibDirective]
|
|
100
|
-
})
|
|
101
|
-
], PasswordCheckerModule);
|
|
102
|
-
|
|
103
|
-
/*
|
|
104
|
-
* Public API Surface of password-checker-lib
|
|
105
|
-
*/
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Generated bundle index. Do not edit.
|
|
109
|
-
*/
|
|
110
|
-
|
|
111
|
-
export { PasswordCheckerLibDirective, PasswordCheckerModule, PasswordCheckerConfigValue as ɵb };
|
|
112
|
-
//# sourceMappingURL=triangular-password-checker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"triangular-password-checker.js","sources":["ng://@triangular/password-checker/lib/password-checker.config.ts","ng://@triangular/password-checker/lib/password-checker-lib.directive.ts","ng://@triangular/password-checker/lib/password-checker-lib.module.ts","ng://@triangular/password-checker/public_api.ts","ng://@triangular/password-checker/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 // tslint:disable-next-line 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\nexport {Partial as ɵa,PasswordCheckerConfigValue as ɵb} from './lib/password-checker.config';"],"names":[],"mappings":"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"}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __param } from 'tslib';
|
|
2
|
-
import { timer } from 'rxjs';
|
|
3
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
4
|
-
import { NG_ASYNC_VALIDATORS } from '@angular/forms';
|
|
5
|
-
import { InjectionToken, Optional, Inject, Input, Directive, NgModule } from '@angular/core';
|
|
6
|
-
import { HttpClient, HttpClientModule } from '@angular/common/http';
|
|
7
|
-
import sha1 from 'crypto-js/sha1';
|
|
8
|
-
|
|
9
|
-
var PasswordCheckerConfigValue = new InjectionToken('PASSWORD_CHECKER_CONFIG');
|
|
10
|
-
|
|
11
|
-
var PasswordCheckerLibDirective = /** @class */ (function () {
|
|
12
|
-
function PasswordCheckerLibDirective(http, config) {
|
|
13
|
-
this.http = http;
|
|
14
|
-
if (!config) {
|
|
15
|
-
// default initialization in constructor didn't work.
|
|
16
|
-
// conflict with @Optional()?
|
|
17
|
-
config = {};
|
|
18
|
-
}
|
|
19
|
-
this.pwnedPasswordApi =
|
|
20
|
-
config.pwnedPasswordApi
|
|
21
|
-
|| 'https://api.pwnedpasswords.com/range/';
|
|
22
|
-
this.pwnedPasswordMinimumOccurrenceForError =
|
|
23
|
-
config.pwnedPasswordMinimumOccurrenceForError
|
|
24
|
-
|| 1;
|
|
25
|
-
this.pwnedPasswordApiCallDebounceTime =
|
|
26
|
-
config.pwnedPasswordApiCallDebounceTime
|
|
27
|
-
|| 400;
|
|
28
|
-
}
|
|
29
|
-
PasswordCheckerLibDirective_1 = PasswordCheckerLibDirective;
|
|
30
|
-
PasswordCheckerLibDirective.prototype.validate = function (control) {
|
|
31
|
-
var _this = this;
|
|
32
|
-
var pw = ''.concat(control.value);
|
|
33
|
-
return timer(this.pwnedPasswordApiCallDebounceTime).pipe(map(function () {
|
|
34
|
-
var pwSha1 = sha1(pw).toString().toUpperCase();
|
|
35
|
-
return {
|
|
36
|
-
firstPart: pwSha1.substring(0, 5),
|
|
37
|
-
lastPart: pwSha1.substring(5),
|
|
38
|
-
};
|
|
39
|
-
}), switchMap(function (hash) { return _this.http.get("" + _this.pwnedPasswordApi + hash.firstPart, { responseType: 'text' }).pipe(map(function (passwords) { return passwords.split(/[\r\n]+/); }), map(function (passwords) { return passwords.map(function (password) {
|
|
40
|
-
var split = password.split(':');
|
|
41
|
-
return {
|
|
42
|
-
hash: split[0],
|
|
43
|
-
count: parseInt(split[1], 10),
|
|
44
|
-
};
|
|
45
|
-
}); }), map(function (passwords) { return passwords.find(function (password) { return password.hash === hash.lastPart; }); })); }), map(function (password) { return password && password.count >= _this.pwnedPasswordMinimumOccurrenceForError
|
|
46
|
-
? { pwnedPasswordOccurrence: password.count }
|
|
47
|
-
: null; }));
|
|
48
|
-
};
|
|
49
|
-
var PasswordCheckerLibDirective_1;
|
|
50
|
-
PasswordCheckerLibDirective.ctorParameters = function () { return [
|
|
51
|
-
{ type: HttpClient },
|
|
52
|
-
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PasswordCheckerConfigValue,] }] }
|
|
53
|
-
]; };
|
|
54
|
-
__decorate([
|
|
55
|
-
Input(),
|
|
56
|
-
__metadata("design:type", String)
|
|
57
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordApi", void 0);
|
|
58
|
-
__decorate([
|
|
59
|
-
Input(),
|
|
60
|
-
__metadata("design:type", Number)
|
|
61
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordMinimumOccurrenceForError", void 0);
|
|
62
|
-
__decorate([
|
|
63
|
-
Input(),
|
|
64
|
-
__metadata("design:type", Number)
|
|
65
|
-
], PasswordCheckerLibDirective.prototype, "pwnedPasswordApiCallDebounceTime", void 0);
|
|
66
|
-
PasswordCheckerLibDirective = PasswordCheckerLibDirective_1 = __decorate([
|
|
67
|
-
Directive({
|
|
68
|
-
// tslint:disable-next-line directive-selector
|
|
69
|
-
selector: '[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]',
|
|
70
|
-
providers: [
|
|
71
|
-
{
|
|
72
|
-
provide: NG_ASYNC_VALIDATORS,
|
|
73
|
-
useExisting: PasswordCheckerLibDirective_1,
|
|
74
|
-
multi: true,
|
|
75
|
-
},
|
|
76
|
-
]
|
|
77
|
-
}),
|
|
78
|
-
__param(1, Optional()), __param(1, Inject(PasswordCheckerConfigValue)),
|
|
79
|
-
__metadata("design:paramtypes", [HttpClient, Object])
|
|
80
|
-
], PasswordCheckerLibDirective);
|
|
81
|
-
return PasswordCheckerLibDirective;
|
|
82
|
-
}());
|
|
83
|
-
|
|
84
|
-
var PasswordCheckerModule = /** @class */ (function () {
|
|
85
|
-
function PasswordCheckerModule() {
|
|
86
|
-
}
|
|
87
|
-
PasswordCheckerModule_1 = PasswordCheckerModule;
|
|
88
|
-
PasswordCheckerModule.forRoot = function (config) {
|
|
89
|
-
if (config === void 0) { config = {}; }
|
|
90
|
-
return {
|
|
91
|
-
ngModule: PasswordCheckerModule_1,
|
|
92
|
-
providers: [
|
|
93
|
-
{
|
|
94
|
-
provide: PasswordCheckerConfigValue,
|
|
95
|
-
useValue: config,
|
|
96
|
-
}
|
|
97
|
-
]
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
var PasswordCheckerModule_1;
|
|
101
|
-
PasswordCheckerModule = PasswordCheckerModule_1 = __decorate([
|
|
102
|
-
NgModule({
|
|
103
|
-
declarations: [PasswordCheckerLibDirective],
|
|
104
|
-
imports: [HttpClientModule],
|
|
105
|
-
exports: [PasswordCheckerLibDirective]
|
|
106
|
-
})
|
|
107
|
-
], PasswordCheckerModule);
|
|
108
|
-
return PasswordCheckerModule;
|
|
109
|
-
}());
|
|
110
|
-
|
|
111
|
-
/*
|
|
112
|
-
* Public API Surface of password-checker-lib
|
|
113
|
-
*/
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Generated bundle index. Do not edit.
|
|
117
|
-
*/
|
|
118
|
-
|
|
119
|
-
export { PasswordCheckerLibDirective, PasswordCheckerModule, PasswordCheckerConfigValue as ɵb };
|
|
120
|
-
//# sourceMappingURL=triangular-password-checker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"triangular-password-checker.js","sources":["ng://@triangular/password-checker/lib/password-checker.config.ts","ng://@triangular/password-checker/lib/password-checker-lib.directive.ts","ng://@triangular/password-checker/lib/password-checker-lib.module.ts","ng://@triangular/password-checker/public_api.ts","ng://@triangular/password-checker/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 // tslint:disable-next-line 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\nexport {Partial as ɵa,PasswordCheckerConfigValue as ɵb} from './lib/password-checker.config';"],"names":[],"mappings":";;;;;;;;IAYa,0BAA0B,GAAG,IAAI,cAAc,CAAiC,yBAAyB;;;ICcpH,qCACU,IAAgB,EACwB,MAAsC;QAD9E,SAAI,GAAJ,IAAI,CAAY;QAIxB,IAAI,CAAC,MAAM,EAAE;;;YAGX,MAAM,GAAG,EAAE,CAAC;SACb;QAED,IAAI,CAAC,gBAAgB;YACnB,MAAM,CAAC,gBAAgB;mBACpB,uCAAuC,CAAC;QAC7C,IAAI,CAAC,sCAAsC;YACzC,MAAM,CAAC,sCAAsC;mBAC1C,CAAC,CAAC;QACP,IAAI,CAAC,gCAAgC;YACnC,MAAM,CAAC,gCAAgC;mBACpC,GAAG,CAAC;KACV;oCA3BU,2BAA2B;IA6BtC,8CAAQ,GAAR,UAAS,OAAwB;QAAjC,iBAiCC;QAhCC,IAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEpC,OAAO,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,IAAI,CACtD,GAAG,CAAC;YACF,IAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,CAAC;YAEjD,OAAO;gBACL,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;aAC9B,CAAC;SACH,CAAC,EACF,SAAS,CACP,UAAC,IAAI,IAAK,OAAA,KAAI,CAAC,IAAI,CAAC,GAAG,CACrB,KAAG,KAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAW,EAAG,EAAE,YAAY,EAAE,MAAM,EAAE,CACrE,CAAC,IAAI,CACN,GAAG,CAAC,UAAA,SAAS,IAAI,OAAA,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAA,CAAC,EAC5C,GAAG,CAAC,UAAA,SAAS,IAAI,OAAA,SAAS,CAAC,GAAG,CAAC,UAAC,QAAQ;YACpC,IAAM,KAAK,GAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEnC,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aAC9B,CAAC;SACH,CACF,GAAA,CAAC,EACF,GAAG,CAAC,UAAA,SAAS,IAAI,OAAA,SAAS,CAAC,IAAI,CAAC,UAAA,QAAQ,IAAI,OAAA,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,GAAA,CAAC,GAAA,CAAC,CAC9E,GAAA,CACF,EACD,GAAG,CAAC,UAAA,QAAQ,IAAI,OAAA,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAI,CAAC,sCAAsC;cACrF,EAAE,uBAAuB,EAAE,QAAQ,CAAC,KAAK,EAAE;cAC3C,IAAI,GAAA,CAAC,CACV,CAAC;KACH;;;gBAtDe,UAAU;gDACvB,QAAQ,YAAI,MAAM,SAAC,0BAA0B;;IANvC;QAAR,KAAK,EAAE;;yEAA0B;IACzB;QAAR,KAAK,EAAE;;+FAAgD;IAC/C;QAAR,KAAK,EAAE;;yFAA0C;IALvC,2BAA2B;QAXvC,SAAS,CAAC;;YAET,QAAQ,EAAE,oHAAoH;YAC9H,SAAS,EAAE;gBACL;oBACE,OAAO,EAAE,mBAAmB;oBAC5B,WAAW,EAAE,6BAA2B;oBACxC,KAAK,EAAE,IAAI;iBACZ;aACF;SACN,CAAC;QAUG,WAAA,QAAQ,EAAE,CAAA,EAAE,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;yCADjC,UAAU;OARf,2BAA2B,CA+DvC;IAAD,kCAAC;CA/DD;;;ICTA;KAYC;8BAZY,qBAAqB;IACzB,6BAAO,GAAd,UAAe,MAA2C;QAA3C,uBAAA,EAAA,WAA2C;QACxD,OAAO;YACL,QAAQ,EAAE,uBAAqB;YAC/B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,0BAA0B;oBACnC,QAAQ,EAAE,MAAM;iBACjB;aACF;SACF,CAAC;KACH;;IAXU,qBAAqB;QALjC,QAAQ,CAAC;YACR,YAAY,EAAE,CAAC,2BAA2B,CAAC;YAC3C,OAAO,EAAE,CAAC,gBAAgB,CAAC;YAC3B,OAAO,EAAE,CAAC,2BAA2B,CAAC;SACvC,CAAC;OACW,qBAAqB,CAYjC;IAAD,4BAAC;CAZD;;ACVA;;GAEG;;ACFH;;GAEG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"__symbolic":"module","version":4,"metadata":{"PasswordCheckerLibDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":8,"character":1},"arguments":[{"selector":"[pwnedPasswordValidator][formControlName], [pwnedPasswordValidator][ngModel],[pwnedPasswordValidator][formControl]","providers":[{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_ASYNC_VALIDATORS","line":13,"character":19},"useExisting":{"__symbolic":"reference","name":"PasswordCheckerLibDirective"},"multi":true}]}]}],"members":{"pwnedPasswordApi":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":22,"character":3}}]}],"pwnedPasswordMinimumOccurrenceForError":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":23,"character":3}}]}],"pwnedPasswordApiCallDebounceTime":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":24,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":28,"character":5}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":28,"character":17},"arguments":[{"__symbolic":"reference","name":"ɵb"}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/common/http","name":"HttpClient","line":27,"character":18},{"__symbolic":"reference","name":"ɵa"}]}],"validate":[{"__symbolic":"method"}]}},"PasswordCheckerModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":5,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"PasswordCheckerLibDirective"}],"imports":[{"__symbolic":"reference","module":"@angular/common/http","name":"HttpClientModule","line":7,"character":12}],"exports":[{"__symbolic":"reference","name":"PasswordCheckerLibDirective"}]}]}],"members":{},"statics":{"forRoot":{"__symbolic":"function","parameters":["config"],"defaults":[{}],"value":{"ngModule":{"__symbolic":"reference","name":"PasswordCheckerModule"},"providers":[{"provide":{"__symbolic":"reference","name":"ɵb"},"useValue":{"__symbolic":"reference","name":"config"}}]}}}},"ɵa":{"__symbolic":"interface"},"ɵb":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":12,"character":46},"arguments":["PASSWORD_CHECKER_CONFIG"]}},"origins":{"PasswordCheckerLibDirective":"./lib/password-checker-lib.directive","PasswordCheckerModule":"./lib/password-checker-lib.module","ɵa":"./lib/password-checker.config","ɵb":"./lib/password-checker.config"},"importAs":"@triangular/password-checker"}
|