@igo2/auth 1.15.4 → 16.0.0-rc.1
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/{esm2020 → esm2022}/igo2-auth.mjs +4 -4
- package/esm2022/lib/auth-form/auth-facebook.component.mjs +67 -0
- package/esm2022/lib/auth-form/auth-form.component.mjs +286 -0
- package/esm2022/lib/auth-form/auth-google.component.mjs +108 -0
- package/esm2022/lib/auth-form/auth-intern.component.mjs +134 -0
- package/esm2022/lib/auth-form/auth-microsoft.component.mjs +107 -0
- package/esm2022/lib/auth-form/auth-microsoftb2c.component.mjs +105 -0
- package/{esm2020 → esm2022}/lib/auth-form/index.mjs +5 -5
- package/{esm2020 → esm2022}/lib/auth-routing.module.mjs +24 -24
- package/{esm2020 → esm2022}/lib/auth.module.mjs +91 -91
- package/esm2022/lib/shared/admin.guard.mjs +39 -0
- package/esm2022/lib/shared/auth-microsoft.provider.mjs +86 -0
- package/esm2022/lib/shared/auth-msalBroadcastServiceb2c.service.mjs +47 -0
- package/esm2022/lib/shared/auth-msalServiceb2c.service..mjs +85 -0
- package/esm2022/lib/shared/auth.guard.mjs +38 -0
- package/esm2022/lib/shared/auth.interceptor.mjs +164 -0
- package/esm2022/lib/shared/auth.interface.mjs +2 -0
- package/esm2022/lib/shared/auth.service.mjs +168 -0
- package/esm2022/lib/shared/logged.guard.mjs +38 -0
- package/esm2022/lib/shared/profils.guard.mjs +43 -0
- package/esm2022/lib/shared/protected.directive.mjs +20 -0
- package/{esm2020 → esm2022}/lib/shared/storage.interface.mjs +2 -2
- package/esm2022/lib/shared/storage.service.mjs +99 -0
- package/esm2022/lib/shared/token.service.mjs +48 -0
- package/{esm2020 → esm2022}/public_api.mjs +19 -19
- package/{fesm2020 → fesm2022}/igo2-auth.mjs +1573 -1477
- package/fesm2022/igo2-auth.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/auth-form/auth-facebook.component.d.ts +18 -18
- package/lib/auth-form/auth-form.component.d.ts +42 -42
- package/lib/auth-form/auth-google.component.d.ts +24 -24
- package/lib/auth-form/auth-intern.component.d.ts +21 -21
- package/lib/auth-form/auth-microsoft.component.d.ts +23 -23
- package/lib/auth-form/auth-microsoftb2c.component.d.ts +23 -23
- package/lib/auth-form/index.d.ts +4 -4
- package/lib/auth-routing.module.d.ts +7 -7
- package/lib/auth.module.d.ts +23 -23
- package/lib/shared/admin.guard.d.ts +13 -13
- package/lib/shared/auth-microsoft.provider.d.ts +30 -30
- package/lib/shared/auth-msalBroadcastServiceb2c.service.d.ts +15 -15
- package/lib/shared/auth-msalServiceb2c.service..d.ts +33 -33
- package/lib/shared/auth.guard.d.ts +13 -13
- package/lib/shared/auth.interceptor.d.ts +24 -24
- package/lib/shared/auth.interface.d.ts +99 -99
- package/lib/shared/auth.service.d.ts +44 -44
- package/lib/shared/logged.guard.d.ts +13 -13
- package/lib/shared/profils.guard.d.ts +13 -13
- package/lib/shared/protected.directive.d.ts +8 -8
- package/lib/shared/storage.interface.d.ts +4 -4
- package/lib/shared/storage.service.d.ts +17 -18
- package/lib/shared/token.service.d.ts +15 -15
- package/locale/en.auth.json +28 -0
- package/locale/fr.auth.json +32 -0
- package/package.json +18 -25
- package/public_api.d.ts +15 -15
- package/esm2020/lib/auth-form/auth-facebook.component.mjs +0 -61
- package/esm2020/lib/auth-form/auth-form.component.mjs +0 -277
- package/esm2020/lib/auth-form/auth-google.component.mjs +0 -99
- package/esm2020/lib/auth-form/auth-intern.component.mjs +0 -119
- package/esm2020/lib/auth-form/auth-microsoft.component.mjs +0 -94
- package/esm2020/lib/auth-form/auth-microsoftb2c.component.mjs +0 -93
- package/esm2020/lib/shared/admin.guard.mjs +0 -33
- package/esm2020/lib/shared/auth-microsoft.provider.mjs +0 -84
- package/esm2020/lib/shared/auth-msalBroadcastServiceb2c.service.mjs +0 -38
- package/esm2020/lib/shared/auth-msalServiceb2c.service..mjs +0 -80
- package/esm2020/lib/shared/auth.guard.mjs +0 -32
- package/esm2020/lib/shared/auth.interceptor.mjs +0 -155
- package/esm2020/lib/shared/auth.interface.mjs +0 -2
- package/esm2020/lib/shared/auth.service.mjs +0 -158
- package/esm2020/lib/shared/logged.guard.mjs +0 -32
- package/esm2020/lib/shared/profils.guard.mjs +0 -37
- package/esm2020/lib/shared/protected.directive.mjs +0 -19
- package/esm2020/lib/shared/storage.service.mjs +0 -91
- package/esm2020/lib/shared/token.service.mjs +0 -47
- package/fesm2015/igo2-auth.mjs +0 -1655
- package/fesm2015/igo2-auth.mjs.map +0 -1
- package/fesm2020/igo2-auth.mjs.map +0 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Md5 } from 'ts-md5';
|
|
4
|
+
import { ConfigService } from '@igo2/core';
|
|
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 "./token.service";
|
|
9
|
+
import * as i3 from "@angular/common/http";
|
|
10
|
+
export class AuthInterceptor {
|
|
11
|
+
config;
|
|
12
|
+
tokenService;
|
|
13
|
+
http;
|
|
14
|
+
refreshInProgress = false;
|
|
15
|
+
trustHosts;
|
|
16
|
+
hostsWithCredentials;
|
|
17
|
+
hostsWithAuthByKey;
|
|
18
|
+
constructor(config, tokenService, http) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.tokenService = tokenService;
|
|
21
|
+
this.http = http;
|
|
22
|
+
this.trustHosts = this.config.getConfig('auth.trustHosts') || [];
|
|
23
|
+
this.trustHosts.push(window.location.hostname);
|
|
24
|
+
this.hostsWithCredentials =
|
|
25
|
+
this.config.getConfig('auth.hostsWithCredentials') || [];
|
|
26
|
+
this.hostsWithAuthByKey = this.config.getConfig('auth.hostsByKey') || [];
|
|
27
|
+
}
|
|
28
|
+
intercept(originalReq, next) {
|
|
29
|
+
const withCredentials = this.handleHostsWithCredentials(originalReq.url);
|
|
30
|
+
let req = originalReq.clone();
|
|
31
|
+
const hostWithKey = this.handleHostsAuthByKey(originalReq.url);
|
|
32
|
+
if (hostWithKey) {
|
|
33
|
+
req = req.clone({
|
|
34
|
+
params: req.params.set(hostWithKey.key, hostWithKey.value)
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (withCredentials) {
|
|
38
|
+
req = originalReq.clone({
|
|
39
|
+
withCredentials
|
|
40
|
+
});
|
|
41
|
+
return next.handle(req);
|
|
42
|
+
}
|
|
43
|
+
this.refreshToken();
|
|
44
|
+
const token = this.tokenService.get();
|
|
45
|
+
const element = document.createElement('a');
|
|
46
|
+
element.href = req.url;
|
|
47
|
+
if (element.host === '') {
|
|
48
|
+
element.href = element.href; // FIX IE11, DO NOT REMOVE
|
|
49
|
+
}
|
|
50
|
+
if (!token || this.trustHosts.indexOf(element.hostname) === -1) {
|
|
51
|
+
return next.handle(req);
|
|
52
|
+
}
|
|
53
|
+
const authHeader = `Bearer ${token}`;
|
|
54
|
+
let authReq = req.clone({
|
|
55
|
+
headers: req.headers.set('Authorization', authHeader)
|
|
56
|
+
});
|
|
57
|
+
const tokenDecoded = this.tokenService.decode();
|
|
58
|
+
if (authReq.params.get('_i') === 'true' &&
|
|
59
|
+
tokenDecoded &&
|
|
60
|
+
tokenDecoded.user &&
|
|
61
|
+
tokenDecoded.user.sourceId) {
|
|
62
|
+
const hashUser = Md5.hashStr(tokenDecoded.user.sourceId);
|
|
63
|
+
authReq = authReq.clone({
|
|
64
|
+
params: authReq.params.set('_i', hashUser)
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else if (authReq.params.get('_i') === 'true') {
|
|
68
|
+
authReq = authReq.clone({
|
|
69
|
+
params: authReq.params.delete('_i')
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return next.handle(authReq);
|
|
73
|
+
}
|
|
74
|
+
interceptXhr(xhr, url) {
|
|
75
|
+
const withCredentials = this.handleHostsWithCredentials(url);
|
|
76
|
+
if (withCredentials) {
|
|
77
|
+
xhr.withCredentials = withCredentials;
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
this.refreshToken();
|
|
81
|
+
const element = document.createElement('a');
|
|
82
|
+
element.href = url;
|
|
83
|
+
const token = this.tokenService.get();
|
|
84
|
+
if (!token || this.trustHosts.indexOf(element.hostname) === -1) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
xhr.setRequestHeader('Authorization', 'Bearer ' + token);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
alterUrlWithKeyAuth(url) {
|
|
91
|
+
const hostWithKey = this.handleHostsAuthByKey(url);
|
|
92
|
+
let interceptedUrl = url;
|
|
93
|
+
if (hostWithKey) {
|
|
94
|
+
const urlDecomposed = interceptedUrl.split(/[?&]/);
|
|
95
|
+
let urlWithKeyAdded = urlDecomposed.shift();
|
|
96
|
+
const paramsToKeep = urlDecomposed.filter((p) => p.length !== 0);
|
|
97
|
+
paramsToKeep.push(`${hostWithKey.key}=${hostWithKey.value}`);
|
|
98
|
+
if (paramsToKeep.length) {
|
|
99
|
+
urlWithKeyAdded += '?' + paramsToKeep.join('&');
|
|
100
|
+
}
|
|
101
|
+
return urlWithKeyAdded;
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
handleHostsWithCredentials(reqUrl) {
|
|
106
|
+
let withCredentials = false;
|
|
107
|
+
for (const hostWithCredentials of this.hostsWithCredentials) {
|
|
108
|
+
const domainRegex = new RegExp(hostWithCredentials.domainRegFilters);
|
|
109
|
+
if (domainRegex.test(reqUrl)) {
|
|
110
|
+
withCredentials =
|
|
111
|
+
hostWithCredentials.withCredentials !== undefined
|
|
112
|
+
? hostWithCredentials.withCredentials
|
|
113
|
+
: undefined;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return withCredentials;
|
|
118
|
+
}
|
|
119
|
+
handleHostsAuthByKey(reqUrl) {
|
|
120
|
+
let hostWithKey;
|
|
121
|
+
for (const hostWithAuthByKey of this.hostsWithAuthByKey) {
|
|
122
|
+
const domainRegex = new RegExp(hostWithAuthByKey.domainRegFilters);
|
|
123
|
+
if (domainRegex.test(reqUrl)) {
|
|
124
|
+
var replace = `${hostWithAuthByKey.keyProperty}=${hostWithAuthByKey.keyValue}`;
|
|
125
|
+
var keyAdded = new RegExp(replace, 'gm');
|
|
126
|
+
if (!keyAdded.test(reqUrl)) {
|
|
127
|
+
hostWithKey = {
|
|
128
|
+
key: hostWithAuthByKey.keyProperty,
|
|
129
|
+
value: hostWithAuthByKey.keyValue
|
|
130
|
+
};
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return hostWithKey;
|
|
136
|
+
}
|
|
137
|
+
refreshToken() {
|
|
138
|
+
const jwt = this.tokenService.decode();
|
|
139
|
+
const currentTime = new Date().getTime() / 1000;
|
|
140
|
+
if (!this.refreshInProgress &&
|
|
141
|
+
jwt &&
|
|
142
|
+
currentTime < jwt.exp &&
|
|
143
|
+
currentTime > jwt.exp - 1800) {
|
|
144
|
+
this.refreshInProgress = true;
|
|
145
|
+
const url = this.config.getConfig('auth.url');
|
|
146
|
+
return this.http.post(`${url}/refresh`, {}).subscribe((data) => {
|
|
147
|
+
this.tokenService.set(data.token);
|
|
148
|
+
this.refreshInProgress = false;
|
|
149
|
+
}, (err) => {
|
|
150
|
+
err.error.caught = true;
|
|
151
|
+
return err;
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
static ɵfac = function AuthInterceptor_Factory(t) { return new (t || AuthInterceptor)(i0.ɵɵinject(i1.ConfigService), i0.ɵɵinject(i2.TokenService), i0.ɵɵinject(i3.HttpClient)); };
|
|
156
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthInterceptor, factory: AuthInterceptor.ɵfac, providedIn: 'root' });
|
|
157
|
+
}
|
|
158
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthInterceptor, [{
|
|
159
|
+
type: Injectable,
|
|
160
|
+
args: [{
|
|
161
|
+
providedIn: 'root'
|
|
162
|
+
}]
|
|
163
|
+
}], function () { return [{ type: i1.ConfigService }, { type: i2.TokenService }, { type: i3.HttpClient }]; }, null); })();
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvc3JjL2xpYi9zaGFyZWQvYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVFsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQU0vQyxNQUFNLE9BQU8sZUFBZTtJQU9oQjtJQUNBO0lBQ0E7SUFSRixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsVUFBVSxDQUFXO0lBQ3JCLG9CQUFvQixDQUEyQjtJQUMvQyxrQkFBa0IsQ0FBcUI7SUFFL0MsWUFDVSxNQUFxQixFQUNyQixZQUEwQixFQUMxQixJQUFnQjtRQUZoQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9DLElBQUksQ0FBQyxvQkFBb0I7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNFLENBQUM7SUFFRCxTQUFTLENBQ1AsV0FBNkIsRUFDN0IsSUFBaUI7UUFFakIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6RSxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDOUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRCxJQUFJLFdBQVcsRUFBRTtZQUNmLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUM7YUFDM0QsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLGVBQWUsRUFBRTtZQUNuQixHQUFHLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztnQkFDdEIsZUFBZTthQUNoQixDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUN2QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLDBCQUEwQjtTQUN4RDtRQUVELElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QjtRQUVELE1BQU0sVUFBVSxHQUFHLFVBQVUsS0FBSyxFQUFFLENBQUM7UUFDckMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUN0QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQztTQUN0RCxDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBUSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3JELElBQ0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssTUFBTTtZQUNuQyxZQUFZO1lBQ1osWUFBWSxDQUFDLElBQUk7WUFDakIsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQzFCO1lBQ0EsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBVyxDQUFDO1lBQ25FLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQzthQUMzQyxDQUFDLENBQUM7U0FDSjthQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssTUFBTSxFQUFFO1lBQzlDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ3BDLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQVc7UUFDM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELElBQUksZUFBZSxFQUFFO1lBQ25CLEdBQUcsQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUVuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUN6RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxHQUFXO1FBQzdCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRCxJQUFJLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDekIsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELElBQUksZUFBZSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pFLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdELElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDdkIsZUFBZSxJQUFJLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsT0FBTyxlQUFlLENBQUM7U0FDeEI7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUVPLDBCQUEwQixDQUFDLE1BQWM7UUFDL0MsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzVCLEtBQUssTUFBTSxtQkFBbUIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDM0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNyRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzVCLGVBQWU7b0JBQ2IsbUJBQW1CLENBQUMsZUFBZSxLQUFLLFNBQVM7d0JBQy9DLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlO3dCQUNyQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNoQixNQUFNO2FBQ1A7U0FDRjtRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxNQUFjO1FBQ3pDLElBQUksV0FBVyxDQUFDO1FBQ2hCLEtBQUssTUFBTSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdkQsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNuRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzVCLElBQUksT0FBTyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvRSxJQUFJLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUMxQixXQUFXLEdBQUc7d0JBQ1osR0FBRyxFQUFFLGlCQUFpQixDQUFDLFdBQVc7d0JBQ2xDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxRQUFRO3FCQUNsQyxDQUFDO29CQUNGLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBRWhELElBQ0UsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO1lBQ3ZCLEdBQUc7WUFDSCxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUc7WUFDckIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUM1QjtZQUNBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFFOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDbkQsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDakMsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ04sR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUMsQ0FDRixDQUFDO1NBQ0g7SUFDSCxDQUFDO3lFQXZLVSxlQUFlO2dFQUFmLGVBQWUsV0FBZixlQUFlLG1CQUZkLE1BQU07O3VGQUVQLGVBQWU7Y0FIM0IsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEh0dHBFdmVudCxcbiAgSHR0cEludGVyY2VwdG9yLFxuICBIdHRwSGFuZGxlcixcbiAgSHR0cFJlcXVlc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWQ1IH0gZnJvbSAndHMtbWQ1JztcblxuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhCeUtleU9wdGlvbnMsIFdpdGhDcmVkZW50aWFsc09wdGlvbnMgfSBmcm9tICcuL2F1dGguaW50ZXJmYWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgcHJpdmF0ZSByZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBwcml2YXRlIHRydXN0SG9zdHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGhvc3RzV2l0aENyZWRlbnRpYWxzOiBXaXRoQ3JlZGVudGlhbHNPcHRpb25zW107XG4gIHByaXZhdGUgaG9zdHNXaXRoQXV0aEJ5S2V5OiBBdXRoQnlLZXlPcHRpb25zW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnRcbiAgKSB7XG4gICAgdGhpcy50cnVzdEhvc3RzID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdhdXRoLnRydXN0SG9zdHMnKSB8fCBbXTtcbiAgICB0aGlzLnRydXN0SG9zdHMucHVzaCh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xuXG4gICAgdGhpcy5ob3N0c1dpdGhDcmVkZW50aWFscyA9XG4gICAgICB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ2F1dGguaG9zdHNXaXRoQ3JlZGVudGlhbHMnKSB8fCBbXTtcbiAgICB0aGlzLmhvc3RzV2l0aEF1dGhCeUtleSA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnYXV0aC5ob3N0c0J5S2V5JykgfHwgW107XG4gIH1cblxuICBpbnRlcmNlcHQoXG4gICAgb3JpZ2luYWxSZXE6IEh0dHBSZXF1ZXN0PGFueT4sXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xuICAgIGNvbnN0IHdpdGhDcmVkZW50aWFscyA9IHRoaXMuaGFuZGxlSG9zdHNXaXRoQ3JlZGVudGlhbHMob3JpZ2luYWxSZXEudXJsKTtcbiAgICBsZXQgcmVxID0gb3JpZ2luYWxSZXEuY2xvbmUoKTtcbiAgICBjb25zdCBob3N0V2l0aEtleSA9IHRoaXMuaGFuZGxlSG9zdHNBdXRoQnlLZXkob3JpZ2luYWxSZXEudXJsKTtcbiAgICBpZiAoaG9zdFdpdGhLZXkpIHtcbiAgICAgIHJlcSA9IHJlcS5jbG9uZSh7XG4gICAgICAgIHBhcmFtczogcmVxLnBhcmFtcy5zZXQoaG9zdFdpdGhLZXkua2V5LCBob3N0V2l0aEtleS52YWx1ZSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAod2l0aENyZWRlbnRpYWxzKSB7XG4gICAgICByZXEgPSBvcmlnaW5hbFJlcS5jbG9uZSh7XG4gICAgICAgIHdpdGhDcmVkZW50aWFsc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgZWxlbWVudC5ocmVmID0gcmVxLnVybDtcbiAgICBpZiAoZWxlbWVudC5ob3N0ID09PSAnJykge1xuICAgICAgZWxlbWVudC5ocmVmID0gZWxlbWVudC5ocmVmOyAvLyBGSVggSUUxMSwgRE8gTk9UIFJFTU9WRVxuICAgIH1cblxuICAgIGlmICghdG9rZW4gfHwgdGhpcy50cnVzdEhvc3RzLmluZGV4T2YoZWxlbWVudC5ob3N0bmFtZSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgICB9XG5cbiAgICBjb25zdCBhdXRoSGVhZGVyID0gYEJlYXJlciAke3Rva2VufWA7XG4gICAgbGV0IGF1dGhSZXEgPSByZXEuY2xvbmUoe1xuICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgYXV0aEhlYWRlcilcbiAgICB9KTtcblxuICAgIGNvbnN0IHRva2VuRGVjb2RlZDogYW55ID0gdGhpcy50b2tlblNlcnZpY2UuZGVjb2RlKCk7XG4gICAgaWYgKFxuICAgICAgYXV0aFJlcS5wYXJhbXMuZ2V0KCdfaScpID09PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuRGVjb2RlZCAmJlxuICAgICAgdG9rZW5EZWNvZGVkLnVzZXIgJiZcbiAgICAgIHRva2VuRGVjb2RlZC51c2VyLnNvdXJjZUlkXG4gICAgKSB7XG4gICAgICBjb25zdCBoYXNoVXNlciA9IE1kNS5oYXNoU3RyKHRva2VuRGVjb2RlZC51c2VyLnNvdXJjZUlkKSBhcyBzdHJpbmc7XG4gICAgICBhdXRoUmVxID0gYXV0aFJlcS5jbG9uZSh7XG4gICAgICAgIHBhcmFtczogYXV0aFJlcS5wYXJhbXMuc2V0KCdfaScsIGhhc2hVc2VyKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChhdXRoUmVxLnBhcmFtcy5nZXQoJ19pJykgPT09ICd0cnVlJykge1xuICAgICAgYXV0aFJlcSA9IGF1dGhSZXEuY2xvbmUoe1xuICAgICAgICBwYXJhbXM6IGF1dGhSZXEucGFyYW1zLmRlbGV0ZSgnX2knKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKGF1dGhSZXEpO1xuICB9XG5cbiAgaW50ZXJjZXB0WGhyKHhociwgdXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB3aXRoQ3JlZGVudGlhbHMgPSB0aGlzLmhhbmRsZUhvc3RzV2l0aENyZWRlbnRpYWxzKHVybCk7XG4gICAgaWYgKHdpdGhDcmVkZW50aWFscykge1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaFRva2VuKCk7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBlbGVtZW50LmhyZWYgPSB1cmw7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpO1xuICAgIGlmICghdG9rZW4gfHwgdGhpcy50cnVzdEhvc3RzLmluZGV4T2YoZWxlbWVudC5ob3N0bmFtZSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgdG9rZW4pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYWx0ZXJVcmxXaXRoS2V5QXV0aCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaG9zdFdpdGhLZXkgPSB0aGlzLmhhbmRsZUhvc3RzQXV0aEJ5S2V5KHVybCk7XG4gICAgbGV0IGludGVyY2VwdGVkVXJsID0gdXJsO1xuICAgIGlmIChob3N0V2l0aEtleSkge1xuICAgICAgY29uc3QgdXJsRGVjb21wb3NlZCA9IGludGVyY2VwdGVkVXJsLnNwbGl0KC9bPyZdLyk7XG4gICAgICBsZXQgdXJsV2l0aEtleUFkZGVkID0gdXJsRGVjb21wb3NlZC5zaGlmdCgpO1xuICAgICAgY29uc3QgcGFyYW1zVG9LZWVwID0gdXJsRGVjb21wb3NlZC5maWx0ZXIoKHApID0+IHAubGVuZ3RoICE9PSAwKTtcbiAgICAgIHBhcmFtc1RvS2VlcC5wdXNoKGAke2hvc3RXaXRoS2V5LmtleX09JHtob3N0V2l0aEtleS52YWx1ZX1gKTtcbiAgICAgIGlmIChwYXJhbXNUb0tlZXAubGVuZ3RoKSB7XG4gICAgICAgIHVybFdpdGhLZXlBZGRlZCArPSAnPycgKyBwYXJhbXNUb0tlZXAuam9pbignJicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVybFdpdGhLZXlBZGRlZDtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVIb3N0c1dpdGhDcmVkZW50aWFscyhyZXFVcmw6IHN0cmluZykge1xuICAgIGxldCB3aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGhvc3RXaXRoQ3JlZGVudGlhbHMgb2YgdGhpcy5ob3N0c1dpdGhDcmVkZW50aWFscykge1xuICAgICAgY29uc3QgZG9tYWluUmVnZXggPSBuZXcgUmVnRXhwKGhvc3RXaXRoQ3JlZGVudGlhbHMuZG9tYWluUmVnRmlsdGVycyk7XG4gICAgICBpZiAoZG9tYWluUmVnZXgudGVzdChyZXFVcmwpKSB7XG4gICAgICAgIHdpdGhDcmVkZW50aWFscyA9XG4gICAgICAgICAgaG9zdFdpdGhDcmVkZW50aWFscy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBob3N0V2l0aENyZWRlbnRpYWxzLndpdGhDcmVkZW50aWFsc1xuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2l0aENyZWRlbnRpYWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVIb3N0c0F1dGhCeUtleShyZXFVcmw6IHN0cmluZyk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfSB7XG4gICAgbGV0IGhvc3RXaXRoS2V5O1xuICAgIGZvciAoY29uc3QgaG9zdFdpdGhBdXRoQnlLZXkgb2YgdGhpcy5ob3N0c1dpdGhBdXRoQnlLZXkpIHtcbiAgICAgIGNvbnN0IGRvbWFpblJlZ2V4ID0gbmV3IFJlZ0V4cChob3N0V2l0aEF1dGhCeUtleS5kb21haW5SZWdGaWx0ZXJzKTtcbiAgICAgIGlmIChkb21haW5SZWdleC50ZXN0KHJlcVVybCkpIHtcbiAgICAgICAgdmFyIHJlcGxhY2UgPSBgJHtob3N0V2l0aEF1dGhCeUtleS5rZXlQcm9wZXJ0eX09JHtob3N0V2l0aEF1dGhCeUtleS5rZXlWYWx1ZX1gO1xuICAgICAgICB2YXIga2V5QWRkZWQgPSBuZXcgUmVnRXhwKHJlcGxhY2UsICdnbScpO1xuICAgICAgICBpZiAoIWtleUFkZGVkLnRlc3QocmVxVXJsKSkge1xuICAgICAgICAgIGhvc3RXaXRoS2V5ID0ge1xuICAgICAgICAgICAga2V5OiBob3N0V2l0aEF1dGhCeUtleS5rZXlQcm9wZXJ0eSxcbiAgICAgICAgICAgIHZhbHVlOiBob3N0V2l0aEF1dGhCeUtleS5rZXlWYWx1ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhvc3RXaXRoS2V5O1xuICB9XG5cbiAgcmVmcmVzaFRva2VuKCkge1xuICAgIGNvbnN0IGp3dCA9IHRoaXMudG9rZW5TZXJ2aWNlLmRlY29kZSgpO1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwO1xuXG4gICAgaWYgKFxuICAgICAgIXRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgJiZcbiAgICAgIGp3dCAmJlxuICAgICAgY3VycmVudFRpbWUgPCBqd3QuZXhwICYmXG4gICAgICBjdXJyZW50VGltZSA+IGp3dC5leHAgLSAxODAwXG4gICAgKSB7XG4gICAgICB0aGlzLnJlZnJlc2hJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdhdXRoLnVybCcpO1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3VybH0vcmVmcmVzaGAsIHt9KS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQoZGF0YS50b2tlbik7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgZXJyLmVycm9yLmNhdWdodCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIGVycjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hdXRoL3NyYy9saWIvc2hhcmVkL2F1dGguaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcm93c2VyQXV0aE9wdGlvbnMgfSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcbmltcG9ydCB7IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24gfSBmcm9tICdAYXp1cmUvbXNhbC1hbmd1bGFyJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoSW50ZXJuT3B0aW9ucyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhGYWNlYm9va09wdGlvbnMge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgYXBwSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoR29vZ2xlT3B0aW9ucyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhcGlLZXk6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoTWljcm9zb2Z0T3B0aW9ucyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBjbGllbnRJZDogc3RyaW5nO1xuICByZWRpcmVjdFVyaT86IHN0cmluZztcbiAgYXV0aG9yaXR5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNaWNyb3NvZnRiMmNPcHRpb25zIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGJyb3dzZXJBdXRoT3B0aW9ucz86IEJyb3dzZXJBdXRoT3B0aW9ucztcbiAgb3B0aW9ucz86IEF1dGhNaWNyb3NvZnRiMmNPcHRpb25zT3B0aW9ucztcbiAgc2NvcGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aE1pY3Jvc29mdGIyY09wdGlvbnNPcHRpb25zIHtcbiAgbmFtZXM6IEF1dGhNaWNyb3NvZnRiMmNPcHRpb25zTmFtZXM7XG4gIGF1dGhvcml0aWVzOiBBdXRoTWljcm9zb2Z0YjJjT3B0aW9uc0F1dGhvcml0aWVzO1xuICBhdXRob3JpdHlEb21haW46IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNaWNyb3NvZnRiMmNPcHRpb25zTmFtZXMge1xuICBzaWduVXBTaWduSW46IHN0cmluZztcbiAgZm9yZ290UGFzc3dvcmQ6IHN0cmluZztcbiAgZWRpdFByb2ZpbGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoTWljcm9zb2Z0YjJjT3B0aW9uc0F1dGhvcml0aWVzIHtcbiAgc2lnblVwU2lnbkluOiBBdXRoTWljcm9zb2Z0YjJjT3B0aW9uc0F1dGhvcml0eTtcbiAgZm9yZ290UGFzc3dvcmQ6IEF1dGhNaWNyb3NvZnRiMmNPcHRpb25zQXV0aG9yaXR5O1xuICBlZGl0UHJvZmlsZTogQXV0aE1pY3Jvc29mdGIyY09wdGlvbnNBdXRob3JpdHk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aE1pY3Jvc29mdGIyY09wdGlvbnNBdXRob3JpdHkge1xuICBhdXRob3JpdHk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdXRoT3B0aW9ucyB7XG4gIHVybD86IHN0cmluZztcbiAgdG9rZW5LZXk6IHN0cmluZztcbiAgYWxsb3dBbm9ueW1vdXM/OiBib29sZWFuO1xuICBsb2dpblJvdXRlPzogc3RyaW5nO1xuICBsb2dvdXRSb3V0ZT86IHN0cmluZztcbiAgaG9tZVJvdXRlPzogc3RyaW5nO1xuICBpbnRlcm4/OiBBdXRoSW50ZXJuT3B0aW9ucztcbiAgZmFjZWJvb2s/OiBBdXRoRmFjZWJvb2tPcHRpb25zO1xuICBnb29nbGU/OiBBdXRoR29vZ2xlT3B0aW9ucztcbiAgbWljcm9zb2Z0PzogQXV0aE1pY3Jvc29mdE9wdGlvbnM7XG4gIG1pY3Jvc29mdGIyYz86IEF1dGhNaWNyb3NvZnRiMmNPcHRpb25zO1xuICB0cnVzdEhvc3RzPzogc3RyaW5nW107XG4gIHByb2ZpbHNHdWFyZD86IHN0cmluZ1tdO1xuICBob3N0c1dpdGhDcmVkZW50aWFscz86IFdpdGhDcmVkZW50aWFsc09wdGlvbnNbXTtcbiAgaG9zdHNCeUtleT86IEF1dGhCeUtleU9wdGlvbnNbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEJ5S2V5T3B0aW9ucyB7XG4gIGRvbWFpblJlZ0ZpbHRlcnM/OiBzdHJpbmc7XG4gIGtleVByb3BlcnR5Pzogc3RyaW5nO1xuICBrZXlWYWx1ZT86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aENyZWRlbnRpYWxzT3B0aW9ucyB7XG4gIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG4gIGRvbWFpblJlZ0ZpbHRlcnM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVNQTXNhbEd1YXJkQ29uZmlndXJhdGlvbiBleHRlbmRzIE1zYWxHdWFyZENvbmZpZ3VyYXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVNQTXNhbEd1YXJkQ29uZmlndXJhdGlvbiBleHRlbmRzIE1zYWxHdWFyZENvbmZpZ3VyYXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVNQTXNhbEd1YXJkQ29uZmlndXJhdGlvbiBleHRlbmRzIE1zYWxHdWFyZENvbmZpZ3VyYXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVNQTXNhbEd1YXJkQ29uZmlndXJhdGlvbiBleHRlbmRzIE1zYWxHdWFyZENvbmZpZ3VyYXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVNQTXNhbEd1YXJkQ29uZmlndXJhdGlvbiBleHRlbmRzIE1zYWxHdWFyZENvbmZpZ3VyYXRpb24ge1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciB7XG4gIHNvdXJjZT86IHN0cmluZztcbiAgc291cmNlSWQ/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBmaXJzdE5hbWU/OiBzdHJpbmc7XG4gIGxhc3ROYW1lPzogc3RyaW5nO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIGlzRXhwaXJlZD86IGJvb2xlYW47XG4gIGFkbWluPzogYm9vbGVhbjtcbiAgZGVmYXVsdENvbnRleHRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW5mb3NVc2VyIHtcbiAgdG9rZW5JZDogc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { Injectable, Optional } from '@angular/core';
|
|
2
|
+
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { Router } from '@angular/router';
|
|
4
|
+
import { BehaviorSubject, of } from 'rxjs';
|
|
5
|
+
import { tap, catchError } from 'rxjs/operators';
|
|
6
|
+
import { globalCacheBusterNotifier } from 'ts-cacheable';
|
|
7
|
+
import { ConfigService, LanguageService, MessageService } from '@igo2/core';
|
|
8
|
+
import { Base64 } from '@igo2/utils';
|
|
9
|
+
import { TokenService } from './token.service';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
import * as i1 from "@angular/common/http";
|
|
12
|
+
import * as i2 from "./token.service";
|
|
13
|
+
import * as i3 from "@igo2/core";
|
|
14
|
+
import * as i4 from "@angular/router";
|
|
15
|
+
export class AuthService {
|
|
16
|
+
http;
|
|
17
|
+
tokenService;
|
|
18
|
+
config;
|
|
19
|
+
languageService;
|
|
20
|
+
messageService;
|
|
21
|
+
router;
|
|
22
|
+
authenticate$ = new BehaviorSubject(undefined);
|
|
23
|
+
logged$ = new BehaviorSubject(undefined);
|
|
24
|
+
redirectUrl;
|
|
25
|
+
languageForce = false;
|
|
26
|
+
anonymous = false;
|
|
27
|
+
get hasAuthService() {
|
|
28
|
+
return this.config.getConfig('auth.url') !== undefined;
|
|
29
|
+
}
|
|
30
|
+
constructor(http, tokenService, config, languageService, messageService, router) {
|
|
31
|
+
this.http = http;
|
|
32
|
+
this.tokenService = tokenService;
|
|
33
|
+
this.config = config;
|
|
34
|
+
this.languageService = languageService;
|
|
35
|
+
this.messageService = messageService;
|
|
36
|
+
this.router = router;
|
|
37
|
+
this.authenticate$.next(this.authenticated);
|
|
38
|
+
this.authenticate$.subscribe((authenticated) => {
|
|
39
|
+
this.logged$.next(authenticated);
|
|
40
|
+
globalCacheBusterNotifier.next();
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
login(username, password) {
|
|
44
|
+
const myHeader = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
45
|
+
const body = {
|
|
46
|
+
username,
|
|
47
|
+
password: this.encodePassword(password)
|
|
48
|
+
};
|
|
49
|
+
return this.loginCall(body, myHeader);
|
|
50
|
+
}
|
|
51
|
+
loginWithToken(token, type, infosUser) {
|
|
52
|
+
const myHeader = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
53
|
+
const body = {
|
|
54
|
+
token,
|
|
55
|
+
typeConnection: type,
|
|
56
|
+
infosUser
|
|
57
|
+
};
|
|
58
|
+
return this.loginCall(body, myHeader);
|
|
59
|
+
}
|
|
60
|
+
loginAnonymous() {
|
|
61
|
+
this.anonymous = true;
|
|
62
|
+
this.logged$.next(true);
|
|
63
|
+
return of(true);
|
|
64
|
+
}
|
|
65
|
+
refresh() {
|
|
66
|
+
const url = this.config.getConfig('auth.url');
|
|
67
|
+
return this.http.post(`${url}/refresh`, {}).pipe(tap((data) => {
|
|
68
|
+
this.tokenService.set(data.token);
|
|
69
|
+
}), catchError((err) => {
|
|
70
|
+
err.error.caught = true;
|
|
71
|
+
throw err;
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
logout() {
|
|
75
|
+
this.anonymous = false;
|
|
76
|
+
this.tokenService.remove();
|
|
77
|
+
this.authenticate$.next(false);
|
|
78
|
+
return of(true);
|
|
79
|
+
}
|
|
80
|
+
isAuthenticated() {
|
|
81
|
+
return !this.tokenService.isExpired();
|
|
82
|
+
}
|
|
83
|
+
getToken() {
|
|
84
|
+
return this.tokenService.get();
|
|
85
|
+
}
|
|
86
|
+
decodeToken() {
|
|
87
|
+
if (this.isAuthenticated()) {
|
|
88
|
+
return this.tokenService.decode();
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
goToRedirectUrl() {
|
|
93
|
+
if (!this.router) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const redirectUrl = this.redirectUrl || this.router.url;
|
|
97
|
+
const options = this.config.getConfig('auth') || {};
|
|
98
|
+
if (redirectUrl === options.loginRoute) {
|
|
99
|
+
const homeRoute = options.homeRoute || '/';
|
|
100
|
+
this.router.navigateByUrl(homeRoute);
|
|
101
|
+
}
|
|
102
|
+
else if (redirectUrl) {
|
|
103
|
+
this.router.navigateByUrl(redirectUrl);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
getUserInfo() {
|
|
107
|
+
const url = this.config.getConfig('auth.url') + '/info';
|
|
108
|
+
return this.http.get(url);
|
|
109
|
+
}
|
|
110
|
+
getProfils() {
|
|
111
|
+
const url = this.config.getConfig('auth.url');
|
|
112
|
+
return this.http.get(`${url}/profils`);
|
|
113
|
+
}
|
|
114
|
+
updateUser(user) {
|
|
115
|
+
const url = this.config.getConfig('auth.url');
|
|
116
|
+
return this.http.patch(url, user);
|
|
117
|
+
}
|
|
118
|
+
encodePassword(password) {
|
|
119
|
+
return Base64.encode(password);
|
|
120
|
+
}
|
|
121
|
+
// authenticated or anonymous
|
|
122
|
+
get logged() {
|
|
123
|
+
return this.authenticated || this.isAnonymous;
|
|
124
|
+
}
|
|
125
|
+
get isAnonymous() {
|
|
126
|
+
return this.anonymous;
|
|
127
|
+
}
|
|
128
|
+
get authenticated() {
|
|
129
|
+
return this.isAuthenticated();
|
|
130
|
+
}
|
|
131
|
+
get isAdmin() {
|
|
132
|
+
const token = this.decodeToken();
|
|
133
|
+
if (token && token.user && token.user.isAdmin) {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
loginCall(body, headers) {
|
|
139
|
+
const url = this.config.getConfig('auth.url');
|
|
140
|
+
return this.http.post(`${url}/login`, body, { headers }).pipe(tap((data) => {
|
|
141
|
+
this.tokenService.set(data.token);
|
|
142
|
+
const tokenDecoded = this.decodeToken();
|
|
143
|
+
if (tokenDecoded && tokenDecoded.user) {
|
|
144
|
+
if (tokenDecoded.user.locale && !this.languageForce) {
|
|
145
|
+
this.languageService.setLanguage(tokenDecoded.user.locale);
|
|
146
|
+
}
|
|
147
|
+
if (tokenDecoded.user.isExpired) {
|
|
148
|
+
this.messageService.alert('igo.auth.error.Password expired');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
this.authenticate$.next(true);
|
|
152
|
+
}), catchError((err) => {
|
|
153
|
+
err.error.caught = true;
|
|
154
|
+
throw err;
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
static ɵfac = function AuthService_Factory(t) { return new (t || AuthService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.TokenService), i0.ɵɵinject(i3.ConfigService), i0.ɵɵinject(i3.LanguageService), i0.ɵɵinject(i3.MessageService), i0.ɵɵinject(i4.Router, 8)); };
|
|
158
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthService, factory: AuthService.ɵfac, providedIn: 'root' });
|
|
159
|
+
}
|
|
160
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthService, [{
|
|
161
|
+
type: Injectable,
|
|
162
|
+
args: [{
|
|
163
|
+
providedIn: 'root'
|
|
164
|
+
}]
|
|
165
|
+
}], function () { return [{ type: i1.HttpClient }, { type: i2.TokenService }, { type: i3.ConfigService }, { type: i3.LanguageService }, { type: i3.MessageService }, { type: i4.Router, decorators: [{
|
|
166
|
+
type: Optional
|
|
167
|
+
}] }]; }, null); })();
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXV0aC9zcmMvbGliL3NoYXJlZC9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUFjLGVBQWUsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHckMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFLL0MsTUFBTSxPQUFPLFdBQVc7SUFZWjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ1k7SUFoQmYsYUFBYSxHQUFHLElBQUksZUFBZSxDQUFVLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBVSxTQUFTLENBQUMsQ0FBQztJQUNsRCxXQUFXLENBQVM7SUFDcEIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNyQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRTFCLElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsQ0FBQztJQUN6RCxDQUFDO0lB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QUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDNUQ7Z0JBQ0QsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztpQkFDOUQ7YUFDRjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pCLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUN4QixNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO3FFQTFLVSxXQUFXO2dFQUFYLFdBQVcsV0FBWCxXQUFXLG1CQUZWLE1BQU07O3VGQUVQLFdBQVc7Y0FIdkIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COztzQkFrQkksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGdsb2JhbENhY2hlQnVzdGVyTm90aWZpZXIgfSBmcm9tICd0cy1jYWNoZWFibGUnO1xuXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlLCBMYW5ndWFnZVNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnQGlnbzIvY29yZSc7XG5pbXBvcnQgeyBCYXNlNjQgfSBmcm9tICdAaWdvMi91dGlscyc7XG5cbmltcG9ydCB7IFVzZXIsIElJbmZvc1VzZXIgfSBmcm9tICcuL2F1dGguaW50ZXJmYWNlJztcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gJy4vdG9rZW4uc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHVibGljIGF1dGhlbnRpY2F0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyBsb2dnZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVkaXJlY3RVcmw6IHN0cmluZztcbiAgcHVibGljIGxhbmd1YWdlRm9yY2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhbm9ueW1vdXMgPSBmYWxzZTtcblxuICBnZXQgaGFzQXV0aFNlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldENvbmZpZygnYXV0aC51cmwnKSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge1xuICAgIHRoaXMuYXV0aGVudGljYXRlJC5uZXh0KHRoaXMuYXV0aGVudGljYXRlZCk7XG4gICAgdGhpcy5hdXRoZW50aWNhdGUkLnN1YnNjcmliZSgoYXV0aGVudGljYXRlZCkgPT4ge1xuICAgICAgdGhpcy5sb2dnZWQkLm5leHQoYXV0aGVudGljYXRlZCk7XG4gICAgICBnbG9iYWxDYWNoZUJ1c3Rlck5vdGlmaWVyLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBteUhlYWRlciA9IG5ldyBIdHRwSGVhZGVycyh7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG5cbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgdXNlcm5hbWUsXG4gICAgICBwYXNzd29yZDogdGhpcy5lbmNvZGVQYXNzd29yZChwYXNzd29yZClcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubG9naW5DYWxsKGJvZHksIG15SGVhZGVyKTtcbiAgfVxuXG4gIGxvZ2luV2l0aFRva2VuKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGluZm9zVXNlcj86IElJbmZvc1VzZXJcbiAgKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgbXlIZWFkZXIgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuXG4gICAgY29uc3QgYm9keSA9IHtcbiAgICAgIHRva2VuLFxuICAgICAgdHlwZUNvbm5lY3Rpb246IHR5cGUsXG4gICAgICBpbmZvc1VzZXJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMubG9naW5DYWxsKGJvZHksIG15SGVhZGVyKTtcbiAgfVxuXG4gIGxvZ2luQW5vbnltb3VzKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHRoaXMuYW5vbnltb3VzID0gdHJ1ZTtcbiAgICB0aGlzLmxvZ2dlZCQubmV4dCh0cnVlKTtcbiAgICByZXR1cm4gb2YodHJ1ZSk7XG4gIH1cblxuICByZWZyZXNoKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnYXV0aC51cmwnKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dXJsfS9yZWZyZXNoYCwge30pLnBpcGUoXG4gICAgICB0YXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQoZGF0YS50b2tlbik7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICBlcnIuZXJyb3IuY2F1Z2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbG9nb3V0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHRoaXMuYW5vbnltb3VzID0gZmFsc2U7XG4gICAgdGhpcy50b2tlblNlcnZpY2UucmVtb3ZlKCk7XG4gICAgdGhpcy5hdXRoZW50aWNhdGUkLm5leHQoZmFsc2UpO1xuICAgIHJldHVybiBvZih0cnVlKTtcbiAgfVxuXG4gIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudG9rZW5TZXJ2aWNlLmlzRXhwaXJlZCgpO1xuICB9XG5cbiAgZ2V0VG9rZW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b2tlblNlcnZpY2UuZ2V0KCk7XG4gIH1cblxuICBkZWNvZGVUb2tlbigpIHtcbiAgICBpZiAodGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLmRlY29kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnb1RvUmVkaXJlY3RVcmwoKSB7XG4gICAgaWYgKCF0aGlzLnJvdXRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWRpcmVjdFVybCA9IHRoaXMucmVkaXJlY3RVcmwgfHwgdGhpcy5yb3V0ZXIudXJsO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnYXV0aCcpIHx8IHt9O1xuICAgIGlmIChyZWRpcmVjdFVybCA9PT0gb3B0aW9ucy5sb2dpblJvdXRlKSB7XG4gICAgICBjb25zdCBob21lUm91dGUgPSBvcHRpb25zLmhvbWVSb3V0ZSB8fCAnLyc7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGhvbWVSb3V0ZSk7XG4gICAgfSBlbHNlIGlmIChyZWRpcmVjdFVybCkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChyZWRpcmVjdFVybCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0VXNlckluZm8oKTogT2JzZXJ2YWJsZTxVc2VyPiB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdhdXRoLnVybCcpICsgJy9pbmZvJztcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVc2VyPih1cmwpO1xuICB9XG5cbiAgZ2V0UHJvZmlscygpOiBPYnNlcnZhYmxlPHsgcHJvZmlsczogc3RyaW5nW10gfT4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnYXV0aC51cmwnKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHByb2ZpbHM6IHN0cmluZ1tdIH0+KGAke3VybH0vcHJvZmlsc2ApO1xuICB9XG5cbiAgdXBkYXRlVXNlcih1c2VyOiBVc2VyKTogT2JzZXJ2YWJsZTxVc2VyPiB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdhdXRoLnVybCcpO1xuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8VXNlcj4odXJsLCB1c2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5jb2RlUGFzc3dvcmQocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIHJldHVybiBCYXNlNjQuZW5jb2RlKHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8vIGF1dGhlbnRpY2F0ZWQgb3IgYW5vbnltb3VzXG4gIGdldCBsb2dnZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aGVudGljYXRlZCB8fCB0aGlzLmlzQW5vbnltb3VzO1xuICB9XG5cbiAgZ2V0IGlzQW5vbnltb3VzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFub255bW91cztcbiAgfVxuXG4gIGdldCBhdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZCgpO1xuICB9XG5cbiAgZ2V0IGlzQWRtaW4oKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRlY29kZVRva2VuKCk7XG4gICAgaWYgKHRva2VuICYmIHRva2VuLnVzZXIgJiYgdG9rZW4udXNlci5pc0FkbWluKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dpbkNhbGwoYm9keSwgaGVhZGVycykge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmdldENvbmZpZygnYXV0aC51cmwnKTtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dXJsfS9sb2dpbmAsIGJvZHksIHsgaGVhZGVycyB9KS5waXBlKFxuICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KGRhdGEudG9rZW4pO1xuICAgICAgICBjb25zdCB0b2tlbkRlY29kZWQgPSB0aGlzLmRlY29kZVRva2VuKCk7XG4gICAgICAgIGlmICh0b2tlbkRlY29kZWQgJiYgdG9rZW5EZWNvZGVkLnVzZXIpIHtcbiAgICAgICAgICBpZiAodG9rZW5EZWNvZGVkLnVzZXIubG9jYWxlICYmICF0aGlzLmxhbmd1YWdlRm9yY2UpIHtcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnNldExhbmd1YWdlKHRva2VuRGVjb2RlZC51c2VyLmxvY2FsZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0b2tlbkRlY29kZWQudXNlci5pc0V4cGlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWxlcnQoJ2lnby5hdXRoLmVycm9yLlBhc3N3b3JkIGV4cGlyZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdXRoZW50aWNhdGUkLm5leHQodHJ1ZSk7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICBlcnIuZXJyb3IuY2F1Z2h0ID0gdHJ1ZTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Router } from '@angular/router';
|
|
3
|
+
import { ConfigService } from '@igo2/core';
|
|
4
|
+
import { AuthService } from './auth.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./auth.service";
|
|
7
|
+
import * as i2 from "@igo2/core";
|
|
8
|
+
import * as i3 from "@angular/router";
|
|
9
|
+
export class LoggedGuard {
|
|
10
|
+
authService;
|
|
11
|
+
config;
|
|
12
|
+
router;
|
|
13
|
+
constructor(authService, config, router) {
|
|
14
|
+
this.authService = authService;
|
|
15
|
+
this.config = config;
|
|
16
|
+
this.router = router;
|
|
17
|
+
}
|
|
18
|
+
canActivate(route, state) {
|
|
19
|
+
if (this.authService.logged) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
this.authService.redirectUrl = state.url;
|
|
23
|
+
const authConfig = this.config.getConfig('auth');
|
|
24
|
+
if (authConfig && authConfig.loginRoute) {
|
|
25
|
+
this.router.navigateByUrl(authConfig.loginRoute);
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
static ɵfac = function LoggedGuard_Factory(t) { return new (t || LoggedGuard)(i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.ConfigService), i0.ɵɵinject(i3.Router)); };
|
|
30
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: LoggedGuard, factory: LoggedGuard.ɵfac, providedIn: 'root' });
|
|
31
|
+
}
|
|
32
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LoggedGuard, [{
|
|
33
|
+
type: Injectable,
|
|
34
|
+
args: [{
|
|
35
|
+
providedIn: 'root'
|
|
36
|
+
}]
|
|
37
|
+
}], function () { return [{ type: i1.AuthService }, { type: i2.ConfigService }, { type: i3.Router }]; }, null); })();
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VkLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXV0aC9zcmMvbGliL3NoYXJlZC9sb2dnZWQuZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsTUFBTSxFQUdQLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSzdDLE1BQU0sT0FBTyxXQUFXO0lBRVo7SUFDQTtJQUNBO0lBSFYsWUFDVSxXQUF3QixFQUN4QixNQUFxQixFQUNyQixNQUFjO1FBRmQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3JCLENBQUM7SUFFSixXQUFXLENBQUMsS0FBNkIsRUFBRSxLQUEwQjtRQUNuRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBRXpDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO3FFQXBCVSxXQUFXO2dFQUFYLFdBQVcsV0FBWCxXQUFXLG1CQUZWLE1BQU07O3VGQUVQLFdBQVc7Y0FIdkIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgUm91dGVyLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90XG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBMb2dnZWRHdWFyZCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7fVxuXG4gIGNhbkFjdGl2YXRlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkge1xuICAgIGlmICh0aGlzLmF1dGhTZXJ2aWNlLmxvZ2dlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5hdXRoU2VydmljZS5yZWRpcmVjdFVybCA9IHN0YXRlLnVybDtcblxuICAgIGNvbnN0IGF1dGhDb25maWcgPSB0aGlzLmNvbmZpZy5nZXRDb25maWcoJ2F1dGgnKTtcbiAgICBpZiAoYXV0aENvbmZpZyAmJiBhdXRoQ29uZmlnLmxvZ2luUm91dGUpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoYXV0aENvbmZpZy5sb2dpblJvdXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Router } from '@angular/router';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { ConfigService } from '@igo2/core';
|
|
5
|
+
import { AuthService } from './auth.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "./auth.service";
|
|
8
|
+
import * as i2 from "@igo2/core";
|
|
9
|
+
import * as i3 from "@angular/router";
|
|
10
|
+
export class ProfilsGuard {
|
|
11
|
+
authService;
|
|
12
|
+
config;
|
|
13
|
+
router;
|
|
14
|
+
constructor(authService, config, router) {
|
|
15
|
+
this.authService = authService;
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.router = router;
|
|
18
|
+
}
|
|
19
|
+
canActivate(_route, state) {
|
|
20
|
+
return this.authService.getProfils().pipe(map((profils) => {
|
|
21
|
+
const authConfig = this.config.getConfig('auth');
|
|
22
|
+
if (profils &&
|
|
23
|
+
profils.profils &&
|
|
24
|
+
profils.profils.some((v) => authConfig.profilsGuard.indexOf(v) !== -1)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
this.authService.redirectUrl = state.url;
|
|
28
|
+
if (authConfig && authConfig.loginRoute) {
|
|
29
|
+
this.router.navigateByUrl(authConfig.loginRoute);
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
static ɵfac = function ProfilsGuard_Factory(t) { return new (t || ProfilsGuard)(i0.ɵɵinject(i1.AuthService), i0.ɵɵinject(i2.ConfigService), i0.ɵɵinject(i3.Router)); };
|
|
35
|
+
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ProfilsGuard, factory: ProfilsGuard.ɵfac, providedIn: 'root' });
|
|
36
|
+
}
|
|
37
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProfilsGuard, [{
|
|
38
|
+
type: Injectable,
|
|
39
|
+
args: [{
|
|
40
|
+
providedIn: 'root'
|
|
41
|
+
}]
|
|
42
|
+
}], function () { return [{ type: i1.AuthService }, { type: i2.ConfigService }, { type: i3.Router }]; }, null); })();
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlscy5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvc3JjL2xpYi9zaGFyZWQvcHJvZmlscy5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxNQUFNLEVBR1AsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSzdDLE1BQU0sT0FBTyxZQUFZO0lBRWI7SUFDQTtJQUNBO0lBSFYsWUFDVSxXQUF3QixFQUN4QixNQUFxQixFQUNyQixNQUFjO1FBRmQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3JCLENBQUM7SUFFSixXQUFXLENBQUMsTUFBOEIsRUFBRSxLQUEwQjtRQUNwRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUN2QyxHQUFHLENBQUMsQ0FBQyxPQUE4QixFQUFFLEVBQUU7WUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsSUFDRSxPQUFPO2dCQUNQLE9BQU8sQ0FBQyxPQUFPO2dCQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUN0RTtnQkFDQSxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUV6QyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDbEQ7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO3NFQTVCVSxZQUFZO2dFQUFaLFlBQVksV0FBWixZQUFZLG1CQUZYLE1BQU07O3VGQUVQLFlBQVk7Y0FIeEIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgUm91dGVyLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90XG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAaWdvMi9jb3JlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQcm9maWxzR3VhcmQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge31cblxuICBjYW5BY3RpdmF0ZShfcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuZ2V0UHJvZmlscygpLnBpcGUoXG4gICAgICBtYXAoKHByb2ZpbHM6IHsgcHJvZmlsczogc3RyaW5nW10gfSkgPT4ge1xuICAgICAgICBjb25zdCBhdXRoQ29uZmlnID0gdGhpcy5jb25maWcuZ2V0Q29uZmlnKCdhdXRoJyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcm9maWxzICYmXG4gICAgICAgICAgcHJvZmlscy5wcm9maWxzICYmXG4gICAgICAgICAgcHJvZmlscy5wcm9maWxzLnNvbWUoKHYpID0+IGF1dGhDb25maWcucHJvZmlsc0d1YXJkLmluZGV4T2YodikgIT09IC0xKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UucmVkaXJlY3RVcmwgPSBzdGF0ZS51cmw7XG5cbiAgICAgICAgaWYgKGF1dGhDb25maWcgJiYgYXV0aENvbmZpZy5sb2dpblJvdXRlKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChhdXRoQ29uZmlnLmxvZ2luUm91dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Directive, ElementRef } from '@angular/core';
|
|
2
|
+
import { AuthService } from './auth.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "./auth.service";
|
|
5
|
+
export class ProtectedDirective {
|
|
6
|
+
constructor(authentication, el) {
|
|
7
|
+
if (!authentication.isAuthenticated()) {
|
|
8
|
+
el.nativeElement.parentNode.removeChild(el.nativeElement);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
static ɵfac = function ProtectedDirective_Factory(t) { return new (t || ProtectedDirective)(i0.ɵɵdirectiveInject(i1.AuthService), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
12
|
+
static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ProtectedDirective, selectors: [["", "igoProtected", ""]] });
|
|
13
|
+
}
|
|
14
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProtectedDirective, [{
|
|
15
|
+
type: Directive,
|
|
16
|
+
args: [{
|
|
17
|
+
selector: '[igoProtected]'
|
|
18
|
+
}]
|
|
19
|
+
}], function () { return [{ type: i1.AuthService }, { type: i0.ElementRef }]; }, null); })();
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdGVjdGVkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2F1dGgvc3JjL2xpYi9zaGFyZWQvcHJvdGVjdGVkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUs3QyxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQVksY0FBMkIsRUFBRSxFQUFjO1FBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDckMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7NEVBTFUsa0JBQWtCOzZEQUFsQixrQkFBa0I7O3VGQUFsQixrQkFBa0I7Y0FIOUIsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxnQkFBZ0I7YUFDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbaWdvUHJvdGVjdGVkXSdcbn0pXG5leHBvcnQgY2xhc3MgUHJvdGVjdGVkRGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IoYXV0aGVudGljYXRpb246IEF1dGhTZXJ2aWNlLCBlbDogRWxlbWVudFJlZikge1xuICAgIGlmICghYXV0aGVudGljYXRpb24uaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgIGVsLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hdXRoL3NyYy9saWIvc2hhcmVkL3N0b3JhZ2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdG9yYWdlT3B0aW9ucyB9IGZyb20gJ0BpZ28yL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdG9yYWdlT3B0aW9ucyBleHRlbmRzIFN0b3JhZ2VPcHRpb25zIHtcbiAgdXJsOiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { StorageScope, ConfigService, BaseStorage } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXV0aC9zcmMvbGliL3NoYXJlZC9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7OztBQU0vQyxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsV0FBK0I7SUFHM0Q7SUFDQTtJQUNBO0lBSlYsWUFDRSxNQUFxQixFQUNiLElBQWdCLEVBQ2hCLFdBQXdCLEVBQ3hCLFlBQTBCO1FBRWxDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUpOLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFJbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDM0QsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxJQUFJO3FCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztxQkFDckIsU0FBUyxDQUFDLENBQUMsT0FBK0IsRUFBRSxFQUFFO29CQUM3QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO3dCQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFOzRCQUNqRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDdkI7cUJBQ0Y7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDTjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FDRCxHQUFXLEVBQ1gsS0FBeUMsRUFDekMsUUFBc0IsWUFBWSxDQUFDLEtBQUs7UUFFeEMsSUFDRSxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUs7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUNoQjtZQUNBLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUN0QixVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUMvRDtRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVcsRUFBRSxRQUFzQixZQUFZLENBQUMsS0FBSztRQUMxRCxJQUNFLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztZQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWE7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQ2hCO1lBQ0EsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQy9EO1FBQ0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFzQixZQUFZLENBQUMsS0FBSztRQUM1QyxJQUNFLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSztZQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWE7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQ2hCO1lBQ0EsSUFBSSxDQUFDLElBQUk7aUJBQ04sS0FBSyxDQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUNoQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFDbEI7Z0JBQ0UsTUFBTSxFQUFFO29CQUNOLGVBQWUsRUFBRSxPQUFPO2lCQUN6QjthQUNGLENBQ0Y7aUJBQ0EsU0FBUyxFQUFFLENBQUM7U0FDaEI7UUFFRCxJQUFJLEtBQWEsQ0FBQztRQUNsQixJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQ2hDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2pDO1FBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuQixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzlCO1FBRUQsSUFDRSxLQUFLLEtBQUssWUFBWSxDQUFDLEtBQUs7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO1lBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUNoQjtZQUNBLElBQUksQ0FBQyxJQUFJO2lCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztpQkFDckIsU0FBUyxDQUFDLENBQUMsT0FBK0IsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO29CQUNqQyxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUNqRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztxQkFDdkI7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQzs0RUFyR1Usa0JBQWtCO2dFQUFsQixrQkFBa0IsV0FBbEIsa0JBQWtCLG1CQUZqQixNQUFNOzt1RkFFUCxrQkFBa0I7Y0FIOUIsVUFBVTtlQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuaW1wb3J0IHsgU3RvcmFnZVNjb3BlLCBDb25maWdTZXJ2aWNlLCBCYXNlU3RvcmFnZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFN0b3JhZ2VPcHRpb25zIH0gZnJvbSAnLi9zdG9yYWdlLmludGVyZmFjZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEF1dGhTdG9yYWdlU2VydmljZSBleHRlbmRzIEJhc2VTdG9yYWdlPEF1dGhTdG9yYWdlT3B0aW9ucz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2UuYXV0aGVudGljYXRlJC5zdWJzY3JpYmUoKGlzQXV0aGVudGljYXRlZCkgPT4ge1xuICAgICAgaWYgKGlzQXV0aGVudGljYXRlZCAmJiB0aGlzLm9wdGlvbnMudXJsKSB7XG4gICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgIC5nZXQodGhpcy5vcHRpb25zLnVybClcbiAgICAgICAgICAuc3Vic2NyaWJlKCh1c2VySWdvOiB7IHByZWZlcmVuY2U6IG9iamVjdCB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodXNlcklnbyAmJiB1c2VySWdvLnByZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModXNlcklnby5wcmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXNlcklnby5wcmVmZXJlbmNlW2tleV07XG4gICAgICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyB8IG9iamVjdCB8IGJvb2xlYW4gfCBudW1iZXIsXG4gICAgc2NvcGU6IFN0b3JhZ2VTY29wZSA9IFN0b3JhZ2VTY29wZS5MT0NBTFxuICApIHtcbiAgICBpZiAoXG4gICAgICBzY29wZSA9PT0gU3RvcmFnZVNjb3BlLkxPQ0FMICYmXG4gICAgICB0aGlzLmF1dGhTZXJ2aWNlLmF1dGhlbnRpY2F0ZWQgJiZcbiAgICAgIHRoaXMub3B0aW9ucy51cmxcbiAgICApIHtcbiAgICAgIGNvbnN0IHByZWZlcmVuY2UgPSB7fTtcbiAgICAgIHByZWZlcmVuY2Vba2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5odHRwLnBhdGNoKHRoaXMub3B0aW9ucy51cmwsIHsgcHJlZmVyZW5jZSB9KS5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIHNjb3BlKTtcbiAgfVxuXG4gIHJlbW92ZShrZXk6IHN0cmluZywgc2NvcGU6IFN0b3JhZ2VTY29wZSA9IFN0b3JhZ2VTY29wZS5MT0NBTCkge1xuICAgIGlmIChcbiAgICAgIHNjb3BlID09PSBTdG9yYWdlU2NvcGUuTE9DQUwgJiZcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuYXV0aGVudGljYXRlZCAmJlxuICAgICAgdGhpcy5vcHRpb25zLnVybFxuICAgICkge1xuICAgICAgY29uc3QgcHJlZmVyZW5jZSA9IHt9O1xuICAgICAgcHJlZmVyZW5jZVtrZXldID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5odHRwLnBhdGNoKHRoaXMub3B0aW9ucy51cmwsIHsgcHJlZmVyZW5jZSB9KS5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgc3VwZXIucmVtb3ZlKGtleSwgc2NvcGUpO1xuICB9XG5cbiAgY2xlYXIoc2NvcGU6IFN0b3JhZ2VTY29wZSA9IFN0b3JhZ2VTY29wZS5MT0NBTCkge1xuICAgIGlmIChcbiAgICAgIHNjb3BlID09PSBTdG9yYWdlU2NvcGUuTE9DQUwgJiZcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2UuYXV0aGVudGljYXRlZCAmJlxuICAgICAgdGhpcy5vcHRpb25zLnVybFxuICAgICkge1xuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5wYXRjaChcbiAgICAgICAgICB0aGlzLm9wdGlvbnMudXJsLFxuICAgICAgICAgIHsgcHJlZmVyZW5jZToge30gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgbWVyZ2VQcmVmZXJlbmNlOiAnZmFsc2UnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBsZXQgdG9rZW46IHN0cmluZztcbiAgICBpZiAoc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCkge1xuICAgICAgdG9rZW4gPSB0aGlzLnRva2VuU2VydmljZS5nZXQoKTtcbiAgICB9XG5cbiAgICBzdXBlci5jbGVhcihzY29wZSk7XG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIHRoaXMudG9rZW5TZXJ2aWNlLnNldCh0b2tlbik7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgc2NvcGUgPT09IFN0b3JhZ2VTY29wZS5MT0NBTCAmJlxuICAgICAgdGhpcy5hdXRoU2VydmljZS5hdXRoZW50aWNhdGVkICYmXG4gICAgICB0aGlzLm9wdGlvbnMudXJsXG4gICAgKSB7XG4gICAgICB0aGlzLmh0dHBcbiAgICAgICAgLmdldCh0aGlzLm9wdGlvbnMudXJsKVxuICAgICAgICAuc3Vic2NyaWJlKCh1c2VySWdvOiB7IHByZWZlcmVuY2U6IG9iamVjdCB9KSA9PiB7XG4gICAgICAgICAgaWYgKHVzZXJJZ28gJiYgdXNlcklnby5wcmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh1c2VySWdvLnByZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXNlcklnby5wcmVmZXJlbmNlW2tleV07XG4gICAgICAgICAgICAgIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|