@kolektor/nucleus-identity 0.0.12-pre.7919 → 0.1.0-pre.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/esm2022/index.mjs +7 -0
- package/esm2022/kolektor-nucleus-identity.mjs +5 -0
- package/esm2022/lib/models/client-registration.mjs +8 -0
- package/esm2022/lib/models/device-code.mjs +19 -0
- package/esm2022/lib/models/identity.mjs +52 -0
- package/esm2022/lib/models/otp.mjs +11 -0
- package/esm2022/lib/models/service-principal.mjs +16 -0
- package/esm2022/lib/nucleus-identity-config.mjs +7 -0
- package/esm2022/lib/nucleus-identity.module.mjs +32 -0
- package/esm2022/lib/nucleus-identity.service.mjs +350 -0
- package/esm2022/lib/nucleus-token-interceptor.service.mjs +69 -0
- package/esm2022/lib/utils/angular-requestor.mjs +44 -0
- package/esm2022/lib/utils/authorization-service-configuration.mjs +28 -0
- package/esm2022/lib/utils/location.service.mjs +72 -0
- package/esm2022/lib/utils/nucleus-authorization-notifier.mjs +15 -0
- package/esm2022/lib/utils/oidc-configuration.service.mjs +95 -0
- package/esm2022/lib/utils/secrets-store.mjs +120 -0
- package/esm2022/lib/utils/token-client.mjs +140 -0
- package/{fesm2020 → fesm2022}/kolektor-nucleus-identity.mjs +980 -1012
- package/fesm2022/kolektor-nucleus-identity.mjs.map +1 -0
- package/index.d.ts +6 -5
- package/lib/models/client-registration.d.ts +11 -11
- package/lib/models/device-code.d.ts +19 -19
- package/lib/models/identity.d.ts +14 -14
- package/lib/models/otp.d.ts +14 -14
- package/lib/models/service-principal.d.ts +12 -12
- package/lib/nucleus-identity-config.d.ts +12 -12
- package/lib/nucleus-identity.module.d.ts +9 -9
- package/lib/nucleus-identity.service.d.ts +63 -63
- package/lib/nucleus-token-interceptor.service.d.ts +19 -19
- package/lib/utils/angular-requestor.d.ts +11 -11
- package/lib/utils/authorization-service-configuration.d.ts +12 -12
- package/lib/utils/location.service.d.ts +25 -25
- package/lib/utils/nucleus-authorization-notifier.d.ts +9 -9
- package/lib/utils/oidc-configuration.service.d.ts +23 -23
- package/lib/utils/secrets-store.d.ts +33 -33
- package/lib/utils/token-client.d.ts +23 -23
- package/package.json +29 -33
- package/esm2020/kolektor-nucleus-identity.mjs +0 -5
- package/esm2020/lib/models/client-registration.mjs +0 -8
- package/esm2020/lib/models/device-code.mjs +0 -19
- package/esm2020/lib/models/identity.mjs +0 -49
- package/esm2020/lib/models/otp.mjs +0 -11
- package/esm2020/lib/models/service-principal.mjs +0 -16
- package/esm2020/lib/nucleus-identity-config.mjs +0 -8
- package/esm2020/lib/nucleus-identity.module.mjs +0 -28
- package/esm2020/lib/nucleus-identity.service.mjs +0 -341
- package/esm2020/lib/nucleus-token-interceptor.service.mjs +0 -64
- package/esm2020/lib/utils/angular-requestor.mjs +0 -38
- package/esm2020/lib/utils/authorization-service-configuration.mjs +0 -23
- package/esm2020/lib/utils/location.service.mjs +0 -72
- package/esm2020/lib/utils/nucleus-authorization-notifier.mjs +0 -13
- package/esm2020/lib/utils/nucleus-crypto.mjs +0 -68
- package/esm2020/lib/utils/oidc-configuration.service.mjs +0 -90
- package/esm2020/lib/utils/secrets-store.mjs +0 -120
- package/esm2020/lib/utils/token-client.mjs +0 -140
- package/esm2020/public-api.mjs +0 -11
- package/fesm2015/kolektor-nucleus-identity.mjs +0 -1139
- package/fesm2015/kolektor-nucleus-identity.mjs.map +0 -1
- package/fesm2020/kolektor-nucleus-identity.mjs.map +0 -1
- package/lib/utils/nucleus-crypto.d.ts +0 -9
- package/public-api.d.ts +0 -7
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
import { AuthorizationRequest, RedirectRequestHandler, BasicQueryStringUtils, LocalStorageBackend, AppAuthError } from '@openid/appauth';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { App } from '@capacitor/app';
|
|
4
|
-
import { Browser } from '@capacitor/browser';
|
|
5
|
-
import { Device } from '@capacitor/device';
|
|
6
|
-
import { NucleusCrypto } from './utils/nucleus-crypto';
|
|
7
|
-
import { NucleusAppService } from '@kolektor/nucleus-common';
|
|
8
|
-
import { LocationService } from './utils/location.service';
|
|
9
|
-
import { NucleusAuthorizationNotifier } from './utils/nucleus-authorization-notifier';
|
|
10
|
-
import { HttpClient } from '@angular/common/http';
|
|
11
|
-
import { SecretsStore } from './utils/secrets-store';
|
|
12
|
-
import { OidcConfigurationService } from './utils/oidc-configuration.service';
|
|
13
|
-
import { TokenClient } from './utils/token-client';
|
|
14
|
-
import { ServicePrincipalRegistrationStatus } from './models/service-principal';
|
|
15
|
-
import { lastValueFrom } from 'rxjs';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@kolektor/nucleus-common";
|
|
18
|
-
import * as i2 from "./utils/location.service";
|
|
19
|
-
import * as i3 from "@angular/common/http";
|
|
20
|
-
import * as i4 from "./utils/oidc-configuration.service";
|
|
21
|
-
import * as i5 from "./utils/token-client";
|
|
22
|
-
export class NucleusIdentityService {
|
|
23
|
-
constructor(appService, location, http, config, tokenClient) {
|
|
24
|
-
this.appService = appService;
|
|
25
|
-
this.http = http;
|
|
26
|
-
this.config = config;
|
|
27
|
-
this.tokenClient = tokenClient;
|
|
28
|
-
this._authorizationNotifier = new NucleusAuthorizationNotifier();
|
|
29
|
-
this._initStarted = false;
|
|
30
|
-
this._initialized = false;
|
|
31
|
-
this._servicePrincipalTokenId = '_svcp';
|
|
32
|
-
const storage = new LocalStorageBackend();
|
|
33
|
-
this._crypto = new NucleusCrypto();
|
|
34
|
-
this._authorizationHandler = new RedirectRequestHandler(storage, new BasicQueryStringUtils(), location, this._crypto);
|
|
35
|
-
this._authorizationHandler.setAuthorizationNotifier(this._authorizationNotifier);
|
|
36
|
-
this._store = new SecretsStore(config.clientId);
|
|
37
|
-
}
|
|
38
|
-
get identity() {
|
|
39
|
-
return this._store.getIdentity();
|
|
40
|
-
}
|
|
41
|
-
get isAuthenticated() {
|
|
42
|
-
return this.identity != null;
|
|
43
|
-
}
|
|
44
|
-
get servicePrincipalIdentity() {
|
|
45
|
-
return this._store.getIdentity(this._servicePrincipalTokenId);
|
|
46
|
-
}
|
|
47
|
-
get isServicePrincipalAuthenticated() {
|
|
48
|
-
return this.servicePrincipalIdentity != null;
|
|
49
|
-
}
|
|
50
|
-
get isIdentityServicePrincipal() {
|
|
51
|
-
return this._store.defaultIdentityId === this._servicePrincipalTokenId;
|
|
52
|
-
}
|
|
53
|
-
async init(startLogin = false) {
|
|
54
|
-
if (this._initStarted || this._initialized) {
|
|
55
|
-
console.warn('Nucleus.Identity: Auth initialization was already started. Don\'t call init() multiple times!');
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
this._initStarted = true;
|
|
59
|
-
this.handleLaunchCodeHash();
|
|
60
|
-
await this._authorizationHandler.completeAuthorizationRequestIfPossible();
|
|
61
|
-
const authErr = this._authorizationNotifier.error;
|
|
62
|
-
if (authErr) {
|
|
63
|
-
throw new Error('Authorization err: ' + authErr.error + ': ' + authErr.errorDescription);
|
|
64
|
-
}
|
|
65
|
-
else if (this._authorizationNotifier.response) {
|
|
66
|
-
window.location.hash = '';
|
|
67
|
-
const request = this._authorizationNotifier.request;
|
|
68
|
-
const response = this._authorizationNotifier.response;
|
|
69
|
-
const res = await this.tokenClient.getByAuthorizationCode(request.redirectUri, response.code, request.internal['code_verifier']);
|
|
70
|
-
this._store.setDefaultIdentityId(null);
|
|
71
|
-
await this._store.setToken(res);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
const res = await this._store.getToken();
|
|
75
|
-
if (!res && startLogin) {
|
|
76
|
-
await this.login();
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
this._initialized = true;
|
|
80
|
-
}
|
|
81
|
-
async loginWithSecret(provider, secret) {
|
|
82
|
-
this._store.removeToken();
|
|
83
|
-
const assertionToken = await this.getServicePrincipalAccessToken();
|
|
84
|
-
const scope = this.prepareScope(true, this.config?.requestedScopes);
|
|
85
|
-
const res = await this.tokenClient.getBySecret(provider, secret, assertionToken, scope);
|
|
86
|
-
this._store.setDefaultIdentityId(null);
|
|
87
|
-
await this._store.setToken(res);
|
|
88
|
-
}
|
|
89
|
-
async login() {
|
|
90
|
-
this._store.removeToken();
|
|
91
|
-
const config = await this.config.getConfiguration();
|
|
92
|
-
const request = this.prepareAuthorizationRequest();
|
|
93
|
-
if (this.appService.isNative) {
|
|
94
|
-
const listener = App.addListener('appUrlOpen', data => {
|
|
95
|
-
if (this.appService.platform === 'ios') {
|
|
96
|
-
Browser.close();
|
|
97
|
-
}
|
|
98
|
-
listener.remove();
|
|
99
|
-
const hash = this.getCodeHash(data.url);
|
|
100
|
-
if (hash) {
|
|
101
|
-
const targetUrl = window.location.origin + window.location.pathname + '#' + hash;
|
|
102
|
-
window.location.assign(targetUrl);
|
|
103
|
-
window.location.reload();
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
console.warn('Nucleus.Identity: Redirect url did not contain authorization code!', data);
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
this._authorizationHandler.performAuthorizationRequest(config, request);
|
|
111
|
-
}
|
|
112
|
-
async logout() {
|
|
113
|
-
this._store.removeToken();
|
|
114
|
-
const config = await this.config.getConfiguration();
|
|
115
|
-
const redirectUrl = this.config.redirectUrl;
|
|
116
|
-
const logoutUrl = config.endSessionEndpoint + '?post_logout_redirect_uri=' + encodeURI(redirectUrl);
|
|
117
|
-
if (this.appService.isNative) {
|
|
118
|
-
const listener = App.addListener('appUrlOpen', () => {
|
|
119
|
-
Device.getInfo().then(info => {
|
|
120
|
-
if (info.platform === 'ios') {
|
|
121
|
-
Browser.close();
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
listener.remove();
|
|
125
|
-
});
|
|
126
|
-
Browser.open({ url: logoutUrl });
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
window.location.assign(logoutUrl);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
async getAccessToken() {
|
|
133
|
-
if (!this._getTokenPromise) {
|
|
134
|
-
this._getTokenPromise = this.getAccessTokenInternal();
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
return await this._getTokenPromise;
|
|
138
|
-
}
|
|
139
|
-
finally {
|
|
140
|
-
this._getTokenPromise = null;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
async getServicePrincipalAccessToken() {
|
|
144
|
-
if (!this._getServicePrincipalTokenPromise) {
|
|
145
|
-
this._getServicePrincipalTokenPromise = this.getServicePrincipalAccessTokenInternal();
|
|
146
|
-
}
|
|
147
|
-
try {
|
|
148
|
-
return await this._getServicePrincipalTokenPromise;
|
|
149
|
-
}
|
|
150
|
-
finally {
|
|
151
|
-
this._getServicePrincipalTokenPromise = null;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
async loginServicePrincipal() {
|
|
155
|
-
const sp = await this._store.getServicePrincipal();
|
|
156
|
-
if (sp) {
|
|
157
|
-
const scope = this.prepareScope(false, this.config.servicePrincipalRequestedScopes);
|
|
158
|
-
const res = await this.tokenClient.getByClientCredentials(sp.id, sp.secret, scope);
|
|
159
|
-
await this._store.setToken(res, this._servicePrincipalTokenId);
|
|
160
|
-
return res;
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
throw Error('Service principal is not registered!');
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
async loginAsServicePrincipal() {
|
|
167
|
-
const token = await this._store.getToken(this._servicePrincipalTokenId);
|
|
168
|
-
if (!token) {
|
|
169
|
-
await this.loginServicePrincipal();
|
|
170
|
-
}
|
|
171
|
-
this._store.setDefaultIdentityId(this._servicePrincipalTokenId);
|
|
172
|
-
}
|
|
173
|
-
async getOtp(type, expiresIn = -1) {
|
|
174
|
-
let url = this.config.getServerUrl(`/otp/create?type=${type}`);
|
|
175
|
-
if (expiresIn > 0) {
|
|
176
|
-
url += `&expiresIn=${expiresIn}`;
|
|
177
|
-
}
|
|
178
|
-
return lastValueFrom(this.http.get(url));
|
|
179
|
-
}
|
|
180
|
-
async getOtpStatus(id) {
|
|
181
|
-
const url = this.config.getServerUrl(`/otp/status/${id}`);
|
|
182
|
-
return lastValueFrom(this.http.get(url));
|
|
183
|
-
}
|
|
184
|
-
getOtpUrl(redirectUrl, password) {
|
|
185
|
-
const encoded = encodeURIComponent(redirectUrl);
|
|
186
|
-
const url = `/otp/auth?otpValue=${password}&returnUrl=${encoded}`;
|
|
187
|
-
return this.config.getServerUrl(url);
|
|
188
|
-
}
|
|
189
|
-
async startServicePrincipalRegistration() {
|
|
190
|
-
const sp = await this._store.getServicePrincipal();
|
|
191
|
-
return await this.tokenClient.getRegistrationCode(sp?.id);
|
|
192
|
-
}
|
|
193
|
-
async completeServicePrincipalRegistration(deviceCode) {
|
|
194
|
-
const tokenRes = await this.waitForDeviceToken(deviceCode);
|
|
195
|
-
const regRes = await this.tokenClient.registerServicePrincipal(tokenRes.accessToken);
|
|
196
|
-
await this._store.setServicePrincipal({
|
|
197
|
-
id: regRes.clientId,
|
|
198
|
-
secret: regRes.clientSecret,
|
|
199
|
-
expiresAt: regRes.secretExpirationDate
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
removeServicePrincipalRegistration() {
|
|
203
|
-
return this._store.removeServicePrincipal();
|
|
204
|
-
}
|
|
205
|
-
async getServicePrincipalRegistrationStatus() {
|
|
206
|
-
const sp = await this._store.getServicePrincipal();
|
|
207
|
-
return new ServicePrincipalRegistrationStatus(sp);
|
|
208
|
-
}
|
|
209
|
-
async startDeviceCodeLogin() {
|
|
210
|
-
const scope = this.prepareScope(true, this.config.requestedScopes);
|
|
211
|
-
return await this.tokenClient.getDeviceCode(scope);
|
|
212
|
-
}
|
|
213
|
-
async completeDeviceCodeLogin(deviceCode) {
|
|
214
|
-
const res = await this.waitForDeviceToken(deviceCode);
|
|
215
|
-
await this._store.setToken(res);
|
|
216
|
-
}
|
|
217
|
-
async waitForDeviceToken(deviceCode) {
|
|
218
|
-
let res = null;
|
|
219
|
-
do {
|
|
220
|
-
if (deviceCode.isExpired()) {
|
|
221
|
-
throw Error('Device code is expired!');
|
|
222
|
-
}
|
|
223
|
-
try {
|
|
224
|
-
res = await this.tokenClient.getByDeviceCode(deviceCode.deviceCode);
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
if (error instanceof AppAuthError && error.message === 'authorization_pending') {
|
|
228
|
-
await this.delay(2000);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
throw error;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
} while (!res);
|
|
235
|
-
return res;
|
|
236
|
-
}
|
|
237
|
-
prepareAuthorizationRequest() {
|
|
238
|
-
const redirectUri = this.config.redirectUrl;
|
|
239
|
-
const params = {
|
|
240
|
-
response_mode: 'fragment',
|
|
241
|
-
prompt: 'consent',
|
|
242
|
-
access_type: 'offline',
|
|
243
|
-
auth_provider_hint: this.config.authProviderHint
|
|
244
|
-
};
|
|
245
|
-
return new AuthorizationRequest({
|
|
246
|
-
client_id: this.config.clientId,
|
|
247
|
-
redirect_uri: redirectUri,
|
|
248
|
-
response_type: AuthorizationRequest.RESPONSE_TYPE_CODE,
|
|
249
|
-
scope: this.prepareScope(true, this.config.requestedScopes),
|
|
250
|
-
extras: params,
|
|
251
|
-
}, this._crypto, true);
|
|
252
|
-
}
|
|
253
|
-
async getServicePrincipalAccessTokenInternal() {
|
|
254
|
-
let token = await this._store.getToken(this._servicePrincipalTokenId);
|
|
255
|
-
if (!token?.isValid()) {
|
|
256
|
-
token = await this.loginServicePrincipal();
|
|
257
|
-
}
|
|
258
|
-
return token?.accessToken;
|
|
259
|
-
}
|
|
260
|
-
async getAccessTokenInternal() {
|
|
261
|
-
let token = await this._store.getToken();
|
|
262
|
-
if (token && !token.isValid()) {
|
|
263
|
-
token = await this.loginWithRefreshToken(token);
|
|
264
|
-
}
|
|
265
|
-
return token?.accessToken;
|
|
266
|
-
}
|
|
267
|
-
async loginWithRefreshToken(token) {
|
|
268
|
-
if (!this._refreshTokenPromise) {
|
|
269
|
-
this._refreshTokenPromise = this.loginWithRefreshTokenInternal(token);
|
|
270
|
-
}
|
|
271
|
-
try {
|
|
272
|
-
return await this._refreshTokenPromise;
|
|
273
|
-
}
|
|
274
|
-
finally {
|
|
275
|
-
this._refreshTokenPromise = null;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
async loginWithRefreshTokenInternal(token) {
|
|
279
|
-
if (token?.refreshToken) {
|
|
280
|
-
try {
|
|
281
|
-
const res = await this.tokenClient.getByRefreshToken(token.refreshToken);
|
|
282
|
-
await this._store.setToken(res);
|
|
283
|
-
return res;
|
|
284
|
-
}
|
|
285
|
-
catch (err) {
|
|
286
|
-
console.warn('Nucleus.Identity: Failed to login with refresh token.', err);
|
|
287
|
-
if (err.message === 'invalid_grant') {
|
|
288
|
-
await this.logout();
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
console.warn('Nucleus.Identity: There is no refresh token available.');
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
getCodeHash(url) {
|
|
297
|
-
const arr = url.split('#');
|
|
298
|
-
if (arr.length > 1) {
|
|
299
|
-
const hash = arr[1];
|
|
300
|
-
if (hash.startsWith('code=')) {
|
|
301
|
-
return hash;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
handleLaunchCodeHash() {
|
|
307
|
-
if (this.appService.isNative && this.appService.launchUrl) {
|
|
308
|
-
const hash = this.getCodeHash(this.appService.launchUrl);
|
|
309
|
-
if (hash) {
|
|
310
|
-
console.log('Nucleus.Identity: Got authorization code from launchUrl, will assign it to hash.');
|
|
311
|
-
window.location.hash = '#' + hash;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
prepareScope(offlineAccess, aditionalScope) {
|
|
316
|
-
let scope = 'openid';
|
|
317
|
-
if (offlineAccess) {
|
|
318
|
-
scope += ' offline_access';
|
|
319
|
-
}
|
|
320
|
-
if (scope) {
|
|
321
|
-
scope += ' ' + aditionalScope;
|
|
322
|
-
}
|
|
323
|
-
return scope;
|
|
324
|
-
}
|
|
325
|
-
delay(miliseconds) {
|
|
326
|
-
return new Promise(resolve => {
|
|
327
|
-
setTimeout(() => {
|
|
328
|
-
resolve();
|
|
329
|
-
}, miliseconds);
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
NucleusIdentityService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusIdentityService, deps: [{ token: i1.NucleusAppService }, { token: i2.LocationService }, { token: i3.HttpClient }, { token: i4.OidcConfigurationService }, { token: i5.TokenClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
334
|
-
NucleusIdentityService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusIdentityService, providedIn: 'root' });
|
|
335
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusIdentityService, decorators: [{
|
|
336
|
-
type: Injectable,
|
|
337
|
-
args: [{
|
|
338
|
-
providedIn: 'root'
|
|
339
|
-
}]
|
|
340
|
-
}], ctorParameters: function () { return [{ type: i1.NucleusAppService }, { type: i2.LocationService }, { type: i3.HttpClient }, { type: i4.OidcConfigurationService }, { type: i5.TokenClient }]; } });
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbnVjbGV1cy1pZGVudGl0eS9zcmMvbGliL251Y2xldXMtaWRlbnRpdHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsb0JBQW9CLEVBR3BCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLFlBQVksRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7O0FBS3JDLE1BQU0sT0FBTyxz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O1FBQ0QsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLElBQUksR0FBRyxHQUFHLGNBQWMsQ0FBQztTQUMvQjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFtQjtRQUMvQixPQUFPLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzttSEF4VlUsc0JBQXNCO3VIQUF0QixzQkFBc0IsY0FGckIsTUFBTTsyRkFFUCxzQkFBc0I7a0JBSGxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBdXRob3JpemF0aW9uUmVxdWVzdCxcclxuICBUb2tlblJlc3BvbnNlLFxyXG4gIENyeXB0byxcclxuICBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyLFxyXG4gIEJhc2ljUXVlcnlTdHJpbmdVdGlscyxcclxuICBMb2NhbFN0b3JhZ2VCYWNrZW5kLFxyXG4gIEFwcEF1dGhFcnJvclxyXG59IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwcCB9IGZyb20gJ0BjYXBhY2l0b3IvYXBwJztcclxuaW1wb3J0IHsgQnJvd3NlciB9IGZyb20gJ0BjYXBhY2l0b3IvYnJvd3Nlcic7XHJcbmltcG9ydCB7IERldmljZSB9IGZyb20gJ0BjYXBhY2l0b3IvZGV2aWNlJztcclxuaW1wb3J0IHsgTnVjbGV1c0NyeXB0byB9IGZyb20gJy4vdXRpbHMvbnVjbGV1cy1jcnlwdG8nO1xyXG5pbXBvcnQgeyBOdWNsZXVzQXBwU2VydmljZSB9IGZyb20gJ0Brb2xla3Rvci9udWNsZXVzLWNvbW1vbic7XHJcbmltcG9ydCB7IExvY2F0aW9uU2VydmljZSB9IGZyb20gJy4vdXRpbHMvbG9jYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhvcml6YXRpb25SZXF1ZXN0SGFuZGxlciB9IGZyb20gJ0BvcGVuaWQvYXBwYXV0aCc7XHJcbmltcG9ydCB7IE51Y2xldXNBdXRob3JpemF0aW9uTm90aWZpZXIgfSBmcm9tICcuL3V0aWxzL251Y2xldXMtYXV0aG9yaXphdGlvbi1ub3RpZmllcic7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE90cFJlc3BvbnNlLCBPdHBTdGF0dXMsIE90cFR5cGUgfSBmcm9tICcuL21vZGVscy9vdHAnO1xyXG5pbXBvcnQgeyBTZWNyZXRzU3RvcmUgfSBmcm9tICcuL3V0aWxzL3NlY3JldHMtc3RvcmUnO1xyXG5pbXBvcnQgeyBPaWRjQ29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuL3V0aWxzL29pZGMtY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9rZW5DbGllbnQgfSBmcm9tICcuL3V0aWxzL3Rva2VuLWNsaWVudCc7XHJcbmltcG9ydCB7IERldmljZUNvZGUgfSBmcm9tICcuL21vZGVscy9kZXZpY2UtY29kZSc7XHJcbmltcG9ydCB7IFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb25TdGF0dXMgfSBmcm9tICcuL21vZGVscy9zZXJ2aWNlLXByaW5jaXBhbCc7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIE51Y2xldXNJZGVudGl0eVNlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhcHBTZXJ2aWNlOiBOdWNsZXVzQXBwU2VydmljZSxcclxuICAgIGxvY2F0aW9uOiBMb2NhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGNvbmZpZzogT2lkY0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2tlbkNsaWVudDogVG9rZW5DbGllbnRcclxuICApIHtcclxuICAgIGNvbnN0IHN0b3JhZ2UgPSBuZXcgTG9jYWxTdG9yYWdlQmFja2VuZCgpO1xyXG4gICAgdGhpcy5fY3J5cHRvID0gbmV3IE51Y2xldXNDcnlwdG8oKTtcclxuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IYW5kbGVyID0gbmV3IFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIoc3RvcmFnZSwgbmV3IEJhc2ljUXVlcnlTdHJpbmdVdGlscygpLCBsb2NhdGlvbiwgdGhpcy5fY3J5cHRvKTtcclxuICAgIHRoaXMuX2F1dGhvcml6YXRpb25IYW5kbGVyLnNldEF1dGhvcml6YXRpb25Ob3RpZmllcih0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIpO1xyXG4gICAgdGhpcy5fc3RvcmUgPSBuZXcgU2VjcmV0c1N0b3JlKGNvbmZpZy5jbGllbnRJZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hdXRob3JpemF0aW9uSGFuZGxlcjogQXV0aG9yaXphdGlvblJlcXVlc3RIYW5kbGVyO1xyXG4gIHByaXZhdGUgX2F1dGhvcml6YXRpb25Ob3RpZmllciA9IG5ldyBOdWNsZXVzQXV0aG9yaXphdGlvbk5vdGlmaWVyKCk7XHJcbiAgcHJpdmF0ZSBfY3J5cHRvOiBDcnlwdG87XHJcbiAgcHJpdmF0ZSBfaW5pdFN0YXJ0ZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3JlZnJlc2hUb2tlblByb21pc2U6IFByb21pc2U8VG9rZW5SZXNwb25zZT47XHJcbiAgcHJpdmF0ZSBfZ2V0VG9rZW5Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XHJcbiAgcHJpdmF0ZSBfZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+O1xyXG4gIHByaXZhdGUgX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkID0gJ19zdmNwJztcclxuICBwcml2YXRlIF9zdG9yZTogU2VjcmV0c1N0b3JlO1xyXG5cclxuICBwdWJsaWMgZ2V0IGlkZW50aXR5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldElkZW50aXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzQXV0aGVudGljYXRlZCgpIHtcclxuICAgIHJldHVybiB0aGlzLmlkZW50aXR5ICE9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlcnZpY2VQcmluY2lwYWxJZGVudGl0eSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRJZGVudGl0eSh0aGlzLl9zZXJ2aWNlUHJpbmNpcGFsVG9rZW5JZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGlzU2VydmljZVByaW5jaXBhbEF1dGhlbnRpY2F0ZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsSWRlbnRpdHkgIT0gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaXNJZGVudGl0eVNlcnZpY2VQcmluY2lwYWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZGVmYXVsdElkZW50aXR5SWQgPT09IHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGluaXQoc3RhcnRMb2dpbjogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5faW5pdFN0YXJ0ZWQgfHwgdGhpcy5faW5pdGlhbGl6ZWQpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdOdWNsZXVzLklkZW50aXR5OiBBdXRoIGluaXRpYWxpemF0aW9uIHdhcyBhbHJlYWR5IHN0YXJ0ZWQuIERvblxcJ3QgY2FsbCBpbml0KCkgbXVsdGlwbGUgdGltZXMhJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX2luaXRTdGFydGVkID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmhhbmRsZUxhdW5jaENvZGVIYXNoKCk7XHJcbiAgICBhd2FpdCB0aGlzLl9hdXRob3JpemF0aW9uSGFuZGxlci5jb21wbGV0ZUF1dGhvcml6YXRpb25SZXF1ZXN0SWZQb3NzaWJsZSgpO1xyXG5cclxuICAgIGNvbnN0IGF1dGhFcnIgPSB0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIuZXJyb3I7XHJcbiAgICBpZiAoYXV0aEVycikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhvcml6YXRpb24gZXJyOiAnICsgYXV0aEVyci5lcnJvciArICc6ICcgKyBhdXRoRXJyLmVycm9yRGVzY3JpcHRpb24pO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9hdXRob3JpemF0aW9uTm90aWZpZXIucmVzcG9uc2UpIHtcclxuICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSAnJztcclxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2F1dGhvcml6YXRpb25Ob3RpZmllci5yZXF1ZXN0O1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IHRoaXMuX2F1dGhvcml6YXRpb25Ob3RpZmllci5yZXNwb25zZTtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy50b2tlbkNsaWVudC5nZXRCeUF1dGhvcml6YXRpb25Db2RlKHJlcXVlc3QucmVkaXJlY3RVcmksIHJlc3BvbnNlLmNvZGUsIHJlcXVlc3QuaW50ZXJuYWxbJ2NvZGVfdmVyaWZpZXInXSk7XHJcbiAgICAgIHRoaXMuX3N0b3JlLnNldERlZmF1bHRJZGVudGl0eUlkKG51bGwpO1xyXG4gICAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4oKTtcclxuICAgICAgaWYgKCFyZXMgJiYgc3RhcnRMb2dpbikge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9naW4oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ2luV2l0aFNlY3JldChwcm92aWRlcjogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fc3RvcmUucmVtb3ZlVG9rZW4oKTtcclxuICAgIGNvbnN0IGFzc2VydGlvblRva2VuID0gYXdhaXQgdGhpcy5nZXRTZXJ2aWNlUHJpbmNpcGFsQWNjZXNzVG9rZW4oKTtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5wcmVwYXJlU2NvcGUodHJ1ZSwgdGhpcy5jb25maWc/LnJlcXVlc3RlZFNjb3Blcyk7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5U2VjcmV0KHByb3ZpZGVyLCBzZWNyZXQsIGFzc2VydGlvblRva2VuLCBzY29wZSk7XHJcbiAgICB0aGlzLl9zdG9yZS5zZXREZWZhdWx0SWRlbnRpdHlJZChudWxsKTtcclxuICAgIGF3YWl0IHRoaXMuX3N0b3JlLnNldFRva2VuKHJlcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9naW4oKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zdG9yZS5yZW1vdmVUb2tlbigpO1xyXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0Q29uZmlndXJhdGlvbigpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucHJlcGFyZUF1dGhvcml6YXRpb25SZXF1ZXN0KCk7XHJcbiAgICBpZiAodGhpcy5hcHBTZXJ2aWNlLmlzTmF0aXZlKSB7XHJcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgZGF0YSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXBwU2VydmljZS5wbGF0Zm9ybSA9PT0gJ2lvcycpIHtcclxuICAgICAgICAgIEJyb3dzZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuZ2V0Q29kZUhhc2goZGF0YS51cmwpO1xyXG4gICAgICAgIGlmIChoYXNoKSB7XHJcbiAgICAgICAgICBjb25zdCB0YXJnZXRVcmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgJyMnICsgaGFzaDtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24odGFyZ2V0VXJsKTtcclxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdOdWNsZXVzLklkZW50aXR5OiBSZWRpcmVjdCB1cmwgZGlkIG5vdCBjb250YWluIGF1dGhvcml6YXRpb24gY29kZSEnLCBkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYXV0aG9yaXphdGlvbkhhbmRsZXIucGVyZm9ybUF1dGhvcml6YXRpb25SZXF1ZXN0KGNvbmZpZywgcmVxdWVzdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5fc3RvcmUucmVtb3ZlVG9rZW4oKTtcclxuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKTtcclxuICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XHJcbiAgICBjb25zdCBsb2dvdXRVcmwgPSBjb25maWcuZW5kU2Vzc2lvbkVuZHBvaW50ICsgJz9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JyArIGVuY29kZVVSSShyZWRpcmVjdFVybCk7XHJcbiAgICBpZiAodGhpcy5hcHBTZXJ2aWNlLmlzTmF0aXZlKSB7XHJcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgKCkgPT4ge1xyXG4gICAgICAgIERldmljZS5nZXRJbmZvKCkudGhlbihpbmZvID0+IHtcclxuICAgICAgICAgIGlmIChpbmZvLnBsYXRmb3JtID09PSAnaW9zJykge1xyXG4gICAgICAgICAgICBCcm93c2VyLmNsb3NlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICBCcm93c2VyLm9wZW4oeyB1cmw6IGxvZ291dFVybCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24obG9nb3V0VXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpIHtcclxuICAgIGlmICghdGhpcy5fZ2V0VG9rZW5Qcm9taXNlKSB7XHJcbiAgICAgIHRoaXMuX2dldFRva2VuUHJvbWlzZSA9IHRoaXMuZ2V0QWNjZXNzVG9rZW5JbnRlcm5hbCgpO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2dldFRva2VuUHJvbWlzZTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2dldFRva2VuUHJvbWlzZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0U2VydmljZVByaW5jaXBhbEFjY2Vzc1Rva2VuKCkge1xyXG4gICAgaWYgKCF0aGlzLl9nZXRTZXJ2aWNlUHJpbmNpcGFsVG9rZW5Qcm9taXNlKSB7XHJcbiAgICAgIHRoaXMuX2dldFNlcnZpY2VQcmluY2lwYWxUb2tlblByb21pc2UgPSB0aGlzLmdldFNlcnZpY2VQcmluY2lwYWxBY2Nlc3NUb2tlbkludGVybmFsKCk7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0U2VydmljZVByaW5jaXBhbFRva2VuUHJvbWlzZTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX2dldFNlcnZpY2VQcmluY2lwYWxUb2tlblByb21pc2UgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGxvZ2luU2VydmljZVByaW5jaXBhbCgpIHtcclxuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xyXG4gICAgaWYgKHNwKSB7XHJcbiAgICAgIGNvbnN0IHNjb3BlID0gdGhpcy5wcmVwYXJlU2NvcGUoZmFsc2UsIHRoaXMuY29uZmlnLnNlcnZpY2VQcmluY2lwYWxSZXF1ZXN0ZWRTY29wZXMpO1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5Q2xpZW50Q3JlZGVudGlhbHMoc3AuaWQsIHNwLnNlY3JldCwgc2NvcGUpO1xyXG4gICAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRUb2tlbihyZXMsIHRoaXMuX3NlcnZpY2VQcmluY2lwYWxUb2tlbklkKTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IEVycm9yKCdTZXJ2aWNlIHByaW5jaXBhbCBpcyBub3QgcmVnaXN0ZXJlZCEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2dpbkFzU2VydmljZVByaW5jaXBhbCgpIHtcclxuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4odGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xyXG4gICAgaWYgKCF0b2tlbikge1xyXG4gICAgICBhd2FpdCB0aGlzLmxvZ2luU2VydmljZVByaW5jaXBhbCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc3RvcmUuc2V0RGVmYXVsdElkZW50aXR5SWQodGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldE90cCh0eXBlOiBPdHBUeXBlLCBleHBpcmVzSW46IG51bWJlciA9IC0xKSB7XHJcbiAgICBsZXQgdXJsID0gdGhpcy5jb25maWcuZ2V0U2VydmVyVXJsKGAvb3RwL2NyZWF0ZT90eXBlPSR7dHlwZX1gKTtcclxuICAgIGlmIChleHBpcmVzSW4gPiAwKSB7XHJcbiAgICAgIHVybCArPSBgJmV4cGlyZXNJbj0ke2V4cGlyZXNJbn1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxPdHBSZXNwb25zZT4odXJsKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0T3RwU3RhdHVzKGlkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuY29uZmlnLmdldFNlcnZlclVybChgL290cC9zdGF0dXMvJHtpZH1gKTtcclxuICAgIHJldHVybiBsYXN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQ8T3RwU3RhdHVzPih1cmwpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPdHBVcmwocmVkaXJlY3RVcmw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVybCk7XHJcbiAgICBjb25zdCB1cmwgPSBgL290cC9hdXRoP290cFZhbHVlPSR7cGFzc3dvcmR9JnJldHVyblVybD0ke2VuY29kZWR9YDtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5nZXRTZXJ2ZXJVcmwodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdGFydFNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oKSB7XHJcbiAgICBjb25zdCBzcCA9IGF3YWl0IHRoaXMuX3N0b3JlLmdldFNlcnZpY2VQcmluY2lwYWwoKTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldFJlZ2lzdHJhdGlvbkNvZGUoc3A/LmlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjb21wbGV0ZVNlcnZpY2VQcmluY2lwYWxSZWdpc3RyYXRpb24oZGV2aWNlQ29kZTogRGV2aWNlQ29kZSkge1xyXG4gICAgY29uc3QgdG9rZW5SZXMgPSBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VUb2tlbihkZXZpY2VDb2RlKTtcclxuICAgIGNvbnN0IHJlZ1JlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQucmVnaXN0ZXJTZXJ2aWNlUHJpbmNpcGFsKHRva2VuUmVzLmFjY2Vzc1Rva2VuKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLl9zdG9yZS5zZXRTZXJ2aWNlUHJpbmNpcGFsKHtcclxuICAgICAgaWQ6IHJlZ1Jlcy5jbGllbnRJZCxcclxuICAgICAgc2VjcmV0OiByZWdSZXMuY2xpZW50U2VjcmV0LFxyXG4gICAgICBleHBpcmVzQXQ6IHJlZ1Jlcy5zZWNyZXRFeHBpcmF0aW9uRGF0ZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlU2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdG9yZS5yZW1vdmVTZXJ2aWNlUHJpbmNpcGFsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0U2VydmljZVByaW5jaXBhbFJlZ2lzdHJhdGlvblN0YXR1cygpIHtcclxuICAgIGNvbnN0IHNwID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0U2VydmljZVByaW5jaXBhbCgpO1xyXG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlUHJpbmNpcGFsUmVnaXN0cmF0aW9uU3RhdHVzKHNwKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdGFydERldmljZUNvZGVMb2dpbigpIHtcclxuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5wcmVwYXJlU2NvcGUodHJ1ZSwgdGhpcy5jb25maWcucmVxdWVzdGVkU2NvcGVzKTtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldERldmljZUNvZGUoc2NvcGUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNvbXBsZXRlRGV2aWNlQ29kZUxvZ2luKGRldmljZUNvZGU6IERldmljZUNvZGUpIHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMud2FpdEZvckRldmljZVRva2VuKGRldmljZUNvZGUpO1xyXG4gICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZVRva2VuKGRldmljZUNvZGU6IERldmljZUNvZGUpIHtcclxuICAgIGxldCByZXM6IFRva2VuUmVzcG9uc2UgPSBudWxsO1xyXG4gICAgZG8ge1xyXG4gICAgICBpZiAoZGV2aWNlQ29kZS5pc0V4cGlyZWQoKSkge1xyXG4gICAgICAgIHRocm93IEVycm9yKCdEZXZpY2UgY29kZSBpcyBleHBpcmVkIScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJlcyA9IGF3YWl0IHRoaXMudG9rZW5DbGllbnQuZ2V0QnlEZXZpY2VDb2RlKGRldmljZUNvZGUuZGV2aWNlQ29kZSk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBwQXV0aEVycm9yICYmIGVycm9yLm1lc3NhZ2UgPT09ICdhdXRob3JpemF0aW9uX3BlbmRpbmcnKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGF5KDIwMDApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gd2hpbGUgKCFyZXMpO1xyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZUF1dGhvcml6YXRpb25SZXF1ZXN0KCk6IEF1dGhvcml6YXRpb25SZXF1ZXN0IHtcclxuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gdGhpcy5jb25maWcucmVkaXJlY3RVcmw7XHJcblxyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICByZXNwb25zZV9tb2RlOiAnZnJhZ21lbnQnLFxyXG4gICAgICBwcm9tcHQ6ICdjb25zZW50JyxcclxuICAgICAgYWNjZXNzX3R5cGU6ICdvZmZsaW5lJyxcclxuICAgICAgYXV0aF9wcm92aWRlcl9oaW50OiB0aGlzLmNvbmZpZy5hdXRoUHJvdmlkZXJIaW50XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvblJlcXVlc3Qoe1xyXG4gICAgICBjbGllbnRfaWQ6IHRoaXMuY29uZmlnLmNsaWVudElkLFxyXG4gICAgICByZWRpcmVjdF91cmk6IHJlZGlyZWN0VXJpLFxyXG4gICAgICByZXNwb25zZV90eXBlOiBBdXRob3JpemF0aW9uUmVxdWVzdC5SRVNQT05TRV9UWVBFX0NPREUsXHJcbiAgICAgIHNjb3BlOiB0aGlzLnByZXBhcmVTY29wZSh0cnVlLCB0aGlzLmNvbmZpZy5yZXF1ZXN0ZWRTY29wZXMpLFxyXG4gICAgICBleHRyYXM6IHBhcmFtcyxcclxuICAgIH0sIHRoaXMuX2NyeXB0bywgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldFNlcnZpY2VQcmluY2lwYWxBY2Nlc3NUb2tlbkludGVybmFsKCkge1xyXG4gICAgbGV0IHRva2VuID0gYXdhaXQgdGhpcy5fc3RvcmUuZ2V0VG9rZW4odGhpcy5fc2VydmljZVByaW5jaXBhbFRva2VuSWQpO1xyXG4gICAgaWYgKCF0b2tlbj8uaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRva2VuID0gYXdhaXQgdGhpcy5sb2dpblNlcnZpY2VQcmluY2lwYWwoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0b2tlbj8uYWNjZXNzVG9rZW47XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGdldEFjY2Vzc1Rva2VuSW50ZXJuYWwoKSB7XHJcbiAgICBsZXQgdG9rZW4gPSBhd2FpdCB0aGlzLl9zdG9yZS5nZXRUb2tlbigpO1xyXG4gICAgaWYgKHRva2VuICYmICF0b2tlbi5pc1ZhbGlkKCkpIHtcclxuICAgICAgdG9rZW4gPSBhd2FpdCB0aGlzLmxvZ2luV2l0aFJlZnJlc2hUb2tlbih0b2tlbik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9rZW4/LmFjY2Vzc1Rva2VuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhSZWZyZXNoVG9rZW4odG9rZW46IFRva2VuUmVzcG9uc2UpIHtcclxuICAgIGlmICghdGhpcy5fcmVmcmVzaFRva2VuUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLl9yZWZyZXNoVG9rZW5Qcm9taXNlID0gdGhpcy5sb2dpbldpdGhSZWZyZXNoVG9rZW5JbnRlcm5hbCh0b2tlbik7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fcmVmcmVzaFRva2VuUHJvbWlzZTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuX3JlZnJlc2hUb2tlblByb21pc2UgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhSZWZyZXNoVG9rZW5JbnRlcm5hbCh0b2tlbjogVG9rZW5SZXNwb25zZSkge1xyXG4gICAgaWYgKHRva2VuPy5yZWZyZXNoVG9rZW4pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnRva2VuQ2xpZW50LmdldEJ5UmVmcmVzaFRva2VuKHRva2VuLnJlZnJlc2hUb2tlbik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmUuc2V0VG9rZW4ocmVzKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ051Y2xldXMuSWRlbnRpdHk6IEZhaWxlZCB0byBsb2dpbiB3aXRoIHJlZnJlc2ggdG9rZW4uJywgZXJyKTtcclxuICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgPT09ICdpbnZhbGlkX2dyYW50Jykge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignTnVjbGV1cy5JZGVudGl0eTogVGhlcmUgaXMgbm8gcmVmcmVzaCB0b2tlbiBhdmFpbGFibGUuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvZGVIYXNoKHVybDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJyMnKTtcclxuICAgIGlmIChhcnIubGVuZ3RoID4gMSkge1xyXG4gICAgICBjb25zdCBoYXNoID0gYXJyWzFdO1xyXG4gICAgICBpZiAoaGFzaC5zdGFydHNXaXRoKCdjb2RlPScpKSB7XHJcbiAgICAgICAgcmV0dXJuIGhhc2g7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVMYXVuY2hDb2RlSGFzaCgpIHtcclxuICAgIGlmICh0aGlzLmFwcFNlcnZpY2UuaXNOYXRpdmUgJiYgdGhpcy5hcHBTZXJ2aWNlLmxhdW5jaFVybCkge1xyXG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5nZXRDb2RlSGFzaCh0aGlzLmFwcFNlcnZpY2UubGF1bmNoVXJsKTtcclxuICAgICAgaWYgKGhhc2gpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnTnVjbGV1cy5JZGVudGl0eTogR290IGF1dGhvcml6YXRpb24gY29kZSBmcm9tIGxhdW5jaFVybCwgd2lsbCBhc3NpZ24gaXQgdG8gaGFzaC4nKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9ICcjJyArIGhhc2g7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJlcGFyZVNjb3BlKG9mZmxpbmVBY2Nlc3M6IGJvb2xlYW4sIGFkaXRpb25hbFNjb3BlOiBzdHJpbmcpIHtcclxuICAgIGxldCBzY29wZSA9ICdvcGVuaWQnO1xyXG4gICAgaWYgKG9mZmxpbmVBY2Nlc3MpIHtcclxuICAgICAgc2NvcGUgKz0gJyBvZmZsaW5lX2FjY2Vzcyc7XHJcbiAgICB9XHJcbiAgICBpZiAoc2NvcGUpIHtcclxuICAgICAgc2NvcGUgKz0gJyAnICsgYWRpdGlvbmFsU2NvcGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2NvcGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGF5KG1pbGlzZWNvbmRzOiBudW1iZXIpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LCBtaWxpc2Vjb25kcyk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
3
|
-
import { from, throwError } from 'rxjs';
|
|
4
|
-
import { NucleusIdentityConfig } from './nucleus-identity-config';
|
|
5
|
-
import { NucleusIdentityService } from './nucleus-identity.service';
|
|
6
|
-
import { mergeMap, catchError } from 'rxjs/operators';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "./nucleus-identity.service";
|
|
9
|
-
import * as i2 from "./nucleus-identity-config";
|
|
10
|
-
export class NucleusTokenInterceptor {
|
|
11
|
-
constructor(auth, config) {
|
|
12
|
-
this.auth = auth;
|
|
13
|
-
this.config = config;
|
|
14
|
-
this._authorityInterceptPaths = ['/api', '/manage', '/otp/create', '/otp/status'];
|
|
15
|
-
this._authority = config.authority.toLowerCase();
|
|
16
|
-
this._interceptUrls = config.httpInterceptorUrls?.map(x => x.toLowerCase());
|
|
17
|
-
}
|
|
18
|
-
intercept(req, next) {
|
|
19
|
-
if (this.shouldIntercept(req.url)) {
|
|
20
|
-
const res = this.authorizeRequest(this.auth.getAccessToken(), req, next);
|
|
21
|
-
return this.checkUnauthorized(res);
|
|
22
|
-
}
|
|
23
|
-
return next.handle(req);
|
|
24
|
-
}
|
|
25
|
-
shouldIntercept(url) {
|
|
26
|
-
url = url.toLowerCase();
|
|
27
|
-
if (url.startsWith(this._authority)) {
|
|
28
|
-
const pathname = new URL(url).pathname;
|
|
29
|
-
return (this._authorityInterceptPaths.some(x => pathname.startsWith(x)));
|
|
30
|
-
}
|
|
31
|
-
if (this._interceptUrls?.length > 0) {
|
|
32
|
-
return this.config.httpInterceptorUrls.some(x => url.startsWith(x));
|
|
33
|
-
}
|
|
34
|
-
return false;
|
|
35
|
-
}
|
|
36
|
-
authorizeRequest(getToken, req, next) {
|
|
37
|
-
return from(getToken).pipe(mergeMap(token => {
|
|
38
|
-
if (token) {
|
|
39
|
-
const headers = req.headers.set('Authorization', `Bearer ${token}`);
|
|
40
|
-
req = req.clone({ headers });
|
|
41
|
-
}
|
|
42
|
-
return next.handle(req);
|
|
43
|
-
}));
|
|
44
|
-
}
|
|
45
|
-
checkUnauthorized(response) {
|
|
46
|
-
return response.pipe(catchError((err) => {
|
|
47
|
-
if (err instanceof HttpErrorResponse && err.status === 401) {
|
|
48
|
-
if (this.config.automaticLoginOnHttp401) {
|
|
49
|
-
this.auth.login();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return throwError(err);
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
NucleusTokenInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusTokenInterceptor, deps: [{ token: i1.NucleusIdentityService }, { token: i2.NucleusIdentityConfig }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
57
|
-
NucleusTokenInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusTokenInterceptor, providedIn: 'root' });
|
|
58
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: NucleusTokenInterceptor, decorators: [{
|
|
59
|
-
type: Injectable,
|
|
60
|
-
args: [{
|
|
61
|
-
providedIn: 'root'
|
|
62
|
-
}]
|
|
63
|
-
}], ctorParameters: function () { return [{ type: i1.NucleusIdentityService }, { type: i2.NucleusIdentityConfig }]; } });
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVjbGV1cy10b2tlbi1pbnRlcmNlcHRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbnVjbGV1cy1pZGVudGl0eS9zcmMvbGliL251Y2xldXMtdG9rZW4taW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBd0QsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBS3RELE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFBb0IsSUFBNEIsRUFBVSxNQUE2QjtRQUFuRSxTQUFJLEdBQUosSUFBSSxDQUF3QjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQXVCO1FBTy9FLDZCQUF3QixHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFMbkYsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFNTSxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUN2RCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRU8sZUFBZSxDQUFDLEdBQVc7UUFDakMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV4QixJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQXlCLEVBQUUsR0FBcUIsRUFBRSxJQUFpQjtRQUMxRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3hCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNmLElBQUksS0FBSyxFQUFFO2dCQUNQLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxVQUFVLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNoQztZQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQW9DO1FBQzVELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FDbEIsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDakIsSUFBSSxHQUFHLFlBQVksaUJBQWlCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUU7Z0JBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDbkI7YUFDRjtZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOztvSEF4RFUsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTsyRkFFUCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOdWNsZXVzSWRlbnRpdHlDb25maWcgfSBmcm9tICcuL251Y2xldXMtaWRlbnRpdHktY29uZmlnJztcclxuaW1wb3J0IHsgTnVjbGV1c0lkZW50aXR5U2VydmljZSB9IGZyb20gJy4vbnVjbGV1cy1pZGVudGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgbWVyZ2VNYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOdWNsZXVzVG9rZW5JbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBOdWNsZXVzSWRlbnRpdHlTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZzogTnVjbGV1c0lkZW50aXR5Q29uZmlnXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9hdXRob3JpdHkgPSBjb25maWcuYXV0aG9yaXR5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICB0aGlzLl9pbnRlcmNlcHRVcmxzID0gY29uZmlnLmh0dHBJbnRlcmNlcHRvclVybHM/Lm1hcCh4ID0+IHgudG9Mb3dlckNhc2UoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hdXRob3JpdHk6IHN0cmluZztcclxuICBwcml2YXRlIF9hdXRob3JpdHlJbnRlcmNlcHRQYXRocyA9IFsnL2FwaScsICcvbWFuYWdlJywgJy9vdHAvY3JlYXRlJywgJy9vdHAvc3RhdHVzJ107XHJcbiAgcHJpdmF0ZSBfaW50ZXJjZXB0VXJsczogc3RyaW5nW107XHJcblxyXG4gIHB1YmxpYyBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgIGlmICh0aGlzLnNob3VsZEludGVyY2VwdChyZXEudXJsKSkge1xyXG4gICAgICBjb25zdCByZXMgPSB0aGlzLmF1dGhvcml6ZVJlcXVlc3QodGhpcy5hdXRoLmdldEFjY2Vzc1Rva2VuKCksIHJlcSwgbmV4dCk7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrVW5hdXRob3JpemVkKHJlcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvdWxkSW50ZXJjZXB0KHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB1cmwgPSB1cmwudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgodGhpcy5fYXV0aG9yaXR5KSkge1xyXG4gICAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwodXJsKS5wYXRobmFtZTtcclxuICAgICAgcmV0dXJuICh0aGlzLl9hdXRob3JpdHlJbnRlcmNlcHRQYXRocy5zb21lKHggPT4gcGF0aG5hbWUuc3RhcnRzV2l0aCh4KSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pbnRlcmNlcHRVcmxzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5odHRwSW50ZXJjZXB0b3JVcmxzLnNvbWUoeCA9PiB1cmwuc3RhcnRzV2l0aCh4KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGF1dGhvcml6ZVJlcXVlc3QoZ2V0VG9rZW46IFByb21pc2U8c3RyaW5nPiwgcmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuICAgIHJldHVybiBmcm9tKGdldFRva2VuKS5waXBlKFxyXG4gICAgICBtZXJnZU1hcCh0b2tlbiA9PiB7XHJcbiAgICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCBgQmVhcmVyICR7dG9rZW59YCk7XHJcbiAgICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7IGhlYWRlcnMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tVbmF1dGhvcml6ZWQocmVzcG9uc2U6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj4ge1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLnBpcGUoXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnIuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5hdXRvbWF0aWNMb2dpbk9uSHR0cDQwMSkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGgubG9naW4oKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { AppAuthError, Requestor } from '@openid/appauth';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/common/http";
|
|
6
|
-
export class AngularRequestor extends Requestor {
|
|
7
|
-
constructor(http) {
|
|
8
|
-
super();
|
|
9
|
-
this.http = http;
|
|
10
|
-
}
|
|
11
|
-
// eslint-disable-next-line no-undef
|
|
12
|
-
xhr(settings) {
|
|
13
|
-
if (settings.method === undefined) {
|
|
14
|
-
settings.method = 'GET';
|
|
15
|
-
}
|
|
16
|
-
return new Promise((resolve, reject) => {
|
|
17
|
-
this.http.request(settings.method, settings.url, {
|
|
18
|
-
body: settings.data,
|
|
19
|
-
headers: settings.headers,
|
|
20
|
-
}).subscribe(res => resolve(res), err => {
|
|
21
|
-
let e = new AppAuthError(err);
|
|
22
|
-
if (err instanceof HttpErrorResponse) {
|
|
23
|
-
e = new AppAuthError(err.error?.error || err.statusText);
|
|
24
|
-
}
|
|
25
|
-
reject(e);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
AngularRequestor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularRequestor, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
31
|
-
AngularRequestor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularRequestor, providedIn: 'root' });
|
|
32
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularRequestor, decorators: [{
|
|
33
|
-
type: Injectable,
|
|
34
|
-
args: [{
|
|
35
|
-
providedIn: 'root'
|
|
36
|
-
}]
|
|
37
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1yZXF1ZXN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvdXRpbHMvYW5ndWxhci1yZXF1ZXN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBS3JFLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBRTdDLFlBQW9CLElBQWdCO1FBQ2xDLEtBQUssRUFBRSxDQUFDO1FBRFUsU0FBSSxHQUFKLElBQUksQ0FBWTtJQUVwQyxDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLEdBQUcsQ0FBSSxRQUE0QjtRQUNqQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQ2pDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3pCO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBSSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO2FBQzFCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5QixJQUFJLEdBQUcsWUFBWSxpQkFBaUIsRUFBRTtvQkFDcEMsQ0FBQyxHQUFHLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDMUQ7Z0JBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OzZHQXZCVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQixjQUZmLE1BQU07MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcEF1dGhFcnJvciwgUmVxdWVzdG9yIH0gZnJvbSAnQG9wZW5pZC9hcHBhdXRoJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJSZXF1ZXN0b3IgZXh0ZW5kcyBSZXF1ZXN0b3Ige1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcclxuICB4aHI8VD4oc2V0dGluZ3M6IEpRdWVyeUFqYXhTZXR0aW5ncyk6IFByb21pc2U8VD4ge1xyXG4gICAgaWYgKHNldHRpbmdzLm1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHNldHRpbmdzLm1ldGhvZCA9ICdHRVQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwLnJlcXVlc3Q8VD4oc2V0dGluZ3MubWV0aG9kLCBzZXR0aW5ncy51cmwsIHtcclxuICAgICAgICBib2R5OiBzZXR0aW5ncy5kYXRhLFxyXG4gICAgICAgIGhlYWRlcnM6IHNldHRpbmdzLmhlYWRlcnMsXHJcbiAgICAgIH0pLnN1YnNjcmliZShyZXMgPT4gcmVzb2x2ZShyZXMpLCBlcnIgPT4ge1xyXG4gICAgICAgIGxldCBlID0gbmV3IEFwcEF1dGhFcnJvcihlcnIpO1xyXG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgZSA9IG5ldyBBcHBBdXRoRXJyb3IoZXJyLmVycm9yPy5lcnJvciB8fCBlcnIuc3RhdHVzVGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { AuthorizationServiceConfiguration, JQueryRequestor } from '@openid/appauth';
|
|
2
|
-
const WELL_KNOWN_PATH = '.well-known';
|
|
3
|
-
const OPENID_CONFIGURATION = 'openid-configuration';
|
|
4
|
-
export class NucleusAuthorizationServiceConfiguration extends AuthorizationServiceConfiguration {
|
|
5
|
-
constructor(request) {
|
|
6
|
-
super(request);
|
|
7
|
-
this.deviceAuthorizationEndpoint = request.device_authorization_endpoint;
|
|
8
|
-
this.registrationEndpoint = request.registration_endpoint;
|
|
9
|
-
}
|
|
10
|
-
static fetchFromIssuer(openIdIssuerUrl, requestor) {
|
|
11
|
-
const fullUrl = `${openIdIssuerUrl}/${WELL_KNOWN_PATH}/${OPENID_CONFIGURATION}`;
|
|
12
|
-
const requestorToUse = requestor || new JQueryRequestor();
|
|
13
|
-
return requestorToUse
|
|
14
|
-
.xhr({ url: fullUrl, dataType: 'json', method: 'GET' })
|
|
15
|
-
.then(json => new NucleusAuthorizationServiceConfiguration(json));
|
|
16
|
-
}
|
|
17
|
-
toJson() {
|
|
18
|
-
const res = super.toJson();
|
|
19
|
-
res.device_authorization_endpoint = this.deviceAuthorizationEndpoint;
|
|
20
|
-
return res;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi1zZXJ2aWNlLWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9udWNsZXVzLWlkZW50aXR5L3NyYy9saWIvdXRpbHMvYXV0aG9yaXphdGlvbi1zZXJ2aWNlLWNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlDQUFpQyxFQUF5QyxlQUFlLEVBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUV2SSxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUM7QUFDdEMsTUFBTSxvQkFBb0IsR0FBRyxzQkFBc0IsQ0FBQztBQU9wRCxNQUFNLE9BQU8sd0NBQXlDLFNBQVEsaUNBQWlDO0lBRTdGLFlBQVksT0FBcUQ7UUFDL0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLDJCQUEyQixHQUFHLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQztRQUN6RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO0lBQzVELENBQUM7SUFLRCxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQXVCLEVBQUUsU0FBcUI7UUFDbkUsTUFBTSxPQUFPLEdBQUcsR0FBRyxlQUFlLElBQUksZUFBZSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDaEYsTUFBTSxjQUFjLEdBQUcsU0FBUyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7UUFDMUQsT0FBTyxjQUFjO2FBQ2hCLEdBQUcsQ0FBK0MsRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxDQUFDO2FBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksd0NBQXdDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQWtELENBQUM7UUFDM0UsR0FBRyxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUNyRSxPQUFPLEdBQVUsQ0FBQztJQUNwQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb24sIEF1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbkpzb24sIEpRdWVyeVJlcXVlc3RvciwgUmVxdWVzdG9yIH0gZnJvbSAnQG9wZW5pZC9hcHBhdXRoJztcclxuXHJcbmNvbnN0IFdFTExfS05PV05fUEFUSCA9ICcud2VsbC1rbm93bic7XHJcbmNvbnN0IE9QRU5JRF9DT05GSUdVUkFUSU9OID0gJ29wZW5pZC1jb25maWd1cmF0aW9uJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTnVjbGV1c0F1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbkpzb24gZXh0ZW5kcyBBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb25Kc29uICB7XHJcbiAgZGV2aWNlX2F1dGhvcml6YXRpb25fZW5kcG9pbnQ/OiBzdHJpbmc7XHJcbiAgcmVnaXN0cmF0aW9uX2VuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTnVjbGV1c0F1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbiBleHRlbmRzIEF1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbiB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IE51Y2xldXNBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb25Kc29uKSB7XHJcbiAgICBzdXBlcihyZXF1ZXN0KTtcclxuICAgIHRoaXMuZGV2aWNlQXV0aG9yaXphdGlvbkVuZHBvaW50ID0gcmVxdWVzdC5kZXZpY2VfYXV0aG9yaXphdGlvbl9lbmRwb2ludDtcclxuICAgIHRoaXMucmVnaXN0cmF0aW9uRW5kcG9pbnQgPSByZXF1ZXN0LnJlZ2lzdHJhdGlvbl9lbmRwb2ludDtcclxuICB9XHJcblxyXG4gIGRldmljZUF1dGhvcml6YXRpb25FbmRwb2ludDogc3RyaW5nO1xyXG4gIHJlZ2lzdHJhdGlvbkVuZHBvaW50OiBzdHJpbmc7XHJcblxyXG4gIHN0YXRpYyBmZXRjaEZyb21Jc3N1ZXIob3BlbklkSXNzdWVyVXJsOiBzdHJpbmcsIHJlcXVlc3Rvcj86IFJlcXVlc3Rvcikge1xyXG4gICAgY29uc3QgZnVsbFVybCA9IGAke29wZW5JZElzc3VlclVybH0vJHtXRUxMX0tOT1dOX1BBVEh9LyR7T1BFTklEX0NPTkZJR1VSQVRJT059YDtcclxuICAgIGNvbnN0IHJlcXVlc3RvclRvVXNlID0gcmVxdWVzdG9yIHx8IG5ldyBKUXVlcnlSZXF1ZXN0b3IoKTtcclxuICAgIHJldHVybiByZXF1ZXN0b3JUb1VzZVxyXG4gICAgICAgIC54aHI8TnVjbGV1c0F1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbkpzb24+KHt1cmw6IGZ1bGxVcmwsIGRhdGFUeXBlOiAnanNvbicsIG1ldGhvZDogJ0dFVCd9KVxyXG4gICAgICAgIC50aGVuKGpzb24gPT4gbmV3IE51Y2xldXNBdXRob3JpemF0aW9uU2VydmljZUNvbmZpZ3VyYXRpb24oanNvbikpO1xyXG4gIH1cclxuXHJcbiAgdG9Kc29uKCkge1xyXG4gICAgY29uc3QgcmVzID0gc3VwZXIudG9Kc29uKCkgYXMgTnVjbGV1c0F1dGhvcml6YXRpb25TZXJ2aWNlQ29uZmlndXJhdGlvbkpzb247XHJcbiAgICByZXMuZGV2aWNlX2F1dGhvcml6YXRpb25fZW5kcG9pbnQgPSB0aGlzLmRldmljZUF1dGhvcml6YXRpb25FbmRwb2ludDtcclxuICAgIHJldHVybiByZXMgYXMgYW55O1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { NucleusAppService } from '@kolektor/nucleus-common';
|
|
2
|
-
import { Browser } from '@capacitor/browser';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@kolektor/nucleus-common";
|
|
6
|
-
export class LocationService {
|
|
7
|
-
constructor(appService) {
|
|
8
|
-
this.appService = appService;
|
|
9
|
-
}
|
|
10
|
-
get hash() {
|
|
11
|
-
return window.location.hash;
|
|
12
|
-
}
|
|
13
|
-
set hash(v) {
|
|
14
|
-
window.location.hash = v;
|
|
15
|
-
}
|
|
16
|
-
get host() {
|
|
17
|
-
return window.location.host;
|
|
18
|
-
}
|
|
19
|
-
set host(v) {
|
|
20
|
-
window.location.host = v;
|
|
21
|
-
}
|
|
22
|
-
get origin() {
|
|
23
|
-
return window.location.origin;
|
|
24
|
-
}
|
|
25
|
-
get hostname() {
|
|
26
|
-
return window.location.hostname;
|
|
27
|
-
}
|
|
28
|
-
set hostname(v) {
|
|
29
|
-
window.location.hostname = v;
|
|
30
|
-
}
|
|
31
|
-
get pathname() {
|
|
32
|
-
return window.location.pathname;
|
|
33
|
-
}
|
|
34
|
-
set pathname(v) {
|
|
35
|
-
window.location.pathname = v;
|
|
36
|
-
}
|
|
37
|
-
get port() {
|
|
38
|
-
return window.location.port;
|
|
39
|
-
}
|
|
40
|
-
set port(v) {
|
|
41
|
-
window.location.port = v;
|
|
42
|
-
}
|
|
43
|
-
get protocol() {
|
|
44
|
-
return window.location.protocol;
|
|
45
|
-
}
|
|
46
|
-
set protocol(v) {
|
|
47
|
-
window.location.protocol = v;
|
|
48
|
-
}
|
|
49
|
-
get search() {
|
|
50
|
-
return window.location.search;
|
|
51
|
-
}
|
|
52
|
-
set search(v) {
|
|
53
|
-
window.location.search = v;
|
|
54
|
-
}
|
|
55
|
-
assign(url) {
|
|
56
|
-
if (this.appService.isNative) {
|
|
57
|
-
Browser.open({ url });
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
window.location.assign(url);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
LocationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocationService, deps: [{ token: i1.NucleusAppService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
65
|
-
LocationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocationService, providedIn: 'root' });
|
|
66
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LocationService, decorators: [{
|
|
67
|
-
type: Injectable,
|
|
68
|
-
args: [{
|
|
69
|
-
providedIn: 'root'
|
|
70
|
-
}]
|
|
71
|
-
}], ctorParameters: function () { return [{ type: i1.NucleusAppService }]; } });
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL251Y2xldXMtaWRlbnRpdHkvc3JjL2xpYi91dGlscy9sb2NhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFLM0MsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFBb0IsVUFBNkI7UUFBN0IsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7SUFDakQsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLENBQUM7UUFDUixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLENBQUM7UUFDUixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLENBQUM7UUFDUixNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLENBQUM7UUFDVixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDdkI7YUFBTTtZQUNMLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQzs7NEdBL0RVLGVBQWU7Z0hBQWYsZUFBZSxjQUZkLE1BQU07MkZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbkxpa2UgfSBmcm9tICdAb3BlbmlkL2FwcGF1dGgnO1xyXG5pbXBvcnQgeyBOdWNsZXVzQXBwU2VydmljZSB9IGZyb20gJ0Brb2xla3Rvci9udWNsZXVzLWNvbW1vbic7XHJcbmltcG9ydCB7IEJyb3dzZXIgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2NhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBMb2NhdGlvbkxpa2Uge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwU2VydmljZTogTnVjbGV1c0FwcFNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIGdldCBoYXNoKCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xyXG4gIH1cclxuICBzZXQgaGFzaCh2KSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IHY7XHJcbiAgfVxyXG5cclxuICBnZXQgaG9zdCgpIHtcclxuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaG9zdDtcclxuICB9XHJcbiAgc2V0IGhvc3Qodikge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhvc3QgPSB2O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9yaWdpbigpIHtcclxuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhvc3RuYW1lKCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcclxuICB9XHJcbiAgc2V0IGhvc3RuYW1lKHYpIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA9IHY7XHJcbiAgfVxyXG5cclxuICBnZXQgcGF0aG5hbWUoKSB7XHJcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xyXG4gIH1cclxuICBzZXQgcGF0aG5hbWUodikge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID0gdjtcclxuICB9XHJcblxyXG4gIGdldCBwb3J0KCkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wb3J0O1xyXG4gIH1cclxuICBzZXQgcG9ydCh2KSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24ucG9ydCA9IHY7XHJcbiAgfVxyXG5cclxuICBnZXQgcHJvdG9jb2woKSB7XHJcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnByb3RvY29sO1xyXG4gIH1cclxuICBzZXQgcHJvdG9jb2wodikge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID0gdjtcclxuICB9XHJcblxyXG4gIGdldCBzZWFyY2goKSB7XHJcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcclxuICB9XHJcbiAgc2V0IHNlYXJjaCh2KSB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uc2VhcmNoID0gdjtcclxuICB9XHJcblxyXG4gIGFzc2lnbih1cmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXBwU2VydmljZS5pc05hdGl2ZSkge1xyXG4gICAgICBCcm93c2VyLm9wZW4oeyB1cmwgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
|