@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.
Files changed (37) hide show
  1. package/fesm2022/idea-ionic-auth.mjs +52 -52
  2. package/fesm2022/idea-ionic-auth.mjs.map +1 -1
  3. package/index.d.ts +358 -3
  4. package/package.json +14 -16
  5. package/esm2022/idea-ionic-auth.mjs +0 -5
  6. package/esm2022/public-api.mjs +0 -15
  7. package/esm2022/src/auth.routes.mjs +0 -22
  8. package/esm2022/src/auth.service.mjs +0 -521
  9. package/esm2022/src/commonPasswords.model.mjs +0 -1003
  10. package/esm2022/src/confirmPassword.page.mjs +0 -309
  11. package/esm2022/src/forgotPassword.page.mjs +0 -178
  12. package/esm2022/src/mfaChallenge.page.mjs +0 -163
  13. package/esm2022/src/newPassword.page.mjs +0 -210
  14. package/esm2022/src/okta.page.mjs +0 -150
  15. package/esm2022/src/passwordPolicy.component.mjs +0 -80
  16. package/esm2022/src/resendLink.page.mjs +0 -176
  17. package/esm2022/src/setupMFA/setupMFAButton.component.mjs +0 -60
  18. package/esm2022/src/setupMFA/setupMFAModal.component.mjs +0 -176
  19. package/esm2022/src/setupMFA.page.mjs +0 -83
  20. package/esm2022/src/signIn.page.mjs +0 -498
  21. package/esm2022/src/signUp.page.mjs +0 -376
  22. package/public-api.d.ts +0 -14
  23. package/src/auth.routes.d.ts +0 -2
  24. package/src/auth.service.d.ts +0 -152
  25. package/src/commonPasswords.model.d.ts +0 -1
  26. package/src/confirmPassword.page.d.ts +0 -26
  27. package/src/forgotPassword.page.d.ts +0 -13
  28. package/src/mfaChallenge.page.d.ts +0 -16
  29. package/src/newPassword.page.d.ts +0 -22
  30. package/src/okta.page.d.ts +0 -20
  31. package/src/passwordPolicy.component.d.ts +0 -8
  32. package/src/resendLink.page.d.ts +0 -14
  33. package/src/setupMFA/setupMFAButton.component.d.ts +0 -23
  34. package/src/setupMFA/setupMFAModal.component.d.ts +0 -16
  35. package/src/setupMFA.page.d.ts +0 -8
  36. package/src/signIn.page.d.ts +0 -36
  37. 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=