@igo2/auth 16.0.2 → 16.1.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 (41) hide show
  1. package/esm2022/lib/auth-form/auth-facebook.component.mjs +9 -11
  2. package/esm2022/lib/auth-form/auth-form.component.mjs +21 -148
  3. package/esm2022/lib/auth-form/auth-google.component.mjs +9 -11
  4. package/esm2022/lib/auth-form/auth-intern.component.mjs +11 -75
  5. package/esm2022/lib/auth-form/auth-microsoft.component.mjs +12 -22
  6. package/esm2022/lib/auth-form/auth-microsoftb2c.component.mjs +12 -22
  7. package/esm2022/lib/auth-monitoring/auth-monitoring.provider.mjs +23 -0
  8. package/esm2022/lib/auth-monitoring/auth-monitoring.service.mjs +53 -0
  9. package/esm2022/lib/auth-routing.module.mjs +12 -13
  10. package/esm2022/lib/auth.module.mjs +43 -44
  11. package/esm2022/lib/shared/admin.guard.mjs +10 -11
  12. package/esm2022/lib/shared/auth-msalBroadcastServiceb2c.service.mjs +9 -9
  13. package/esm2022/lib/shared/auth-msalServiceb2c.service..mjs +9 -9
  14. package/esm2022/lib/shared/auth-storage.interface.mjs +2 -0
  15. package/esm2022/lib/shared/auth-storage.service.mjs +99 -0
  16. package/esm2022/lib/shared/auth.guard.mjs +9 -9
  17. package/esm2022/lib/shared/auth.interceptor.mjs +10 -13
  18. package/esm2022/lib/shared/auth.interface.mjs +1 -1
  19. package/esm2022/lib/shared/auth.service.mjs +18 -14
  20. package/esm2022/lib/shared/index.mjs +4 -3
  21. package/esm2022/lib/shared/logged.guard.mjs +9 -9
  22. package/esm2022/lib/shared/profils.guard.mjs +9 -9
  23. package/esm2022/lib/shared/protected.directive.mjs +9 -9
  24. package/esm2022/lib/shared/token.interface.mjs +2 -0
  25. package/esm2022/lib/shared/token.service.mjs +10 -10
  26. package/esm2022/public_api.mjs +6 -3
  27. package/fesm2022/igo2-auth.mjs +291 -441
  28. package/fesm2022/igo2-auth.mjs.map +1 -1
  29. package/lib/auth-monitoring/auth-monitoring.provider.d.ts +3 -0
  30. package/lib/auth-monitoring/auth-monitoring.service.d.ts +14 -0
  31. package/lib/shared/{storage.service.d.ts → auth-storage.service.d.ts} +1 -1
  32. package/lib/shared/auth.interface.d.ts +3 -5
  33. package/lib/shared/auth.service.d.ts +3 -1
  34. package/lib/shared/index.d.ts +3 -2
  35. package/lib/shared/token.interface.d.ts +5 -0
  36. package/lib/shared/token.service.d.ts +2 -1
  37. package/package.json +20 -22
  38. package/public_api.d.ts +5 -2
  39. package/esm2022/lib/shared/storage.interface.mjs +0 -2
  40. package/esm2022/lib/shared/storage.service.mjs +0 -99
  41. /package/lib/shared/{storage.interface.d.ts → auth-storage.interface.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
2
  import { BaseStorage, ConfigService, StorageScope } from '@igo2/core';
3
3
  import { AuthService } from './auth.service';
4
- import { AuthStorageOptions } from './storage.interface';
4
+ import { AuthStorageOptions } from './auth-storage.interface';
5
5
  import { TokenService } from './token.service';
6
6
  import * as i0 from "@angular/core";
7
7
  export declare class AuthStorageService extends BaseStorage<AuthStorageOptions> {
@@ -1,3 +1,4 @@
1
+ import { BaseUser } from '@igo2/core';
1
2
  import { MsalGuardConfiguration } from '@azure/msal-angular';
2
3
  import { BrowserAuthOptions } from '@azure/msal-browser';
3
4
  export interface AuthInternOptions {
@@ -80,15 +81,12 @@ export interface MSPMsalGuardConfiguration extends MsalGuardConfiguration {
80
81
  export interface MSPMsalGuardConfiguration extends MsalGuardConfiguration {
81
82
  type: string;
82
83
  }
83
- export interface User {
84
+ export interface User extends BaseUser {
84
85
  source?: string;
85
86
  sourceId?: string;
86
- email?: string;
87
- firstName?: string;
88
- lastName?: string;
89
87
  locale?: string;
90
88
  isExpired?: boolean;
91
- admin?: boolean;
89
+ isAdmin?: boolean;
92
90
  defaultContextId?: string;
93
91
  }
94
92
  export interface IInfosUser {
@@ -3,6 +3,7 @@ import { Router } from '@angular/router';
3
3
  import { ConfigService, LanguageService, MessageService } from '@igo2/core';
4
4
  import { BehaviorSubject, Observable } from 'rxjs';
5
5
  import { IInfosUser, User } from './auth.interface';
6
+ import { IgoJwtPayload } from './token.interface';
6
7
  import { TokenService } from './token.service';
7
8
  import * as i0 from "@angular/core";
8
9
  export declare class AuthService {
@@ -19,6 +20,7 @@ export declare class AuthService {
19
20
  private anonymous;
20
21
  private authOptions;
21
22
  get hasAuthService(): boolean;
23
+ get user(): User | null;
22
24
  constructor(http: HttpClient, tokenService: TokenService, config: ConfigService, languageService: LanguageService, messageService: MessageService, router: Router);
23
25
  login(username: string, password: string): Observable<void>;
24
26
  loginWithToken(token: string, type: string, infosUser?: IInfosUser): Observable<void>;
@@ -27,7 +29,7 @@ export declare class AuthService {
27
29
  logout(): Observable<boolean>;
28
30
  isAuthenticated(): boolean;
29
31
  getToken(): string;
30
- decodeToken(): any;
32
+ decodeToken(): IgoJwtPayload | null;
31
33
  goToRedirectUrl(): void;
32
34
  getUserInfo(): Observable<User>;
33
35
  getProfils(): Observable<{
@@ -1,4 +1,5 @@
1
1
  export * from './token.service';
2
+ export * from './token.interface';
2
3
  export * from './auth.service';
3
4
  export * from './auth.interface';
4
5
  export * from './auth.interceptor';
@@ -8,5 +9,5 @@ export * from './auth.guard';
8
9
  export * from './admin.guard';
9
10
  export * from './profils.guard';
10
11
  export * from './protected.directive';
11
- export * from './storage.interface';
12
- export * from './storage.service';
12
+ export * from './auth-storage.interface';
13
+ export * from './auth-storage.service';
@@ -0,0 +1,5 @@
1
+ import { JwtPayload } from 'jwt-decode';
2
+ import { User } from './auth.interface';
3
+ export interface IgoJwtPayload extends JwtPayload {
4
+ user: User;
5
+ }
@@ -1,4 +1,5 @@
1
1
  import { Injector } from '@angular/core';
2
+ import { IgoJwtPayload } from './token.interface';
2
3
  import * as i0 from "@angular/core";
3
4
  export declare class TokenService {
4
5
  private injector;
@@ -8,7 +9,7 @@ export declare class TokenService {
8
9
  set(token: string): void;
9
10
  remove(): void;
10
11
  get(): string;
11
- decode(): any;
12
+ decode(): IgoJwtPayload | null;
12
13
  isExpired(): boolean;
13
14
  static ɵfac: i0.ɵɵFactoryDeclaration<TokenService, never>;
14
15
  static ɵprov: i0.ɵɵInjectableDeclaration<TokenService>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igo2/auth",
3
- "version": "16.0.2",
3
+ "version": "16.1.0",
4
4
  "description": "IGO Library",
5
5
  "author": "IGO Community",
6
6
  "keywords": [
@@ -15,8 +15,19 @@
15
15
  "bugs": {
16
16
  "url": "https://github.com/infra-geo-ouverte/igo2-lib/issues"
17
17
  },
18
+ "exports": {
19
+ ".": {
20
+ "types": "./index.d.ts",
21
+ "esm2022": "./esm2022/igo2-auth.mjs",
22
+ "esm": "./esm2022/igo2-auth.mjs",
23
+ "default": "./fesm2022/igo2-auth.mjs"
24
+ },
25
+ "./package.json": {
26
+ "default": "./package.json"
27
+ }
28
+ },
18
29
  "dependencies": {
19
- "jwt-decode": "^2.2.0",
30
+ "jwt-decode": "^4.0.0",
20
31
  "ts-cacheable": "^1.0.6",
21
32
  "ts-md5": "^1.3.0",
22
33
  "tslib": "^2.6.0"
@@ -28,29 +39,16 @@
28
39
  "@angular/forms": "^16.2.5",
29
40
  "@angular/material": "^16.2.4",
30
41
  "@angular/router": "^16.2.5",
31
- "@igo2/core": "^16.0.2",
32
- "@igo2/utils": "^16.0.2",
33
- "rxjs": "^7.5.6",
34
- "@azure/msal-angular": "^3.0.4"
42
+ "@azure/msal-angular": "^3.0.4",
43
+ "@azure/msal-browser": "^3.0.4",
44
+ "@igo2/core": "^16.1.0",
45
+ "@igo2/utils": "^16.1.0",
46
+ "rxjs": "^7.8.0"
35
47
  },
36
48
  "engines": {
37
49
  "node": ">=18.10.0"
38
50
  },
39
51
  "module": "fesm2022/igo2-auth.mjs",
40
52
  "typings": "index.d.ts",
41
- "exports": {
42
- "./package.json": {
43
- "default": "./package.json"
44
- },
45
- ".": {
46
- "types": "./index.d.ts",
47
- "esm2022": "./esm2022/igo2-auth.mjs",
48
- "esm": "./esm2022/igo2-auth.mjs",
49
- "default": "./fesm2022/igo2-auth.mjs"
50
- }
51
- },
52
- "sideEffects": false,
53
- "scripts": {
54
-
55
- }
56
- }
53
+ "sideEffects": false
54
+ }
package/public_api.d.ts CHANGED
@@ -9,8 +9,11 @@ export * from './lib/shared/auth.interceptor';
9
9
  export * from './lib/shared/auth.interface';
10
10
  export * from './lib/shared/auth-microsoft.provider';
11
11
  export * from './lib/shared/protected.directive';
12
+ export * from './lib/shared/token.interface';
12
13
  export * from './lib/shared/token.service';
13
- export * from './lib/shared/storage.interface';
14
- export * from './lib/shared/storage.service';
14
+ export * from './lib/shared/auth-storage.interface';
15
+ export * from './lib/shared/auth-storage.service';
16
+ export * from './lib/auth-monitoring/auth-monitoring.provider';
17
+ export * from './lib/auth-monitoring/auth-monitoring.service';
15
18
  export * from './lib/auth-routing.module';
16
19
  export * from './lib/auth.module';
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hdXRoL3NyYy9saWIvc2hhcmVkL3N0b3JhZ2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdG9yYWdlT3B0aW9ucyB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdXRoU3RvcmFnZU9wdGlvbnMgZXh0ZW5kcyBTdG9yYWdlT3B0aW9ucyB7XHJcbiAgdXJsOiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -1,99 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Injectable } from '@angular/core';
3
- import { BaseStorage, ConfigService, StorageScope } from '@igo2/core';
4
- import { AuthService } from './auth.service';
5
- import { TokenService } from './token.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@igo2/core";
8
- import * as i2 from "@angular/common/http";
9
- import * as i3 from "./auth.service";
10
- import * as i4 from "./token.service";
11
- export class AuthStorageService extends BaseStorage {
12
- http;
13
- authService;
14
- tokenService;
15
- constructor(config, http, authService, tokenService) {
16
- super(config);
17
- this.http = http;
18
- this.authService = authService;
19
- this.tokenService = tokenService;
20
- this.authService.authenticate$.subscribe((isAuthenticated) => {
21
- if (isAuthenticated && this.options.url) {
22
- this.http
23
- .get(this.options.url)
24
- .subscribe((userIgo) => {
25
- if (userIgo && userIgo.preference) {
26
- for (const key of Object.keys(userIgo.preference)) {
27
- const value = userIgo.preference[key];
28
- super.set(key, value);
29
- }
30
- }
31
- });
32
- }
33
- });
34
- }
35
- set(key, value, scope = StorageScope.LOCAL) {
36
- if (scope === StorageScope.LOCAL &&
37
- this.authService.authenticated &&
38
- this.options.url) {
39
- const preference = {};
40
- preference[key] = value;
41
- this.http.patch(this.options.url, { preference }).subscribe();
42
- }
43
- super.set(key, value, scope);
44
- }
45
- remove(key, scope = StorageScope.LOCAL) {
46
- if (scope === StorageScope.LOCAL &&
47
- this.authService.authenticated &&
48
- this.options.url) {
49
- const preference = {};
50
- preference[key] = undefined;
51
- this.http.patch(this.options.url, { preference }).subscribe();
52
- }
53
- super.remove(key, scope);
54
- }
55
- clear(scope = StorageScope.LOCAL) {
56
- if (scope === StorageScope.LOCAL &&
57
- this.authService.authenticated &&
58
- this.options.url) {
59
- this.http
60
- .patch(this.options.url, { preference: {} }, {
61
- params: {
62
- mergePreference: 'false'
63
- }
64
- })
65
- .subscribe();
66
- }
67
- let token;
68
- if (scope === StorageScope.LOCAL) {
69
- token = this.tokenService.get();
70
- }
71
- super.clear(scope);
72
- if (token) {
73
- this.tokenService.set(token);
74
- }
75
- if (scope === StorageScope.LOCAL &&
76
- this.authService.authenticated &&
77
- this.options.url) {
78
- this.http
79
- .get(this.options.url)
80
- .subscribe((userIgo) => {
81
- if (userIgo && userIgo.preference) {
82
- for (const key of Object.keys(userIgo.preference)) {
83
- const value = userIgo.preference[key];
84
- super.set(key, value);
85
- }
86
- }
87
- });
88
- }
89
- }
90
- static ɵfac = function AuthStorageService_Factory(t) { return new (t || AuthStorageService)(i0.ɵɵinject(i1.ConfigService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.AuthService), i0.ɵɵinject(i4.TokenService)); };
91
- static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthStorageService, factory: AuthStorageService.ɵfac, providedIn: 'root' });
92
- }
93
- (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthStorageService, [{
94
- type: Injectable,
95
- args: [{
96
- providedIn: 'root'
97
- }]
98
- }], function () { return [{ type: i1.ConfigService }, { type: i2.HttpClient }, { type: i3.AuthService }, { type: i4.TokenService }]; }, null); })();
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXV0aC9zcmMvbGliL3NoYXJlZC9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQUsvQyxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsV0FBK0I7SUFHM0Q7SUFDQTtJQUNBO0lBSlYsWUFDRSxNQUFxQixFQUNiLElBQWdCLEVBQ2hCLFdBQXdCLEVBQ3hCLFlBQTBCO1FBRWxDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUpOLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFJbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDM0QsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJO3FCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztxQkFDckIsU0FBUyxDQUFDLENBQUMsT0FBK0IsRUFBRSxFQUFFO29CQUM3QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO3dCQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0s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LE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUNqRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDdkI7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQzs0RUFyR1Usa0JBQWtCO2dFQUFsQixrQkFBa0IsV0FBbEIsa0JBQWtCLG1CQUZqQixNQUFNOzt1RkFFUCxrQkFBa0I7Y0FIOUIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgQmFzZVN0b3JhZ2UsIENvbmZpZ1NlcnZpY2UsIFN0b3JhZ2VTY29wZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTdG9yYWdlT3B0aW9ucyB9IGZyb20gJy4vc3RvcmFnZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aFN0b3JhZ2VTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JhZ2U8QXV0aFN0b3JhZ2VPcHRpb25zPiB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb25maWc6IENvbmZpZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2VcclxuICApIHtcclxuICAgIHN1cGVyKGNvbmZpZyk7XHJcblxyXG4gICAgdGhpcy5hdXRoU2VydmljZS5hdXRoZW50aWNhdGUkLnN1YnNjcmliZSgoaXNBdXRoZW50aWNhdGVkKSA9PiB7XHJcbiAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQgJiYgdGhpcy5vcHRpb25zLnVybCkge1xyXG4gICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgLmdldCh0aGlzLm9wdGlvbnMudXJsKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgodXNlcklnbzogeyBwcmVmZXJlbmNlOiBvYmplY3QgfSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXNlcklnbyAmJiB1c2VySWdvLnByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh1c2VySWdvLnByZWZlcmVuY2UpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHVzZXJJZ28ucHJlZmVyZW5jZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0KFxyXG4gICAga2V5OiBzdHJpbmcsXHJcbiAgICB2YWx1ZTogc3RyaW5nIHwgb2JqZWN0IHwgYm9vbGVhbiB8IG51bWJlcixcclxuICAgIHNjb3BlOiBTdG9yYWdlU2NvcGUgPSBTdG9yYWdlU2NvcGUuTE9DQUxcclxuICApIHtcclxuICAgIGlmIChcclxuICAgICAgc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCAmJlxyXG4gICAgICB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZWQgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLnVybFxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IHByZWZlcmVuY2UgPSB7fTtcclxuICAgICAgcHJlZmVyZW5jZVtrZXldID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuaHR0cC5wYXRjaCh0aGlzLm9wdGlvbnMudXJsLCB7IHByZWZlcmVuY2UgfSkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBzdXBlci5zZXQoa2V5LCB2YWx1ZSwgc2NvcGUpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlKGtleTogc3RyaW5nLCBzY29wZTogU3RvcmFnZVNjb3BlID0gU3RvcmFnZVNjb3BlLkxPQ0FMKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHNjb3BlID09PSBTdG9yYWdlU2NvcGUuTE9DQUwgJiZcclxuICAgICAgdGhpcy5hdXRoU2VydmljZS5hdXRoZW50aWNhdGVkICYmXHJcbiAgICAgIHRoaXMub3B0aW9ucy51cmxcclxuICAgICkge1xyXG4gICAgICBjb25zdCBwcmVmZXJlbmNlID0ge307XHJcbiAgICAgIHByZWZlcmVuY2Vba2V5XSA9IHVuZGVmaW5lZDtcclxuICAgICAgdGhpcy5odHRwLnBhdGNoKHRoaXMub3B0aW9ucy51cmwsIHsgcHJlZmVyZW5jZSB9KS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIHN1cGVyLnJlbW92ZShrZXksIHNjb3BlKTtcclxuICB9XHJcblxyXG4gIGNsZWFyKHNjb3BlOiBTdG9yYWdlU2NvcGUgPSBTdG9yYWdlU2NvcGUuTE9DQUwpIHtcclxuICAgIGlmIChcclxuICAgICAgc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCAmJlxyXG4gICAgICB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZWQgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLnVybFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgIC5wYXRjaChcclxuICAgICAgICAgIHRoaXMub3B0aW9ucy51cmwsXHJcbiAgICAgICAgICB7IHByZWZlcmVuY2U6IHt9IH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICAgIG1lcmdlUHJlZmVyZW5jZTogJ2ZhbHNlJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdG9rZW46IHN0cmluZztcclxuICAgIGlmIChzY29wZSA9PT0gU3RvcmFnZVNjb3BlLkxPQ0FMKSB7XHJcbiAgICAgIHRva2VuID0gdGhpcy50b2tlblNlcnZpY2UuZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3VwZXIuY2xlYXIoc2NvcGUpO1xyXG5cclxuICAgIGlmICh0b2tlbikge1xyXG4gICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQodG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCAmJlxyXG4gICAgICB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZWQgJiZcclxuICAgICAgdGhpcy5vcHRpb25zLnVybFxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgIC5nZXQodGhpcy5vcHRpb25zLnVybClcclxuICAgICAgICAuc3Vic2NyaWJlKCh1c2VySWdvOiB7IHByZWZlcmVuY2U6IG9iamVjdCB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAodXNlcklnbyAmJiB1c2VySWdvLnByZWZlcmVuY2UpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModXNlcklnby5wcmVmZXJlbmNlKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXNlcklnby5wcmVmZXJlbmNlW2tleV07XHJcbiAgICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==