@idea-ionic/auth 8.5.13 → 8.6.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/fesm2022/idea-ionic-auth.mjs +52 -52
- package/fesm2022/idea-ionic-auth.mjs.map +1 -1
- package/index.d.ts +358 -3
- package/package.json +14 -16
- package/esm2022/idea-ionic-auth.mjs +0 -5
- package/esm2022/public-api.mjs +0 -15
- package/esm2022/src/auth.routes.mjs +0 -22
- package/esm2022/src/auth.service.mjs +0 -521
- package/esm2022/src/commonPasswords.model.mjs +0 -1003
- package/esm2022/src/confirmPassword.page.mjs +0 -309
- package/esm2022/src/forgotPassword.page.mjs +0 -178
- package/esm2022/src/mfaChallenge.page.mjs +0 -163
- package/esm2022/src/newPassword.page.mjs +0 -210
- package/esm2022/src/okta.page.mjs +0 -150
- package/esm2022/src/passwordPolicy.component.mjs +0 -80
- package/esm2022/src/resendLink.page.mjs +0 -176
- package/esm2022/src/setupMFA/setupMFAButton.component.mjs +0 -60
- package/esm2022/src/setupMFA/setupMFAModal.component.mjs +0 -176
- package/esm2022/src/setupMFA.page.mjs +0 -83
- package/esm2022/src/signIn.page.mjs +0 -498
- package/esm2022/src/signUp.page.mjs +0 -376
- package/public-api.d.ts +0 -14
- package/src/auth.routes.d.ts +0 -2
- package/src/auth.service.d.ts +0 -152
- package/src/commonPasswords.model.d.ts +0 -1
- package/src/confirmPassword.page.d.ts +0 -26
- package/src/forgotPassword.page.d.ts +0 -13
- package/src/mfaChallenge.page.d.ts +0 -16
- package/src/newPassword.page.d.ts +0 -22
- package/src/okta.page.d.ts +0 -20
- package/src/passwordPolicy.component.d.ts +0 -8
- package/src/resendLink.page.d.ts +0 -14
- package/src/setupMFA/setupMFAButton.component.d.ts +0 -23
- package/src/setupMFA/setupMFAModal.component.d.ts +0 -16
- package/src/setupMFA.page.d.ts +0 -8
- package/src/signIn.page.d.ts +0 -36
- package/src/signUp.page.d.ts +0 -26
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, inject } from '@angular/core';
|
|
3
|
-
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { NavController, IonContent, IonCard, IonCardHeader, IonCardTitle, IonCardSubtitle, IonItem, IonCardContent, IonLabel, IonIcon, IonButton, IonInput } from '@ionic/angular/standalone';
|
|
5
|
-
import { IDEAMessageService, IDEALoadingService, IDEATranslationsService, IDEATranslatePipe } from '@idea-ionic/common';
|
|
6
|
-
import { IDEAAuthService } from './auth.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/forms";
|
|
9
|
-
export class IDEAMFAChallengePage {
|
|
10
|
-
constructor() {
|
|
11
|
-
this._nav = inject(NavController);
|
|
12
|
-
this._message = inject(IDEAMessageService);
|
|
13
|
-
this._loading = inject(IDEALoadingService);
|
|
14
|
-
this._auth = inject(IDEAAuthService);
|
|
15
|
-
this._translate = inject(IDEATranslationsService);
|
|
16
|
-
}
|
|
17
|
-
ngOnInit() {
|
|
18
|
-
if (!this._auth.challengeUsername)
|
|
19
|
-
this.goToAuth();
|
|
20
|
-
}
|
|
21
|
-
async completeMFAChallenge() {
|
|
22
|
-
try {
|
|
23
|
-
this.errorMsg = null;
|
|
24
|
-
await this._loading.show();
|
|
25
|
-
await this._auth.completeMFAChallenge(this.otpCode);
|
|
26
|
-
window.location.assign('');
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
this.errorMsg = this._translate._('IDEA_AUTH.INVALID_OTP_CODE');
|
|
30
|
-
this._message.error(this.errorMsg, true);
|
|
31
|
-
}
|
|
32
|
-
finally {
|
|
33
|
-
this._loading.hide();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
goToAuth() {
|
|
37
|
-
this._nav.navigateBack(['auth']);
|
|
38
|
-
}
|
|
39
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAMFAChallengePage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEAMFAChallengePage, isStandalone: true, selector: "idea-mfa-challenge", ngImport: i0, template: `
|
|
41
|
-
<ion-content>
|
|
42
|
-
<form class="flexBox">
|
|
43
|
-
<ion-card class="authCard">
|
|
44
|
-
<ion-card-header>
|
|
45
|
-
<ion-card-title color="primary">{{ 'IDEA_AUTH.ENTER_OTP_CODE' | translate }}</ion-card-title>
|
|
46
|
-
<ion-card-subtitle>{{ 'IDEA_AUTH.ENTER_OTP_CODE_I' | translate }}</ion-card-subtitle>
|
|
47
|
-
</ion-card-header>
|
|
48
|
-
<ion-card-content>
|
|
49
|
-
@if (errorMsg) {
|
|
50
|
-
<p testId="mfachallenge.error" class="errorBox">
|
|
51
|
-
<b>{{ 'IDEA_AUTH.ERROR' | translate }}.</b>
|
|
52
|
-
{{ errorMsg }}
|
|
53
|
-
</p>
|
|
54
|
-
}
|
|
55
|
-
<ion-item>
|
|
56
|
-
<ion-label position="inline">
|
|
57
|
-
<ion-icon name="key" color="primary" />
|
|
58
|
-
</ion-label>
|
|
59
|
-
<ion-input
|
|
60
|
-
testId="mfachallenge.otpcode"
|
|
61
|
-
inputmode="numeric"
|
|
62
|
-
[placeholder]="'IDEA_AUTH.OTP_CODE' | translate"
|
|
63
|
-
[title]="'IDEA_AUTH.ENTER_OTP_CODE' | translate"
|
|
64
|
-
[ngModelOptions]="{ standalone: true }"
|
|
65
|
-
[(ngModel)]="otpCode"
|
|
66
|
-
(keyup.enter)="completeMFAChallenge()"
|
|
67
|
-
/>
|
|
68
|
-
</ion-item>
|
|
69
|
-
<ion-button
|
|
70
|
-
testId="confirmOTPCodeButton"
|
|
71
|
-
expand="block"
|
|
72
|
-
[title]="'IDEA_AUTH.CONFIRM_OTP_CODE_HINT' | translate"
|
|
73
|
-
(click)="completeMFAChallenge()"
|
|
74
|
-
>
|
|
75
|
-
{{ 'IDEA_AUTH.CONFIRM_OTP_CODE' | translate }}
|
|
76
|
-
</ion-button>
|
|
77
|
-
<ion-button
|
|
78
|
-
testId="backToSignInButton"
|
|
79
|
-
fill="clear"
|
|
80
|
-
expand="block"
|
|
81
|
-
class="smallCaseButton"
|
|
82
|
-
[title]="'IDEA_AUTH.BACK_TO_SIGN_IN_HINT' | translate"
|
|
83
|
-
(click)="goToAuth()"
|
|
84
|
-
>
|
|
85
|
-
{{ 'IDEA_AUTH.BACK_TO_SIGN_IN' | translate }}
|
|
86
|
-
</ion-button>
|
|
87
|
-
</ion-card-content>
|
|
88
|
-
</ion-card>
|
|
89
|
-
</form>
|
|
90
|
-
</ion-content>
|
|
91
|
-
`, isInline: true, styles: [".flexBox{background:var(--idea-auth-background-color, var(--ion-color-white-shade))}.authCard{min-width:400px;max-width:550px;margin:0 10px;padding:20px;background-color:var(--idea-auth-card-background-color, var(--ion-color-white));border:1px solid var(--idea-auth-card-border-color, var(--ion-color-light));border-radius:10px;box-shadow:none;text-align:center}.authCard ion-img{width:150px;display:block;margin:0 auto}.authCard ion-card-title{font-family:auth-title;font-size:3em}.authCard ion-card-subtitle{font-family:auth-title;font-size:1.2em}.authCard ion-card-content{padding-top:16px}.authCard ion-card-content .errorBox{padding-left:10px;margin-bottom:20px;text-align:left;border-left:2px solid var(--ion-color-danger)}.authCard ion-card-content ion-item{--ion-item-background: var(--idea-auth-card-background-color, var(--ion-color-white));--border-color: var(--idea-auth-card-border-color, var(--ion-color-light))}.authCard ion-card-content ion-label[position=inline] ion-icon{padding-top:4px;padding-right:5px;font-size:1.3em}.authCard ion-card-content .agreementsAcceptanceRow{margin-top:15px;font-size:.9em}.authCard ion-card-content .agreementsAcceptanceRow ion-checkbox{vertical-align:bottom;margin-right:3px}.authCard ion-card-content ion-button:not([slot=end]){margin-top:15px}.authCard ion-card-content .smallCaseButton{text-transform:none;letter-spacing:normal;font-size:1em}@media only screen and (max-width: 500px){.authCard{background-color:transparent;border:none}}.ideaLogo{width:65px;margin:40px auto 0;cursor:pointer}.passwordPolicyPopover{--width: 350px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
|
|
92
|
-
}
|
|
93
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAMFAChallengePage, decorators: [{
|
|
94
|
-
type: Component,
|
|
95
|
-
args: [{ selector: 'idea-mfa-challenge', standalone: true, imports: [
|
|
96
|
-
CommonModule,
|
|
97
|
-
FormsModule,
|
|
98
|
-
IDEATranslatePipe,
|
|
99
|
-
IonButton,
|
|
100
|
-
IonIcon,
|
|
101
|
-
IonLabel,
|
|
102
|
-
IonCardContent,
|
|
103
|
-
IonItem,
|
|
104
|
-
IonCardSubtitle,
|
|
105
|
-
IonCardTitle,
|
|
106
|
-
IonCardHeader,
|
|
107
|
-
IonCard,
|
|
108
|
-
IonContent,
|
|
109
|
-
IonInput
|
|
110
|
-
], template: `
|
|
111
|
-
<ion-content>
|
|
112
|
-
<form class="flexBox">
|
|
113
|
-
<ion-card class="authCard">
|
|
114
|
-
<ion-card-header>
|
|
115
|
-
<ion-card-title color="primary">{{ 'IDEA_AUTH.ENTER_OTP_CODE' | translate }}</ion-card-title>
|
|
116
|
-
<ion-card-subtitle>{{ 'IDEA_AUTH.ENTER_OTP_CODE_I' | translate }}</ion-card-subtitle>
|
|
117
|
-
</ion-card-header>
|
|
118
|
-
<ion-card-content>
|
|
119
|
-
@if (errorMsg) {
|
|
120
|
-
<p testId="mfachallenge.error" class="errorBox">
|
|
121
|
-
<b>{{ 'IDEA_AUTH.ERROR' | translate }}.</b>
|
|
122
|
-
{{ errorMsg }}
|
|
123
|
-
</p>
|
|
124
|
-
}
|
|
125
|
-
<ion-item>
|
|
126
|
-
<ion-label position="inline">
|
|
127
|
-
<ion-icon name="key" color="primary" />
|
|
128
|
-
</ion-label>
|
|
129
|
-
<ion-input
|
|
130
|
-
testId="mfachallenge.otpcode"
|
|
131
|
-
inputmode="numeric"
|
|
132
|
-
[placeholder]="'IDEA_AUTH.OTP_CODE' | translate"
|
|
133
|
-
[title]="'IDEA_AUTH.ENTER_OTP_CODE' | translate"
|
|
134
|
-
[ngModelOptions]="{ standalone: true }"
|
|
135
|
-
[(ngModel)]="otpCode"
|
|
136
|
-
(keyup.enter)="completeMFAChallenge()"
|
|
137
|
-
/>
|
|
138
|
-
</ion-item>
|
|
139
|
-
<ion-button
|
|
140
|
-
testId="confirmOTPCodeButton"
|
|
141
|
-
expand="block"
|
|
142
|
-
[title]="'IDEA_AUTH.CONFIRM_OTP_CODE_HINT' | translate"
|
|
143
|
-
(click)="completeMFAChallenge()"
|
|
144
|
-
>
|
|
145
|
-
{{ 'IDEA_AUTH.CONFIRM_OTP_CODE' | translate }}
|
|
146
|
-
</ion-button>
|
|
147
|
-
<ion-button
|
|
148
|
-
testId="backToSignInButton"
|
|
149
|
-
fill="clear"
|
|
150
|
-
expand="block"
|
|
151
|
-
class="smallCaseButton"
|
|
152
|
-
[title]="'IDEA_AUTH.BACK_TO_SIGN_IN_HINT' | translate"
|
|
153
|
-
(click)="goToAuth()"
|
|
154
|
-
>
|
|
155
|
-
{{ 'IDEA_AUTH.BACK_TO_SIGN_IN' | translate }}
|
|
156
|
-
</ion-button>
|
|
157
|
-
</ion-card-content>
|
|
158
|
-
</ion-card>
|
|
159
|
-
</form>
|
|
160
|
-
</ion-content>
|
|
161
|
-
`, styles: [".flexBox{background:var(--idea-auth-background-color, var(--ion-color-white-shade))}.authCard{min-width:400px;max-width:550px;margin:0 10px;padding:20px;background-color:var(--idea-auth-card-background-color, var(--ion-color-white));border:1px solid var(--idea-auth-card-border-color, var(--ion-color-light));border-radius:10px;box-shadow:none;text-align:center}.authCard ion-img{width:150px;display:block;margin:0 auto}.authCard ion-card-title{font-family:auth-title;font-size:3em}.authCard ion-card-subtitle{font-family:auth-title;font-size:1.2em}.authCard ion-card-content{padding-top:16px}.authCard ion-card-content .errorBox{padding-left:10px;margin-bottom:20px;text-align:left;border-left:2px solid var(--ion-color-danger)}.authCard ion-card-content ion-item{--ion-item-background: var(--idea-auth-card-background-color, var(--ion-color-white));--border-color: var(--idea-auth-card-border-color, var(--ion-color-light))}.authCard ion-card-content ion-label[position=inline] ion-icon{padding-top:4px;padding-right:5px;font-size:1.3em}.authCard ion-card-content .agreementsAcceptanceRow{margin-top:15px;font-size:.9em}.authCard ion-card-content .agreementsAcceptanceRow ion-checkbox{vertical-align:bottom;margin-right:3px}.authCard ion-card-content ion-button:not([slot=end]){margin-top:15px}.authCard ion-card-content .smallCaseButton{text-transform:none;letter-spacing:normal;font-size:1em}@media only screen and (max-width: 500px){.authCard{background-color:transparent;border:none}}.ideaLogo{width:65px;margin:40px auto 0;cursor:pointer}.passwordPolicyPopover{--width: 350px}\n"] }]
|
|
162
|
-
}] });
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWZhQ2hhbGxlbmdlLnBhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2F1dGgvc3JjL21mYUNoYWxsZW5nZS5wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsT0FBTyxFQUNQLGFBQWEsRUFDYixZQUFZLEVBQ1osZUFBZSxFQUNmLE9BQU8sRUFDUCxjQUFjLEVBQ2QsUUFBUSxFQUNSLE9BQU8sRUFDUCxTQUFTLEVBQ1QsUUFBUSxFQUNULE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFeEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUEyRWpELE1BQU0sT0FBTyxvQkFBb0I7SUF6RWpDO1FBMEVVLFNBQUksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDN0IsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxVQUFLLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQztLQTBCdEQ7SUFyQkMsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjtZQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7OEdBOUJVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDhFQXREckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1EVCwwbkRBbEVDLFlBQVksOEJBQ1osV0FBVyxteEJBQ1gsaUJBQWlCLGtEQUNqQixTQUFTLG9QQUNULE9BQU8sMkpBQ1AsUUFBUSw2RkFDUixjQUFjLCtFQUNkLE9BQU8sME5BQ1AsZUFBZSx5RkFDZixZQUFZLHNGQUNaLGFBQWEsc0dBQ2IsT0FBTyx5TEFDUCxVQUFVLHdLQUNWLFFBQVE7OzJGQXdEQyxvQkFBb0I7a0JBekVoQyxTQUFTOytCQUNFLG9CQUFvQixjQUNsQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGlCQUFpQjt3QkFDakIsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLFFBQVE7d0JBQ1IsY0FBYzt3QkFDZCxPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsWUFBWTt3QkFDWixhQUFhO3dCQUNiLE9BQU87d0JBQ1AsVUFBVTt3QkFDVixRQUFRO3FCQUNULFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1EVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE5hdkNvbnRyb2xsZXIsXG4gIElvbkNvbnRlbnQsXG4gIElvbkNhcmQsXG4gIElvbkNhcmRIZWFkZXIsXG4gIElvbkNhcmRUaXRsZSxcbiAgSW9uQ2FyZFN1YnRpdGxlLFxuICBJb25JdGVtLFxuICBJb25DYXJkQ29udGVudCxcbiAgSW9uTGFiZWwsXG4gIElvbkljb24sXG4gIElvbkJ1dHRvbixcbiAgSW9uSW5wdXRcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBJREVBTWVzc2FnZVNlcnZpY2UsIElERUFMb2FkaW5nU2VydmljZSwgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UsIElERUFUcmFuc2xhdGVQaXBlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpZGVhLW1mYS1jaGFsbGVuZ2UnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIElERUFUcmFuc2xhdGVQaXBlLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25JY29uLFxuICAgIElvbkxhYmVsLFxuICAgIElvbkNhcmRDb250ZW50LFxuICAgIElvbkl0ZW0sXG4gICAgSW9uQ2FyZFN1YnRpdGxlLFxuICAgIElvbkNhcmRUaXRsZSxcbiAgICBJb25DYXJkSGVhZGVyLFxuICAgIElvbkNhcmQsXG4gICAgSW9uQ29udGVudCxcbiAgICBJb25JbnB1dFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24tY29udGVudD5cbiAgICAgIDxmb3JtIGNsYXNzPVwiZmxleEJveFwiPlxuICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJhdXRoQ2FyZFwiPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY29sb3I9XCJwcmltYXJ5XCI+e3sgJ0lERUFfQVVUSC5FTlRFUl9PVFBfQ09ERScgfCB0cmFuc2xhdGUgfX08L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPnt7ICdJREVBX0FVVEguRU5URVJfT1RQX0NPREVfSScgfCB0cmFuc2xhdGUgfX08L2lvbi1jYXJkLXN1YnRpdGxlPlxuICAgICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgQGlmIChlcnJvck1zZykge1xuICAgICAgICAgICAgICA8cCB0ZXN0SWQ9XCJtZmFjaGFsbGVuZ2UuZXJyb3JcIiBjbGFzcz1cImVycm9yQm94XCI+XG4gICAgICAgICAgICAgICAgPGI+e3sgJ0lERUFfQVVUSC5FUlJPUicgfCB0cmFuc2xhdGUgfX0uPC9iPlxuICAgICAgICAgICAgICAgIHt7IGVycm9yTXNnIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCBwb3NpdGlvbj1cImlubGluZVwiPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwia2V5XCIgY29sb3I9XCJwcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICAgICAgICB0ZXN0SWQ9XCJtZmFjaGFsbGVuZ2Uub3RwY29kZVwiXG4gICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX0FVVEguT1RQX0NPREUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0lERUFfQVVUSC5FTlRFUl9PVFBfQ09ERScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJvdHBDb2RlXCJcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiY29tcGxldGVNRkFDaGFsbGVuZ2UoKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgdGVzdElkPVwiY29uZmlybU9UUENvZGVCdXR0b25cIlxuICAgICAgICAgICAgICBleHBhbmQ9XCJibG9ja1wiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInSURFQV9BVVRILkNPTkZJUk1fT1RQX0NPREVfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29tcGxldGVNRkFDaGFsbGVuZ2UoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdJREVBX0FVVEguQ09ORklSTV9PVFBfQ09ERScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIHRlc3RJZD1cImJhY2tUb1NpZ25JbkJ1dHRvblwiXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbWFsbENhc2VCdXR0b25cIlxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0lERUFfQVVUSC5CQUNLX1RPX1NJR05fSU5fSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0F1dGgoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICdJREVBX0FVVEguQkFDS19UT19TSUdOX0lOJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgPC9pb24tY2FyZD5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxuICBzdHlsZVVybHM6IFsnYXV0aC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQU1GQUNoYWxsZW5nZVBhZ2UgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIF9uYXYgPSBpbmplY3QoTmF2Q29udHJvbGxlcik7XG4gIHByaXZhdGUgX21lc3NhZ2UgPSBpbmplY3QoSURFQU1lc3NhZ2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfbG9hZGluZyA9IGluamVjdChJREVBTG9hZGluZ1NlcnZpY2UpO1xuICBwcml2YXRlIF9hdXRoID0gaW5qZWN0KElERUFBdXRoU2VydmljZSk7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG5cbiAgb3RwQ29kZTogc3RyaW5nO1xuICBlcnJvck1zZzogc3RyaW5nO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fYXV0aC5jaGFsbGVuZ2VVc2VybmFtZSkgdGhpcy5nb1RvQXV0aCgpO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVNRkFDaGFsbGVuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZXJyb3JNc2cgPSBudWxsO1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KCk7XG4gICAgICBhd2FpdCB0aGlzLl9hdXRoLmNvbXBsZXRlTUZBQ2hhbGxlbmdlKHRoaXMub3RwQ29kZSk7XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKCcnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvck1zZyA9IHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FVVEguSU5WQUxJRF9PVFBfQ09ERScpO1xuICAgICAgdGhpcy5fbWVzc2FnZS5lcnJvcih0aGlzLmVycm9yTXNnLCB0cnVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgZ29Ub0F1dGgoKTogdm9pZCB7XG4gICAgdGhpcy5fbmF2Lm5hdmlnYXRlQmFjayhbJ2F1dGgnXSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, inject } from '@angular/core';
|
|
3
|
-
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { NavController, PopoverController, IonContent, IonCard, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonItem, IonLabel, IonIcon, IonButton, IonInput } from '@ionic/angular/standalone';
|
|
5
|
-
import { IDEAEnvironment, IDEAMessageService, IDEALoadingService, IDEATranslationsService, IDEATranslatePipe } from '@idea-ionic/common';
|
|
6
|
-
import { IDEAPasswordPolicyComponent } from './passwordPolicy.component';
|
|
7
|
-
import { IDEAAuthService } from './auth.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/forms";
|
|
10
|
-
export class IDEANewPasswordPage {
|
|
11
|
-
constructor() {
|
|
12
|
-
this._env = inject(IDEAEnvironment);
|
|
13
|
-
this._nav = inject(NavController);
|
|
14
|
-
this._popover = inject(PopoverController);
|
|
15
|
-
this._message = inject(IDEAMessageService);
|
|
16
|
-
this._loading = inject(IDEALoadingService);
|
|
17
|
-
this._translate = inject(IDEATranslationsService);
|
|
18
|
-
this._auth = inject(IDEAAuthService);
|
|
19
|
-
this.passwordPolicy = this._env.idea.auth.passwordPolicy;
|
|
20
|
-
}
|
|
21
|
-
ngOnInit() {
|
|
22
|
-
if (!this._auth.challengeUsername)
|
|
23
|
-
this.goToAuth();
|
|
24
|
-
}
|
|
25
|
-
async confirmNewPassword() {
|
|
26
|
-
try {
|
|
27
|
-
await this._loading.show();
|
|
28
|
-
this.errorMsg = null;
|
|
29
|
-
const errors = this._auth.validatePasswordAgainstPolicy(this.newPassword);
|
|
30
|
-
if (errors.length === 0 && this.passwordPolicy.advancedPasswordCheck)
|
|
31
|
-
errors.push(...(await this._auth.validatePasswordAgainstDatabases(this.newPassword)));
|
|
32
|
-
if (errors.length)
|
|
33
|
-
this.errorMsg = [
|
|
34
|
-
this._translate._('IDEA_AUTH.PASSWORD_REQUIREMENTS_FOLLOW'),
|
|
35
|
-
...errors.map(x => this._translate._('IDEA_AUTH.PASSWORD_REQUIREMENTS.'.concat(x), { n: this.passwordPolicy.minLength }))
|
|
36
|
-
].join(' ');
|
|
37
|
-
if (this.errorMsg)
|
|
38
|
-
return this._message.error('IDEA_AUTH.PASSWORD_REQUIREMENTS_FOLLOW');
|
|
39
|
-
await this._auth.confirmNewPassword(this.newPassword);
|
|
40
|
-
window.location.assign('');
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
this.errorMsg = error.message;
|
|
44
|
-
this._message.error('IDEA_AUTH.PASSWORD_REQUIREMENTS_FOLLOW');
|
|
45
|
-
}
|
|
46
|
-
finally {
|
|
47
|
-
this._loading.hide();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async openPasswordPolicy(event) {
|
|
51
|
-
const cssClass = 'passwordPolicyPopover';
|
|
52
|
-
const popover = await this._popover.create({ component: IDEAPasswordPolicyComponent, event, cssClass });
|
|
53
|
-
await popover.present();
|
|
54
|
-
}
|
|
55
|
-
goToAuth() {
|
|
56
|
-
this._nav.navigateBack(['auth']);
|
|
57
|
-
}
|
|
58
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEANewPasswordPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
59
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEANewPasswordPage, isStandalone: true, selector: "idea-new-password", ngImport: i0, template: `
|
|
60
|
-
<ion-content>
|
|
61
|
-
<form class="flexBox">
|
|
62
|
-
<ion-card class="authCard">
|
|
63
|
-
<ion-card-header>
|
|
64
|
-
<ion-card-title color="primary">{{ 'IDEA_AUTH.CHOOSE_A_PASSWORD' | translate }}</ion-card-title>
|
|
65
|
-
<ion-card-subtitle>{{ 'IDEA_AUTH.YOU_NEED_TO_CHOOSE_A_NEW_PASSWORD' | translate }}</ion-card-subtitle>
|
|
66
|
-
</ion-card-header>
|
|
67
|
-
<ion-card-content>
|
|
68
|
-
@if (errorMsg) {
|
|
69
|
-
<p testId="newpassword.error" class="errorBox">
|
|
70
|
-
<b> {{ 'IDEA_AUTH.ERROR' | translate }}. </b>
|
|
71
|
-
{{ errorMsg }}
|
|
72
|
-
</p>
|
|
73
|
-
}
|
|
74
|
-
<ion-item>
|
|
75
|
-
<ion-label position="inline">
|
|
76
|
-
<ion-icon name="key" color="primary" />
|
|
77
|
-
</ion-label>
|
|
78
|
-
<ion-input
|
|
79
|
-
testId="newpassword.password"
|
|
80
|
-
type="password"
|
|
81
|
-
spellcheck="false"
|
|
82
|
-
autocorrect="off"
|
|
83
|
-
autocomplete="new-password"
|
|
84
|
-
[pattern]="_auth.getPasswordPolicyPatternForInput()"
|
|
85
|
-
[clearOnEdit]="false"
|
|
86
|
-
[placeholder]="'IDEA_AUTH.PASSWORD' | translate"
|
|
87
|
-
[title]="'IDEA_AUTH.CHOOSE_A_PASSWORD' | translate"
|
|
88
|
-
[ngModelOptions]="{ standalone: true }"
|
|
89
|
-
[(ngModel)]="newPassword"
|
|
90
|
-
(keyup.enter)="confirmNewPassword()"
|
|
91
|
-
/>
|
|
92
|
-
<ion-button
|
|
93
|
-
testId="openPasswordPolicyButton"
|
|
94
|
-
slot="end"
|
|
95
|
-
fill="clear"
|
|
96
|
-
color="dark"
|
|
97
|
-
(click)="openPasswordPolicy($event)"
|
|
98
|
-
>
|
|
99
|
-
<ion-icon icon="help-circle-outline" slot="icon-only" />
|
|
100
|
-
</ion-button>
|
|
101
|
-
</ion-item>
|
|
102
|
-
<ion-button
|
|
103
|
-
testId="confirmNewPaswordButton"
|
|
104
|
-
expand="block"
|
|
105
|
-
[title]="'IDEA_AUTH.CONFIRM_NEW_PASSWORD_HINT' | translate"
|
|
106
|
-
(click)="confirmNewPassword()"
|
|
107
|
-
>
|
|
108
|
-
{{ 'IDEA_AUTH.CONFIRM_NEW_PASSWORD' | translate }}
|
|
109
|
-
</ion-button>
|
|
110
|
-
<ion-button
|
|
111
|
-
testId="backToSignInButton"
|
|
112
|
-
fill="clear"
|
|
113
|
-
expand="block"
|
|
114
|
-
class="smallCaseButton"
|
|
115
|
-
[title]="'IDEA_AUTH.BACK_TO_SIGN_IN_HINT' | translate"
|
|
116
|
-
(click)="goToAuth()"
|
|
117
|
-
>
|
|
118
|
-
{{ 'IDEA_AUTH.BACK_TO_SIGN_IN' | translate }}
|
|
119
|
-
</ion-button>
|
|
120
|
-
</ion-card-content>
|
|
121
|
-
</ion-card>
|
|
122
|
-
</form>
|
|
123
|
-
</ion-content>
|
|
124
|
-
`, isInline: true, styles: [".flexBox{background:var(--idea-auth-background-color, var(--ion-color-white-shade))}.authCard{min-width:400px;max-width:550px;margin:0 10px;padding:20px;background-color:var(--idea-auth-card-background-color, var(--ion-color-white));border:1px solid var(--idea-auth-card-border-color, var(--ion-color-light));border-radius:10px;box-shadow:none;text-align:center}.authCard ion-img{width:150px;display:block;margin:0 auto}.authCard ion-card-title{font-family:auth-title;font-size:3em}.authCard ion-card-subtitle{font-family:auth-title;font-size:1.2em}.authCard ion-card-content{padding-top:16px}.authCard ion-card-content .errorBox{padding-left:10px;margin-bottom:20px;text-align:left;border-left:2px solid var(--ion-color-danger)}.authCard ion-card-content ion-item{--ion-item-background: var(--idea-auth-card-background-color, var(--ion-color-white));--border-color: var(--idea-auth-card-border-color, var(--ion-color-light))}.authCard ion-card-content ion-label[position=inline] ion-icon{padding-top:4px;padding-right:5px;font-size:1.3em}.authCard ion-card-content .agreementsAcceptanceRow{margin-top:15px;font-size:.9em}.authCard ion-card-content .agreementsAcceptanceRow ion-checkbox{vertical-align:bottom;margin-right:3px}.authCard ion-card-content ion-button:not([slot=end]){margin-top:15px}.authCard ion-card-content .smallCaseButton{text-transform:none;letter-spacing:normal;font-size:1em}@media only screen and (max-width: 500px){.authCard{background-color:transparent;border:none}}.ideaLogo{width:65px;margin:40px auto 0;cursor:pointer}.passwordPolicyPopover{--width: 350px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardSubtitle, selector: "ion-card-subtitle", inputs: ["color", "mode"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }] }); }
|
|
125
|
-
}
|
|
126
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEANewPasswordPage, decorators: [{
|
|
127
|
-
type: Component,
|
|
128
|
-
args: [{ selector: 'idea-new-password', standalone: true, imports: [
|
|
129
|
-
CommonModule,
|
|
130
|
-
FormsModule,
|
|
131
|
-
IDEATranslatePipe,
|
|
132
|
-
IonButton,
|
|
133
|
-
IonIcon,
|
|
134
|
-
IonLabel,
|
|
135
|
-
IonItem,
|
|
136
|
-
IonCardContent,
|
|
137
|
-
IonCardSubtitle,
|
|
138
|
-
IonCardTitle,
|
|
139
|
-
IonCardHeader,
|
|
140
|
-
IonCard,
|
|
141
|
-
IonContent,
|
|
142
|
-
IonInput
|
|
143
|
-
], template: `
|
|
144
|
-
<ion-content>
|
|
145
|
-
<form class="flexBox">
|
|
146
|
-
<ion-card class="authCard">
|
|
147
|
-
<ion-card-header>
|
|
148
|
-
<ion-card-title color="primary">{{ 'IDEA_AUTH.CHOOSE_A_PASSWORD' | translate }}</ion-card-title>
|
|
149
|
-
<ion-card-subtitle>{{ 'IDEA_AUTH.YOU_NEED_TO_CHOOSE_A_NEW_PASSWORD' | translate }}</ion-card-subtitle>
|
|
150
|
-
</ion-card-header>
|
|
151
|
-
<ion-card-content>
|
|
152
|
-
@if (errorMsg) {
|
|
153
|
-
<p testId="newpassword.error" class="errorBox">
|
|
154
|
-
<b> {{ 'IDEA_AUTH.ERROR' | translate }}. </b>
|
|
155
|
-
{{ errorMsg }}
|
|
156
|
-
</p>
|
|
157
|
-
}
|
|
158
|
-
<ion-item>
|
|
159
|
-
<ion-label position="inline">
|
|
160
|
-
<ion-icon name="key" color="primary" />
|
|
161
|
-
</ion-label>
|
|
162
|
-
<ion-input
|
|
163
|
-
testId="newpassword.password"
|
|
164
|
-
type="password"
|
|
165
|
-
spellcheck="false"
|
|
166
|
-
autocorrect="off"
|
|
167
|
-
autocomplete="new-password"
|
|
168
|
-
[pattern]="_auth.getPasswordPolicyPatternForInput()"
|
|
169
|
-
[clearOnEdit]="false"
|
|
170
|
-
[placeholder]="'IDEA_AUTH.PASSWORD' | translate"
|
|
171
|
-
[title]="'IDEA_AUTH.CHOOSE_A_PASSWORD' | translate"
|
|
172
|
-
[ngModelOptions]="{ standalone: true }"
|
|
173
|
-
[(ngModel)]="newPassword"
|
|
174
|
-
(keyup.enter)="confirmNewPassword()"
|
|
175
|
-
/>
|
|
176
|
-
<ion-button
|
|
177
|
-
testId="openPasswordPolicyButton"
|
|
178
|
-
slot="end"
|
|
179
|
-
fill="clear"
|
|
180
|
-
color="dark"
|
|
181
|
-
(click)="openPasswordPolicy($event)"
|
|
182
|
-
>
|
|
183
|
-
<ion-icon icon="help-circle-outline" slot="icon-only" />
|
|
184
|
-
</ion-button>
|
|
185
|
-
</ion-item>
|
|
186
|
-
<ion-button
|
|
187
|
-
testId="confirmNewPaswordButton"
|
|
188
|
-
expand="block"
|
|
189
|
-
[title]="'IDEA_AUTH.CONFIRM_NEW_PASSWORD_HINT' | translate"
|
|
190
|
-
(click)="confirmNewPassword()"
|
|
191
|
-
>
|
|
192
|
-
{{ 'IDEA_AUTH.CONFIRM_NEW_PASSWORD' | translate }}
|
|
193
|
-
</ion-button>
|
|
194
|
-
<ion-button
|
|
195
|
-
testId="backToSignInButton"
|
|
196
|
-
fill="clear"
|
|
197
|
-
expand="block"
|
|
198
|
-
class="smallCaseButton"
|
|
199
|
-
[title]="'IDEA_AUTH.BACK_TO_SIGN_IN_HINT' | translate"
|
|
200
|
-
(click)="goToAuth()"
|
|
201
|
-
>
|
|
202
|
-
{{ 'IDEA_AUTH.BACK_TO_SIGN_IN' | translate }}
|
|
203
|
-
</ion-button>
|
|
204
|
-
</ion-card-content>
|
|
205
|
-
</ion-card>
|
|
206
|
-
</form>
|
|
207
|
-
</ion-content>
|
|
208
|
-
`, styles: [".flexBox{background:var(--idea-auth-background-color, var(--ion-color-white-shade))}.authCard{min-width:400px;max-width:550px;margin:0 10px;padding:20px;background-color:var(--idea-auth-card-background-color, var(--ion-color-white));border:1px solid var(--idea-auth-card-border-color, var(--ion-color-light));border-radius:10px;box-shadow:none;text-align:center}.authCard ion-img{width:150px;display:block;margin:0 auto}.authCard ion-card-title{font-family:auth-title;font-size:3em}.authCard ion-card-subtitle{font-family:auth-title;font-size:1.2em}.authCard ion-card-content{padding-top:16px}.authCard ion-card-content .errorBox{padding-left:10px;margin-bottom:20px;text-align:left;border-left:2px solid var(--ion-color-danger)}.authCard ion-card-content ion-item{--ion-item-background: var(--idea-auth-card-background-color, var(--ion-color-white));--border-color: var(--idea-auth-card-border-color, var(--ion-color-light))}.authCard ion-card-content ion-label[position=inline] ion-icon{padding-top:4px;padding-right:5px;font-size:1.3em}.authCard ion-card-content .agreementsAcceptanceRow{margin-top:15px;font-size:.9em}.authCard ion-card-content .agreementsAcceptanceRow ion-checkbox{vertical-align:bottom;margin-right:3px}.authCard ion-card-content ion-button:not([slot=end]){margin-top:15px}.authCard ion-card-content .smallCaseButton{text-transform:none;letter-spacing:normal;font-size:1em}@media only screen and (max-width: 500px){.authCard{background-color:transparent;border:none}}.ideaLogo{width:65px;margin:40px auto 0;cursor:pointer}.passwordPolicyPopover{--width: 350px}\n"] }]
|
|
209
|
-
}], ctorParameters: () => [] });
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3UGFzc3dvcmQucGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvYXV0aC9zcmMvbmV3UGFzc3dvcmQucGFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixPQUFPLEVBQ1AsYUFBYSxFQUNiLFlBQVksRUFDWixlQUFlLEVBQ2YsY0FBYyxFQUNkLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFNBQVMsRUFDVCxRQUFRLEVBQ1QsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNsQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBeUZqRCxNQUFNLE9BQU8sbUJBQW1CO0lBYTlCO1FBWlUsU0FBSSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxTQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdCLGFBQVEsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyQyxhQUFRLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3RDLGVBQVUsR0FBRyxNQUFNLENBQUMsdUJB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UyxvUEFDVCxPQUFPLDJKQUNQLFFBQVEsNkZBQ1IsT0FBTywwTkFDUCxjQUFjLCtFQUNkLGVBQWUseUZBQ2YsWUFBWSxzRkFDWixhQUFhLHNHQUNiLE9BQU8seUxBQ1AsVUFBVSx3S0FDVixRQUFROzsyRkFzRUMsbUJBQW1CO2tCQXZGL0IsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxpQkFBaUI7d0JBQ2pCLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxRQUFRO3dCQUNSLE9BQU87d0JBQ1AsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixPQUFPO3dCQUNQLFVBQVU7d0JBQ1YsUUFBUTtxQkFDVCxZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlFVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE5hdkNvbnRyb2xsZXIsXG4gIFBvcG92ZXJDb250cm9sbGVyLFxuICBJb25Db250ZW50LFxuICBJb25DYXJkLFxuICBJb25DYXJkSGVhZGVyLFxuICBJb25DYXJkVGl0bGUsXG4gIElvbkNhcmRTdWJ0aXRsZSxcbiAgSW9uQ2FyZENvbnRlbnQsXG4gIElvbkl0ZW0sXG4gIElvbkxhYmVsLFxuICBJb25JY29uLFxuICBJb25CdXR0b24sXG4gIElvbklucHV0XG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHtcbiAgSURFQUVudmlyb25tZW50LFxuICBJREVBTWVzc2FnZVNlcnZpY2UsXG4gIElERUFMb2FkaW5nU2VydmljZSxcbiAgSURFQVRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gIElERUFUcmFuc2xhdGVQaXBlXG59IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbmltcG9ydCB7IElERUFQYXNzd29yZFBvbGljeUNvbXBvbmVudCB9IGZyb20gJy4vcGFzc3dvcmRQb2xpY3kuY29tcG9uZW50JztcbmltcG9ydCB7IElERUFBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaWRlYS1uZXctcGFzc3dvcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIElERUFUcmFuc2xhdGVQaXBlLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25JY29uLFxuICAgIElvbkxhYmVsLFxuICAgIElvbkl0ZW0sXG4gICAgSW9uQ2FyZENvbnRlbnQsXG4gICAgSW9uQ2FyZFN1YnRpdGxlLFxuICAgIElvbkNhcmRUaXRsZSxcbiAgICBJb25DYXJkSGVhZGVyLFxuICAgIElvbkNhcmQsXG4gICAgSW9uQ29udGVudCxcbiAgICBJb25JbnB1dFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24tY29udGVudD5cbiAgICAgIDxmb3JtIGNsYXNzPVwiZmxleEJveFwiPlxuICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJhdXRoQ2FyZFwiPlxuICAgICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY29sb3I9XCJwcmltYXJ5XCI+e3sgJ0lERUFfQVVUSC5DSE9PU0VfQV9QQVNTV09SRCcgfCB0cmFuc2xhdGUgfX08L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPnt7ICdJREVBX0FVVEguWU9VX05FRURfVE9fQ0hPT1NFX0FfTkVXX1BBU1NXT1JEJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICBAaWYgKGVycm9yTXNnKSB7XG4gICAgICAgICAgICAgIDxwIHRlc3RJZD1cIm5ld3Bhc3N3b3JkLmVycm9yXCIgY2xhc3M9XCJlcnJvckJveFwiPlxuICAgICAgICAgICAgICAgIDxiPiB7eyAnSURFQV9BVVRILkVSUk9SJyB8IHRyYW5zbGF0ZSB9fS4gPC9iPlxuICAgICAgICAgICAgICAgIHt7IGVycm9yTXNnIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgICAgPGlvbi1sYWJlbCBwb3NpdGlvbj1cImlubGluZVwiPlxuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwia2V5XCIgY29sb3I9XCJwcmltYXJ5XCIgLz5cbiAgICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICAgICAgICB0ZXN0SWQ9XCJuZXdwYXNzd29yZC5wYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIGF1dG9jb3JyZWN0PVwib2ZmXCJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxuICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIl9hdXRoLmdldFBhc3N3b3JkUG9saWN5UGF0dGVybkZvcklucHV0KClcIlxuICAgICAgICAgICAgICAgIFtjbGVhck9uRWRpdF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidJREVBX0FVVEguUEFTU1dPUkQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0lERUFfQVVUSC5DSE9PU0VfQV9QQVNTV09SRCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7IHN0YW5kYWxvbmU6IHRydWUgfVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdQYXNzd29yZFwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImNvbmZpcm1OZXdQYXNzd29yZCgpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgICB0ZXN0SWQ9XCJvcGVuUGFzc3dvcmRQb2xpY3lCdXR0b25cIlxuICAgICAgICAgICAgICAgIHNsb3Q9XCJlbmRcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblBhc3N3b3JkUG9saWN5KCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIGljb249XCJoZWxwLWNpcmNsZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICB0ZXN0SWQ9XCJjb25maXJtTmV3UGFzd29yZEJ1dHRvblwiXG4gICAgICAgICAgICAgIGV4cGFuZD1cImJsb2NrXCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidJREVBX0FVVEguQ09ORklSTV9ORVdfUEFTU1dPUkRfSElOVCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybU5ld1Bhc3N3b3JkKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyAnSURFQV9BVVRILkNPTkZJUk1fTkVXX1BBU1NXT1JEJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAgICAgdGVzdElkPVwiYmFja1RvU2lnbkluQnV0dG9uXCJcbiAgICAgICAgICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgICAgICAgICAgZXhwYW5kPVwiYmxvY2tcIlxuICAgICAgICAgICAgICBjbGFzcz1cInNtYWxsQ2FzZUJ1dHRvblwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInSURFQV9BVVRILkJBQ0tfVE9fU0lHTl9JTl9ISU5UJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnb1RvQXV0aCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgJ0lERUFfQVVUSC5CQUNLX1RPX1NJR05fSU4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgPC9mb3JtPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlVXJsczogWydhdXRoLnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJREVBTmV3UGFzc3dvcmRQYWdlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvdGVjdGVkIF9lbnYgPSBpbmplY3QoSURFQUVudmlyb25tZW50KTtcbiAgcHJpdmF0ZSBfbmF2ID0gaW5qZWN0KE5hdkNvbnRyb2xsZXIpO1xuICBwcml2YXRlIF9wb3BvdmVyID0gaW5qZWN0KFBvcG92ZXJDb250cm9sbGVyKTtcbiAgcHJpdmF0ZSBfbWVzc2FnZSA9IGluamVjdChJREVBTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIF9sb2FkaW5nID0gaW5qZWN0KElERUFMb2FkaW5nU2VydmljZSk7XG4gIHByaXZhdGUgX3RyYW5zbGF0ZSA9IGluamVjdChJREVBVHJhbnNsYXRpb25zU2VydmljZSk7XG4gIF9hdXRoID0gaW5qZWN0KElERUFBdXRoU2VydmljZSk7XG5cbiAgbmV3UGFzc3dvcmQ6IHN0cmluZztcbiAgcGFzc3dvcmRQb2xpY3k6IGFueTtcbiAgZXJyb3JNc2c6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBhc3N3b3JkUG9saWN5ID0gdGhpcy5fZW52LmlkZWEuYXV0aC5wYXNzd29yZFBvbGljeTtcbiAgfVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2F1dGguY2hhbGxlbmdlVXNlcm5hbWUpIHRoaXMuZ29Ub0F1dGgoKTtcbiAgfVxuXG4gIGFzeW5jIGNvbmZpcm1OZXdQYXNzd29yZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fbG9hZGluZy5zaG93KCk7XG4gICAgICB0aGlzLmVycm9yTXNnID0gbnVsbDtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuX2F1dGgudmFsaWRhdGVQYXNzd29yZEFnYWluc3RQb2xpY3kodGhpcy5uZXdQYXNzd29yZCk7XG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnBhc3N3b3JkUG9saWN5LmFkdmFuY2VkUGFzc3dvcmRDaGVjaylcbiAgICAgICAgZXJyb3JzLnB1c2goLi4uKGF3YWl0IHRoaXMuX2F1dGgudmFsaWRhdGVQYXNzd29yZEFnYWluc3REYXRhYmFzZXModGhpcy5uZXdQYXNzd29yZCkpKTtcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoKVxuICAgICAgICB0aGlzLmVycm9yTXNnID0gW1xuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZS5fKCdJREVBX0FVVEguUEFTU1dPUkRfUkVRVUlSRU1FTlRTX0ZPTExPVycpLFxuICAgICAgICAgIC4uLmVycm9ycy5tYXAoeCA9PlxuICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlLl8oJ0lERUFfQVVUSC5QQVNTV09SRF9SRVFVSVJFTUVOVFMuJy5jb25jYXQoeCksIHsgbjogdGhpcy5wYXNzd29yZFBvbGljeS5taW5MZW5ndGggfSlcbiAgICAgICAgICApXG4gICAgICAgIF0uam9pbignICcpO1xuICAgICAgaWYgKHRoaXMuZXJyb3JNc2cpIHJldHVybiB0aGlzLl9tZXNzYWdlLmVycm9yKCdJREVBX0FVVEguUEFTU1dPUkRfUkVRVUlSRU1FTlRTX0ZPTExPVycpO1xuICAgICAgYXdhaXQgdGhpcy5fYXV0aC5jb25maXJtTmV3UGFzc3dvcmQodGhpcy5uZXdQYXNzd29yZCk7XG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKCcnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5lcnJvck1zZyA9IChlcnJvciBhcyBhbnkpLm1lc3NhZ2U7XG4gICAgICB0aGlzLl9tZXNzYWdlLmVycm9yKCdJREVBX0FVVEguUEFTU1dPUkRfUkVRVUlSRU1FTlRTX0ZPTExPVycpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvcGVuUGFzc3dvcmRQb2xpY3koZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSAncGFzc3dvcmRQb2xpY3lQb3BvdmVyJztcbiAgICBjb25zdCBwb3BvdmVyID0gYXdhaXQgdGhpcy5fcG9wb3Zlci5jcmVhdGUoeyBjb21wb25lbnQ6IElERUFQYXNzd29yZFBvbGljeUNvbXBvbmVudCwgZXZlbnQsIGNzc0NsYXNzIH0pO1xuICAgIGF3YWl0IHBvcG92ZXIucHJlc2VudCgpO1xuICB9XG5cbiAgZ29Ub0F1dGgoKTogdm9pZCB7XG4gICAgdGhpcy5fbmF2Lm5hdmlnYXRlQmFjayhbJ2F1dGgnXSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { Component, inject } from '@angular/core';
|
|
2
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
3
|
-
import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonContent, IonImg } from '@ionic/angular/standalone';
|
|
4
|
-
import { IDEAEnvironment, IDEATranslatePipe } from '@idea-ionic/common';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class IDEAOktaPage {
|
|
7
|
-
constructor() {
|
|
8
|
-
this._route = inject(ActivatedRoute);
|
|
9
|
-
this._router = inject(Router);
|
|
10
|
-
this._env = inject(IDEAEnvironment);
|
|
11
|
-
this.go = false;
|
|
12
|
-
this.domain = this._env.aws.cognito.domain;
|
|
13
|
-
this.clientId = this._env.aws.cognito.userPoolClientId;
|
|
14
|
-
this.redirectURI = `${window.location.origin}${window.location.pathname}`; // Cognito client must include this callback
|
|
15
|
-
this.scope = 'email openid profile aws.cognito.signin.user.admin'; // Cognito client config must match
|
|
16
|
-
this.title = this._env.idea.auth.title;
|
|
17
|
-
this.darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
18
|
-
}
|
|
19
|
-
ionViewWillEnter() {
|
|
20
|
-
this.identityProvider = this._route.snapshot.queryParamMap.get('provider');
|
|
21
|
-
this.code = this._route.snapshot.queryParamMap.get('code');
|
|
22
|
-
this.go = !!this._route.snapshot.queryParamMap.get('go');
|
|
23
|
-
this._router.navigate([], { queryParams: {}, replaceUrl: true });
|
|
24
|
-
if (this.code)
|
|
25
|
-
this.endLogin();
|
|
26
|
-
else if (this.identityProvider && this.go)
|
|
27
|
-
this.startLogin();
|
|
28
|
-
}
|
|
29
|
-
startLogin() {
|
|
30
|
-
const url = `https://${this.domain}/oauth2/authorize`;
|
|
31
|
-
const params = new URLSearchParams();
|
|
32
|
-
params.append('identity_provider', this.identityProvider);
|
|
33
|
-
params.append('redirect_uri', this.redirectURI);
|
|
34
|
-
params.append('response_type', 'code');
|
|
35
|
-
params.append('client_id', this.clientId);
|
|
36
|
-
params.append('scope', this.scope);
|
|
37
|
-
window.location.assign(`${url}?${params.toString()}`);
|
|
38
|
-
}
|
|
39
|
-
async endLogin() {
|
|
40
|
-
const url = `https://${this.domain}/oauth2/token`;
|
|
41
|
-
const params = new URLSearchParams();
|
|
42
|
-
params.append('code', this.code);
|
|
43
|
-
params.append('grant_type', 'authorization_code');
|
|
44
|
-
params.append('redirect_uri', this.redirectURI);
|
|
45
|
-
params.append('client_id', this.clientId);
|
|
46
|
-
const headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
|
|
47
|
-
const response = await fetch(url, { method: 'POST', headers, body: params.toString() });
|
|
48
|
-
if (!response.ok)
|
|
49
|
-
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
50
|
-
const { id_token, access_token, refresh_token } = await response.json();
|
|
51
|
-
storeCognitoSession(id_token, access_token, refresh_token);
|
|
52
|
-
window.location.assign('');
|
|
53
|
-
}
|
|
54
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAOktaPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
55
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.9", type: IDEAOktaPage, isStandalone: true, selector: "okta", ngImport: i0, template: `
|
|
56
|
-
@if (!code && !go) {
|
|
57
|
-
<ion-content>
|
|
58
|
-
<div class="flexBox">
|
|
59
|
-
<ion-card class="authCard">
|
|
60
|
-
<ion-img
|
|
61
|
-
[title]="'IDEA_AUTH.SERVICE_LOGO' | translate"
|
|
62
|
-
[src]="darkMode ? 'assets/icons/icon-auth-alt.svg' : 'assets/icons/icon-auth.svg'"
|
|
63
|
-
/>
|
|
64
|
-
@if (title) {
|
|
65
|
-
<ion-card-header>
|
|
66
|
-
<ion-card-title color="primary">{{ title }}</ion-card-title>
|
|
67
|
-
</ion-card-header>
|
|
68
|
-
}
|
|
69
|
-
<ion-card-content>
|
|
70
|
-
@if (identityProvider) {
|
|
71
|
-
<ion-button expand="block" [title]="'IDEA_AUTH.SIGN_IN_HINT' | translate" (click)="startLogin()">
|
|
72
|
-
{{ 'IDEA_AUTH.SIGN_IN' | translate }}
|
|
73
|
-
</ion-button>
|
|
74
|
-
} @else {
|
|
75
|
-
<p testId="signin.error" class="errorBox">
|
|
76
|
-
<b>{{ 'IDEA_AUTH.UNKNOWN_PROVIDER' | translate }}.</b>
|
|
77
|
-
</p>
|
|
78
|
-
}
|
|
79
|
-
</ion-card-content>
|
|
80
|
-
</ion-card>
|
|
81
|
-
</div>
|
|
82
|
-
</ion-content>
|
|
83
|
-
}
|
|
84
|
-
`, isInline: true, styles: [".flexBox{background:var(--idea-auth-background-color, var(--ion-color-white-shade))}.authCard{min-width:400px;max-width:550px;margin:0 10px;padding:20px;background-color:var(--idea-auth-card-background-color, var(--ion-color-white));border:1px solid var(--idea-auth-card-border-color, var(--ion-color-light));border-radius:10px;box-shadow:none;text-align:center}.authCard ion-img{width:150px;display:block;margin:0 auto}.authCard ion-card-title{font-family:auth-title;font-size:3em}.authCard ion-card-subtitle{font-family:auth-title;font-size:1.2em}.authCard ion-card-content{padding-top:16px}.authCard ion-card-content .errorBox{padding-left:10px;margin-bottom:20px;text-align:left;border-left:2px solid var(--ion-color-danger)}.authCard ion-card-content ion-item{--ion-item-background: var(--idea-auth-card-background-color, var(--ion-color-white));--border-color: var(--idea-auth-card-border-color, var(--ion-color-light))}.authCard ion-card-content ion-label[position=inline] ion-icon{padding-top:4px;padding-right:5px;font-size:1.3em}.authCard ion-card-content .agreementsAcceptanceRow{margin-top:15px;font-size:.9em}.authCard ion-card-content .agreementsAcceptanceRow ion-checkbox{vertical-align:bottom;margin-right:3px}.authCard ion-card-content ion-button:not([slot=end]){margin-top:15px}.authCard ion-card-content .smallCaseButton{text-transform:none;letter-spacing:normal;font-size:1em}@media only screen and (max-width: 500px){.authCard{background-color:transparent;border:none}}.ideaLogo{width:65px;margin:40px auto 0;cursor:pointer}.passwordPolicyPopover{--width: 350px}\n"], dependencies: [{ kind: "pipe", type: IDEATranslatePipe, name: "translate" }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonImg, selector: "ion-img", inputs: ["alt", "src"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }] }); }
|
|
85
|
-
}
|
|
86
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAOktaPage, decorators: [{
|
|
87
|
-
type: Component,
|
|
88
|
-
args: [{ selector: 'okta', standalone: true, imports: [IDEATranslatePipe, IonContent, IonCard, IonImg, IonCardHeader, IonCardTitle, IonCardContent, IonButton], template: `
|
|
89
|
-
@if (!code && !go) {
|
|
90
|
-
<ion-content>
|
|
91
|
-
<div class="flexBox">
|
|
92
|
-
<ion-card class="authCard">
|
|
93
|
-
<ion-img
|
|
94
|
-
[title]="'IDEA_AUTH.SERVICE_LOGO' | translate"
|
|
95
|
-
[src]="darkMode ? 'assets/icons/icon-auth-alt.svg' : 'assets/icons/icon-auth.svg'"
|
|
96
|
-
/>
|
|
97
|
-
@if (title) {
|
|
98
|
-
<ion-card-header>
|
|
99
|
-
<ion-card-title color="primary">{{ title }}</ion-card-title>
|
|
100
|
-
</ion-card-header>
|
|
101
|
-
}
|
|
102
|
-
<ion-card-content>
|
|
103
|
-
@if (identityProvider) {
|
|
104
|
-
<ion-button expand="block" [title]="'IDEA_AUTH.SIGN_IN_HINT' | translate" (click)="startLogin()">
|
|
105
|
-
{{ 'IDEA_AUTH.SIGN_IN' | translate }}
|
|
106
|
-
</ion-button>
|
|
107
|
-
} @else {
|
|
108
|
-
<p testId="signin.error" class="errorBox">
|
|
109
|
-
<b>{{ 'IDEA_AUTH.UNKNOWN_PROVIDER' | translate }}.</b>
|
|
110
|
-
</p>
|
|
111
|
-
}
|
|
112
|
-
</ion-card-content>
|
|
113
|
-
</ion-card>
|
|
114
|
-
</div>
|
|
115
|
-
</ion-content>
|
|
116
|
-
}
|
|
117
|
-
`, styles: [".flexBox{background:var(--idea-auth-background-color, var(--ion-color-white-shade))}.authCard{min-width:400px;max-width:550px;margin:0 10px;padding:20px;background-color:var(--idea-auth-card-background-color, var(--ion-color-white));border:1px solid var(--idea-auth-card-border-color, var(--ion-color-light));border-radius:10px;box-shadow:none;text-align:center}.authCard ion-img{width:150px;display:block;margin:0 auto}.authCard ion-card-title{font-family:auth-title;font-size:3em}.authCard ion-card-subtitle{font-family:auth-title;font-size:1.2em}.authCard ion-card-content{padding-top:16px}.authCard ion-card-content .errorBox{padding-left:10px;margin-bottom:20px;text-align:left;border-left:2px solid var(--ion-color-danger)}.authCard ion-card-content ion-item{--ion-item-background: var(--idea-auth-card-background-color, var(--ion-color-white));--border-color: var(--idea-auth-card-border-color, var(--ion-color-light))}.authCard ion-card-content ion-label[position=inline] ion-icon{padding-top:4px;padding-right:5px;font-size:1.3em}.authCard ion-card-content .agreementsAcceptanceRow{margin-top:15px;font-size:.9em}.authCard ion-card-content .agreementsAcceptanceRow ion-checkbox{vertical-align:bottom;margin-right:3px}.authCard ion-card-content ion-button:not([slot=end]){margin-top:15px}.authCard ion-card-content .smallCaseButton{text-transform:none;letter-spacing:normal;font-size:1em}@media only screen and (max-width: 500px){.authCard{background-color:transparent;border:none}}.ideaLogo{width:65px;margin:40px auto 0;cursor:pointer}.passwordPolicyPopover{--width: 350px}\n"] }]
|
|
118
|
-
}] });
|
|
119
|
-
//
|
|
120
|
-
// HELPERS
|
|
121
|
-
//
|
|
122
|
-
/**
|
|
123
|
-
* Store the tokens and the info needed by Cognito's front-end lib to authenticate.
|
|
124
|
-
*/
|
|
125
|
-
const storeCognitoSession = (idToken, accessToken, refreshToken) => {
|
|
126
|
-
const { sub } = decodeJWTToken(idToken);
|
|
127
|
-
const { client_id } = decodeJWTToken(accessToken);
|
|
128
|
-
const prefix = `CognitoIdentityServiceProvider.${client_id}`;
|
|
129
|
-
window.localStorage.setItem(`${prefix}.LastAuthUser`, sub);
|
|
130
|
-
window.localStorage.setItem(`${prefix}.${sub}.accessToken`, accessToken);
|
|
131
|
-
window.localStorage.setItem(`${prefix}.${sub}.idToken`, idToken);
|
|
132
|
-
window.localStorage.setItem(`${prefix}.${sub}.refreshToken`, refreshToken);
|
|
133
|
-
};
|
|
134
|
-
/**
|
|
135
|
-
* Decode a JWT token and return its payload as a JSON object.
|
|
136
|
-
*/
|
|
137
|
-
const decodeJWTToken = (token) => {
|
|
138
|
-
if (!token)
|
|
139
|
-
return null;
|
|
140
|
-
try {
|
|
141
|
-
const base64Url = token.split('.')[1];
|
|
142
|
-
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
|
|
143
|
-
return JSON.parse(window.atob(base64));
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
console.error('Error decoding token:', error);
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2t0YS5wYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbW9kdWxlcy9hdXRoL3NyYy9va3RhLnBhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsU0FBUyxFQUNULE9BQU8sRUFDUCxjQUFjLEVBQ2QsYUFBYSxFQUNiLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNQLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQXNDeEUsTUFBTSxPQUFPLFlBQVk7SUFwQ3pCO1FBcUNVLFdBQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixTQUFJLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBSXZDLE9BQUUsR0FBRyxLQUFLLENBQUM7UUFFWCxXQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUN0QyxhQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQ2xELGdCQUFXLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsNENBQTRDO1FBQ2xILFVBQUssR0FBRyxvREFBb0QsQ0FBQyxDQUFDLG1DQUFtQztRQUVqRyxVQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtB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QyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxJQUFJLEdBQUcsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFhLEVBQU8sRUFBRTtJQUM1QyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hCLElBQUksQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBJb25CdXR0b24sXG4gIElvbkNhcmQsXG4gIElvbkNhcmRDb250ZW50LFxuICBJb25DYXJkSGVhZGVyLFxuICBJb25DYXJkVGl0bGUsXG4gIElvbkNvbnRlbnQsXG4gIElvbkltZ1xufSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IElERUFFbnZpcm9ubWVudCwgSURFQVRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAaWRlYS1pb25pYy9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdva3RhJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lERUFUcmFuc2xhdGVQaXBlLCBJb25Db250ZW50LCBJb25DYXJkLCBJb25JbWcsIElvbkNhcmRIZWFkZXIsIElvbkNhcmRUaXRsZSwgSW9uQ2FyZENvbnRlbnQsIElvbkJ1dHRvbl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmICghY29kZSAmJiAhZ28pIHtcbiAgICAgIDxpb24tY29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhCb3hcIj5cbiAgICAgICAgICA8aW9uLWNhcmQgY2xhc3M9XCJhdXRoQ2FyZFwiPlxuICAgICAgICAgICAgPGlvbi1pbWdcbiAgICAgICAgICAgICAgW3RpdGxlXT1cIidJREVBX0FVVEguU0VSVklDRV9MT0dPJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtzcmNdPVwiZGFya01vZGUgPyAnYXNzZXRzL2ljb25zL2ljb24tYXV0aC1hbHQuc3ZnJyA6ICdhc3NldHMvaWNvbnMvaWNvbi1hdXRoLnN2ZydcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIEBpZiAodGl0bGUpIHtcbiAgICAgICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGUgY29sb3I9XCJwcmltYXJ5XCI+e3sgdGl0bGUgfX08L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICBAaWYgKGlkZW50aXR5UHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBleHBhbmQ9XCJibG9ja1wiIFt0aXRsZV09XCInSURFQV9BVVRILlNJR05fSU5fSElOVCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwic3RhcnRMb2dpbigpXCI+XG4gICAgICAgICAgICAgICAgICB7eyAnSURFQV9BVVRILlNJR05fSU4nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8cCB0ZXN0SWQ9XCJzaWduaW4uZXJyb3JcIiBjbGFzcz1cImVycm9yQm94XCI+XG4gICAgICAgICAgICAgICAgICA8Yj57eyAnSURFQV9BVVRILlVOS05PV05fUFJPVklERVInIHwgdHJhbnNsYXRlIH19LjwvYj5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICAgICAgICA8L2lvbi1jYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvaW9uLWNvbnRlbnQ+XG4gICAgfVxuICBgLFxuICBzdHlsZVVybHM6IFsnYXV0aC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSURFQU9rdGFQYWdlIHtcbiAgcHJpdmF0ZSBfcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSBfZW52ID0gaW5qZWN0KElERUFFbnZpcm9ubWVudCk7XG5cbiAgaWRlbnRpdHlQcm92aWRlcjogc3RyaW5nO1xuICBjb2RlOiBzdHJpbmc7XG4gIGdvID0gZmFsc2U7XG5cbiAgZG9tYWluID0gdGhpcy5fZW52LmF3cy5jb2duaXRvLmRvbWFpbjtcbiAgY2xpZW50SWQgPSB0aGlzLl9lbnYuYXdzLmNvZ25pdG8udXNlclBvb2xDbGllbnRJZDtcbiAgcmVkaXJlY3RVUkkgPSBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufSR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfWA7IC8vIENvZ25pdG8gY2xpZW50IG11c3QgaW5jbHVkZSB0aGlzIGNhbGxiYWNrXG4gIHNjb3BlID0gJ2VtYWlsIG9wZW5pZCBwcm9maWxlIGF3cy5jb2duaXRvLnNpZ25pbi51c2VyLmFkbWluJzsgLy8gQ29nbml0byBjbGllbnQgY29uZmlnIG11c3QgbWF0Y2hcblxuICB0aXRsZSA9IHRoaXMuX2Vudi5pZGVhLmF1dGgudGl0bGU7XG4gIGRhcmtNb2RlID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuXG4gIGlvblZpZXdXaWxsRW50ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pZGVudGl0eVByb3ZpZGVyID0gdGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3Byb3ZpZGVyJyk7XG4gICAgdGhpcy5jb2RlID0gdGhpcy5fcm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2NvZGUnKTtcbiAgICB0aGlzLmdvID0gISF0aGlzLl9yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnZ28nKTtcbiAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHsgcXVlcnlQYXJhbXM6IHt9LCByZXBsYWNlVXJsOiB0cnVlIH0pO1xuICAgIGlmICh0aGlzLmNvZGUpIHRoaXMuZW5kTG9naW4oKTtcbiAgICBlbHNlIGlmICh0aGlzLmlkZW50aXR5UHJvdmlkZXIgJiYgdGhpcy5nbykgdGhpcy5zdGFydExvZ2luKCk7XG4gIH1cblxuICBzdGFydExvZ2luKCk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IGBodHRwczovLyR7dGhpcy5kb21haW59L29hdXRoMi9hdXRob3JpemVgO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdpZGVudGl0eV9wcm92aWRlcicsIHRoaXMuaWRlbnRpdHlQcm92aWRlcik7XG4gICAgcGFyYW1zLmFwcGVuZCgncmVkaXJlY3RfdXJpJywgdGhpcy5yZWRpcmVjdFVSSSk7XG4gICAgcGFyYW1zLmFwcGVuZCgncmVzcG9uc2VfdHlwZScsICdjb2RlJyk7XG4gICAgcGFyYW1zLmFwcGVuZCgnY2xpZW50X2lkJywgdGhpcy5jbGllbnRJZCk7XG4gICAgcGFyYW1zLmFwcGVuZCgnc2NvcGUnLCB0aGlzLnNjb3BlKTtcblxuICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oYCR7dXJsfT8ke3BhcmFtcy50b1N0cmluZygpfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbmRMb2dpbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly8ke3RoaXMuZG9tYWlufS9vYXV0aDIvdG9rZW5gO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdjb2RlJywgdGhpcy5jb2RlKTtcbiAgICBwYXJhbXMuYXBwZW5kKCdncmFudF90eXBlJywgJ2F1dGhvcml6YXRpb25fY29kZScpO1xuICAgIHBhcmFtcy5hcHBlbmQoJ3JlZGlyZWN0X3VyaScsIHRoaXMucmVkaXJlY3RVUkkpO1xuICAgIHBhcmFtcy5hcHBlbmQoJ2NsaWVudF9pZCcsIHRoaXMuY2xpZW50SWQpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnMsIGJvZHk6IHBhcmFtcy50b1N0cmluZygpIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgU3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICBjb25zdCB7IGlkX3Rva2VuLCBhY2Nlc3NfdG9rZW4sIHJlZnJlc2hfdG9rZW4gfSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgIHN0b3JlQ29nbml0b1Nlc3Npb24oaWRfdG9rZW4sIGFjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbik7XG4gICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbignJyk7XG4gIH1cbn1cblxuLy9cbi8vIEhFTFBFUlNcbi8vXG5cbi8qKlxuICogU3RvcmUgdGhlIHRva2VucyBhbmQgdGhlIGluZm8gbmVlZGVkIGJ5IENvZ25pdG8ncyBmcm9udC1lbmQgbGliIHRvIGF1dGhlbnRpY2F0ZS5cbiAqL1xuY29uc3Qgc3RvcmVDb2duaXRvU2Vzc2lvbiA9IChpZFRva2VuOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKTogdm9pZCA9PiB7XG4gIGNvbnN0IHsgc3ViIH0gPSBkZWNvZGVKV1RUb2tlbihpZFRva2VuKTtcbiAgY29uc3QgeyBjbGllbnRfaWQgfSA9IGRlY29kZUpXVFRva2VuKGFjY2Vzc1Rva2VuKTtcbiAgY29uc3QgcHJlZml4ID0gYENvZ25pdG9JZGVudGl0eVNlcnZpY2VQcm92aWRlci4ke2NsaWVudF9pZH1gO1xuICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYCR7cHJlZml4fS5MYXN0QXV0aFVzZXJgLCBzdWIpO1xuICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYCR7cHJlZml4fS4ke3N1Yn0uYWNjZXNzVG9rZW5gLCBhY2Nlc3NUb2tlbik7XG4gIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHtwcmVmaXh9LiR7c3VifS5pZFRva2VuYCwgaWRUb2tlbik7XG4gIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHtwcmVmaXh9LiR7c3VifS5yZWZyZXNoVG9rZW5gLCByZWZyZXNoVG9rZW4pO1xufTtcblxuLyoqXG4gKiBEZWNvZGUgYSBKV1QgdG9rZW4gYW5kIHJldHVybiBpdHMgcGF5bG9hZCBhcyBhIEpTT04gb2JqZWN0LlxuICovXG5jb25zdCBkZWNvZGVKV1RUb2tlbiA9ICh0b2tlbjogc3RyaW5nKTogYW55ID0+IHtcbiAgaWYgKCF0b2tlbikgcmV0dXJuIG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgYmFzZTY0VXJsID0gdG9rZW4uc3BsaXQoJy4nKVsxXTtcbiAgICBjb25zdCBiYXNlNjQgPSBiYXNlNjRVcmwucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh3aW5kb3cuYXRvYihiYXNlNjQpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkZWNvZGluZyB0b2tlbjonLCBlcnJvcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG4iXX0=
|