ngx-oauth 4.2.0 → 4.2.3
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/{lib/components → components}/login/oauth-login.component.d.ts +0 -0
- package/esm2020/{lib/components → components}/login/oauth-login.component.mjs +1 -1
- package/esm2020/index.mjs +7 -6
- package/esm2020/models/index.mjs +47 -0
- package/esm2020/oauth.module.mjs +120 -0
- package/esm2020/services/oauth.interceptor.mjs +53 -0
- package/esm2020/services/oauth.service.mjs +300 -0
- package/esm2020/services/token.service.mjs +83 -0
- package/fesm2015/ngx-oauth.mjs +34 -24
- package/fesm2015/ngx-oauth.mjs.map +1 -1
- package/fesm2020/ngx-oauth.mjs +35 -25
- package/fesm2020/ngx-oauth.mjs.map +1 -1
- package/index.d.ts +6 -5
- package/{lib/models → models}/index.d.ts +1 -0
- package/{lib/oauth.module.d.ts → oauth.module.d.ts} +0 -0
- package/package.json +1 -1
- package/{lib/services → services}/oauth.interceptor.d.ts +3 -3
- package/{lib/services → services}/oauth.service.d.ts +6 -3
- package/{lib/services → services}/token.service.d.ts +3 -3
- package/esm2020/lib/models/index.mjs +0 -47
- package/esm2020/lib/oauth.module.mjs +0 -120
- package/esm2020/lib/services/oauth.interceptor.mjs +0 -53
- package/esm2020/lib/services/oauth.service.mjs +0 -290
- package/esm2020/lib/services/token.service.mjs +0 -83
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { switchMap, take, throwError } from 'rxjs';
|
|
3
|
-
import { catchError, map } from 'rxjs/operators';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "./token.service";
|
|
6
|
-
import * as i2 from "../models";
|
|
7
|
-
export class OAuthInterceptor {
|
|
8
|
-
constructor(tokenService, authConfig) {
|
|
9
|
-
this.tokenService = tokenService;
|
|
10
|
-
this.authConfig = authConfig;
|
|
11
|
-
}
|
|
12
|
-
intercept(req, next) {
|
|
13
|
-
return this.tokenService.token$.pipe(take(1), map(token => {
|
|
14
|
-
if (token?.access_token && !this.isPathExcepted(req)) {
|
|
15
|
-
req = req.clone({
|
|
16
|
-
setHeaders: {
|
|
17
|
-
Authorization: `${token.token_type} ${token.access_token}`
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
return req;
|
|
22
|
-
}), switchMap(req => next.handle(req)), catchError((err) => {
|
|
23
|
-
if (err.status === 401 && !this.isPathExcepted(req)) {
|
|
24
|
-
this.tokenService.token = {
|
|
25
|
-
error: `${err.status}`,
|
|
26
|
-
error_description: err.message
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return throwError(() => err);
|
|
30
|
-
}));
|
|
31
|
-
}
|
|
32
|
-
isPathExcepted(req) {
|
|
33
|
-
const { ignorePaths } = this.authConfig || {};
|
|
34
|
-
if (ignorePaths) {
|
|
35
|
-
for (const ignorePath of ignorePaths) {
|
|
36
|
-
try {
|
|
37
|
-
if (req.url.match(ignorePath)) {
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthInterceptor, deps: [{ token: i1.TokenService }, { token: i2.OAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
49
|
-
OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthInterceptor });
|
|
50
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthInterceptor, decorators: [{
|
|
51
|
-
type: Injectable
|
|
52
|
-
}], ctorParameters: function () { return [{ type: i1.TokenService }, { type: i2.OAuthConfig }]; } });
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2F1dGgvc3JjL2xpYi9zZXJ2aWNlcy9vYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7O0FBSy9DLE1BQU0sT0FBTyxnQkFBZ0I7SUFFM0IsWUFBc0IsWUFBMEIsRUFDMUIsVUFBdUI7UUFEdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtJQUM3QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDaEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVixJQUFJLEtBQUssRUFBRSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNwRCxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDZCxVQUFVLEVBQUU7d0JBQ1YsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO3FCQUMzRDtpQkFDRixDQUFDLENBQUM7YUFDSjtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNsQyxVQUFVLENBQUMsQ0FBQyxHQUFzQixFQUFFLEVBQUU7WUFDcEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHO29CQUN4QixLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFO29CQUN0QixpQkFBaUIsRUFBRSxHQUFHLENBQUMsT0FBTztpQkFDL0IsQ0FBQzthQUNIO1lBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxjQUFjLENBQUMsR0FBcUI7UUFDMUMsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBQzVDLElBQUksV0FBVyxFQUFFO1lBQ2YsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUU7Z0JBQ3BDLElBQUk7b0JBQ0YsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTt3QkFDN0IsT0FBTyxJQUFJLENBQUM7cUJBQ2I7aUJBQ0Y7Z0JBQUMsT0FBTyxHQUFHLEVBQUU7aUJBQ2I7YUFDRjtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzs2R0E3Q1UsZ0JBQWdCO2lIQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtzd2l0Y2hNYXAsIHRha2UsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7T0F1dGhDb25maWd9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1Rva2VuU2VydmljZX0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGF1dGhDb25maWc6IE9BdXRoQ29uZmlnKSB7XG4gIH1cblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcikge1xuICAgIHJldHVybiB0aGlzLnRva2VuU2VydmljZS50b2tlbiQucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAodG9rZW4gPT4ge1xuICAgICAgICBpZiAodG9rZW4/LmFjY2Vzc190b2tlbiAmJiAhdGhpcy5pc1BhdGhFeGNlcHRlZChyZXEpKSB7XG4gICAgICAgICAgcmVxID0gcmVxLmNsb25lKHtcbiAgICAgICAgICAgIHNldEhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYCR7dG9rZW4udG9rZW5fdHlwZX0gJHt0b2tlbi5hY2Nlc3NfdG9rZW59YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXE7XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcChyZXEgPT4gbmV4dC5oYW5kbGUocmVxKSksXG4gICAgICBjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDEgJiYgIXRoaXMuaXNQYXRoRXhjZXB0ZWQocmVxKSkge1xuICAgICAgICAgIHRoaXMudG9rZW5TZXJ2aWNlLnRva2VuID0ge1xuICAgICAgICAgICAgZXJyb3I6IGAke2Vyci5zdGF0dXN9YCxcbiAgICAgICAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBlcnIubWVzc2FnZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQYXRoRXhjZXB0ZWQocmVxOiBIdHRwUmVxdWVzdDxhbnk+KSB7XG4gICAgY29uc3Qge2lnbm9yZVBhdGhzfSA9IHRoaXMuYXV0aENvbmZpZyB8fCB7fTtcbiAgICBpZiAoaWdub3JlUGF0aHMpIHtcbiAgICAgIGZvciAoY29uc3QgaWdub3JlUGF0aCBvZiBpZ25vcmVQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyZXEudXJsLm1hdGNoKGlnbm9yZVBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { HttpParams } from '@angular/common/http';
|
|
3
|
-
import { catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
4
|
-
import { firstValueFrom, from, noop, of, ReplaySubject, throwError } from 'rxjs';
|
|
5
|
-
import { HEADER_APPLICATION, LOCATION, OAuthStatus, OAuthType } from '../models';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../models";
|
|
8
|
-
import * as i2 from "./token.service";
|
|
9
|
-
import * as i3 from "@angular/common/http";
|
|
10
|
-
import * as i4 from "@angular/common";
|
|
11
|
-
const arrToString = (buf) => buf.reduce((s, b) => s + String.fromCharCode(b), '');
|
|
12
|
-
const base64url = (str) => btoa(str)
|
|
13
|
-
.replace(/\+/g, '-')
|
|
14
|
-
.replace(/\//g, '_')
|
|
15
|
-
.replace(/=/g, '');
|
|
16
|
-
const randomString = (length = 48) => {
|
|
17
|
-
const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));
|
|
18
|
-
return base64url(buff).substring(0, length);
|
|
19
|
-
};
|
|
20
|
-
const pkce = async (value) => {
|
|
21
|
-
const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
|
|
22
|
-
return base64url(arrToString(new Uint8Array(buff)));
|
|
23
|
-
};
|
|
24
|
-
const parseOauthUri = (hash) => {
|
|
25
|
-
const regex = /([^&=]+)=([^&]*)/g;
|
|
26
|
-
const params = {};
|
|
27
|
-
let m;
|
|
28
|
-
// tslint:disable-next-line:no-conditional-assignment
|
|
29
|
-
while ((m = regex.exec(hash)) !== null) {
|
|
30
|
-
params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
|
|
31
|
-
}
|
|
32
|
-
return Object.keys(params).length && params || {};
|
|
33
|
-
};
|
|
34
|
-
const jwt = (token) => JSON.parse(atob(token.split('.')[1]));
|
|
35
|
-
export class OAuthService {
|
|
36
|
-
constructor(authConfig, tokenService, http, location, locationService) {
|
|
37
|
-
this.authConfig = authConfig;
|
|
38
|
-
this.tokenService = tokenService;
|
|
39
|
-
this.http = http;
|
|
40
|
-
this.location = location;
|
|
41
|
-
this.locationService = locationService;
|
|
42
|
-
this.state$ = new ReplaySubject(1);
|
|
43
|
-
this.config$ = of(this.config).pipe(filter(Boolean), filter(config => !!config?.clientId), map(config => config), switchMap(config => !config.issuerPath && of(config) || this.http.get(`${config.issuerPath}/.well-known/openid-configuration`).pipe(tap(v => this.config = {
|
|
44
|
-
...v.authorization_endpoint && { authorizePath: v.authorization_endpoint } || {},
|
|
45
|
-
...v.token_endpoint && { tokenPath: v.token_endpoint } || {},
|
|
46
|
-
...v.revocation_endpoint && { revokePath: v.revocation_endpoint } || {},
|
|
47
|
-
...v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {},
|
|
48
|
-
...v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {},
|
|
49
|
-
...v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {},
|
|
50
|
-
...v.end_session_endpoint && { logoutPath: v.end_session_endpoint } || {},
|
|
51
|
-
...{ scope: config.scope || 'openid' }
|
|
52
|
-
}), map(() => this.config))), shareReplay(1));
|
|
53
|
-
this.token$ = this.config$.pipe(tap(config => {
|
|
54
|
-
const { hash, search, origin, pathname } = this.location;
|
|
55
|
-
const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);
|
|
56
|
-
const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);
|
|
57
|
-
if (isImplicitRedirect) {
|
|
58
|
-
const parameters = parseOauthUri(hash.substring(1));
|
|
59
|
-
this.token = {
|
|
60
|
-
...parameters,
|
|
61
|
-
type: OAuthType.IMPLICIT,
|
|
62
|
-
};
|
|
63
|
-
this.checkResponse(this.token, parameters);
|
|
64
|
-
}
|
|
65
|
-
else if (isAuthCodeRedirect) {
|
|
66
|
-
const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));
|
|
67
|
-
if (!this.checkResponse(this.token, parameters)) {
|
|
68
|
-
this.token = parameters;
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
const newParametersString = this.getCleanedUnSearchParameters();
|
|
72
|
-
const { clientId, clientSecret, tokenPath, scope } = config;
|
|
73
|
-
const { codeVerifier } = this.token || {}; //should be set by authorizationUrl construction
|
|
74
|
-
this.http.post(tokenPath, new HttpParams({
|
|
75
|
-
fromObject: {
|
|
76
|
-
code: parameters?.['code'],
|
|
77
|
-
client_id: clientId,
|
|
78
|
-
...clientSecret && { client_secret: clientSecret } || {},
|
|
79
|
-
redirect_uri: `${origin}${pathname}`,
|
|
80
|
-
grant_type: 'authorization_code',
|
|
81
|
-
...scope && { scope } || {},
|
|
82
|
-
...codeVerifier && { code_verifier: codeVerifier } || {}
|
|
83
|
-
}
|
|
84
|
-
}), { headers: HEADER_APPLICATION }).pipe().subscribe(token => {
|
|
85
|
-
this.token = {
|
|
86
|
-
...token,
|
|
87
|
-
type: OAuthType.AUTHORIZATION_CODE
|
|
88
|
-
};
|
|
89
|
-
this.locationService.replaceState(`${pathname}${newParametersString}`);
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}), switchMap(() => this.tokenService.token$), shareReplay(1));
|
|
94
|
-
this.status$ = this.token$.pipe(map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED), shareReplay(1));
|
|
95
|
-
this.userInfo$ = this.status$.pipe(filter(s => s === OAuthStatus.AUTHORIZED), map(() => {
|
|
96
|
-
const { config } = this.authConfig;
|
|
97
|
-
return config.userPath;
|
|
98
|
-
}), filter(Boolean), switchMap(path => this.http.get(path)), shareReplay(1));
|
|
99
|
-
this.type$ = this.tokenService.type$;
|
|
100
|
-
this.ignorePaths = this.authConfig.ignorePaths || [];
|
|
101
|
-
}
|
|
102
|
-
get token() {
|
|
103
|
-
return this.tokenService.token;
|
|
104
|
-
}
|
|
105
|
-
set token(token) {
|
|
106
|
-
this.tokenService.token = token;
|
|
107
|
-
}
|
|
108
|
-
get config() {
|
|
109
|
-
return this.authConfig.config;
|
|
110
|
-
}
|
|
111
|
-
set config(config) {
|
|
112
|
-
if (config) {
|
|
113
|
-
this.authConfig.config = {
|
|
114
|
-
...this.authConfig.config,
|
|
115
|
-
...config
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
async login(parameters) {
|
|
120
|
-
if (!!parameters && parameters.password) {
|
|
121
|
-
await this.resourceLogin(parameters);
|
|
122
|
-
}
|
|
123
|
-
else if (!!parameters && parameters.redirectUri && parameters.responseType) {
|
|
124
|
-
await this.toAuthorizationUrl(parameters);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
await this.clientCredentialLogin();
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
logout(useLogoutUrl) {
|
|
131
|
-
this.revoke();
|
|
132
|
-
this.token = {};
|
|
133
|
-
const { logoutPath, logoutRedirectUri } = this.authConfig.config;
|
|
134
|
-
if (useLogoutUrl && logoutPath) {
|
|
135
|
-
const { origin, pathname } = this.location;
|
|
136
|
-
const currentPath = `${origin}${pathname}`;
|
|
137
|
-
this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
revoke() {
|
|
141
|
-
const { revokePath, clientId, clientSecret } = this.authConfig.config;
|
|
142
|
-
if (revokePath) {
|
|
143
|
-
const { access_token, refresh_token } = this.token || {};
|
|
144
|
-
const toRevoke = [];
|
|
145
|
-
if (access_token) {
|
|
146
|
-
toRevoke.push({
|
|
147
|
-
...clientId && { client_id: clientId } || {},
|
|
148
|
-
...clientSecret && { client_secret: clientSecret } || {},
|
|
149
|
-
token: access_token,
|
|
150
|
-
token_type_hint: 'access_token'
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
if (refresh_token) {
|
|
154
|
-
toRevoke.push({
|
|
155
|
-
...clientId && { client_id: clientId } || {},
|
|
156
|
-
...clientSecret && { client_secret: clientSecret } || {},
|
|
157
|
-
token: refresh_token,
|
|
158
|
-
token_type_hint: 'refresh_token'
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
from(toRevoke).pipe(concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation
|
|
162
|
-
switchMap(o => this.http.post(revokePath, new HttpParams({ fromObject: o })))).subscribe(noop);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
clientCredentialLogin() {
|
|
166
|
-
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
167
|
-
return firstValueFrom(this.http.post(tokenPath, new HttpParams({
|
|
168
|
-
fromObject: {
|
|
169
|
-
client_id: clientId,
|
|
170
|
-
client_secret: clientSecret,
|
|
171
|
-
grant_type: OAuthType.CLIENT_CREDENTIAL,
|
|
172
|
-
...scope ? { scope } : {},
|
|
173
|
-
}
|
|
174
|
-
}), { headers: HEADER_APPLICATION }).pipe(catchError((err) => {
|
|
175
|
-
this.token = err;
|
|
176
|
-
return throwError(() => err);
|
|
177
|
-
}), tap(params => {
|
|
178
|
-
this.token = {
|
|
179
|
-
...params,
|
|
180
|
-
type: OAuthType.CLIENT_CREDENTIAL,
|
|
181
|
-
};
|
|
182
|
-
})));
|
|
183
|
-
}
|
|
184
|
-
resourceLogin(parameters) {
|
|
185
|
-
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
186
|
-
const { username, password } = parameters;
|
|
187
|
-
return firstValueFrom(this.http.post(tokenPath, new HttpParams({
|
|
188
|
-
fromObject: {
|
|
189
|
-
client_id: clientId,
|
|
190
|
-
...clientSecret && { client_secret: clientSecret } || {},
|
|
191
|
-
grant_type: OAuthType.RESOURCE,
|
|
192
|
-
...scope && { scope } || {},
|
|
193
|
-
username,
|
|
194
|
-
password
|
|
195
|
-
}
|
|
196
|
-
}), { headers: HEADER_APPLICATION }).pipe(catchError(err => {
|
|
197
|
-
this.token = err;
|
|
198
|
-
return throwError(() => err);
|
|
199
|
-
}), tap(params => {
|
|
200
|
-
this.token = {
|
|
201
|
-
...params,
|
|
202
|
-
type: OAuthType.RESOURCE,
|
|
203
|
-
};
|
|
204
|
-
})));
|
|
205
|
-
}
|
|
206
|
-
async toAuthorizationUrl(parameters) {
|
|
207
|
-
const { config } = this.authConfig;
|
|
208
|
-
let authorizationUrl = `${config.authorizePath}`;
|
|
209
|
-
authorizationUrl += config.authorizePath.includes('?') && '&' || '?';
|
|
210
|
-
authorizationUrl += `client_id=${config.clientId}`;
|
|
211
|
-
authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;
|
|
212
|
-
authorizationUrl += `&response_type=${parameters.responseType}`;
|
|
213
|
-
authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;
|
|
214
|
-
authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;
|
|
215
|
-
return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);
|
|
216
|
-
}
|
|
217
|
-
async generateCodeChallenge(config) {
|
|
218
|
-
if (config.pkce) {
|
|
219
|
-
const codeVerifier = randomString();
|
|
220
|
-
this.token = { ...this.token, codeVerifier };
|
|
221
|
-
return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;
|
|
222
|
-
}
|
|
223
|
-
return '';
|
|
224
|
-
}
|
|
225
|
-
generateNonce(config) {
|
|
226
|
-
if (config && config.scope && config.scope.indexOf('openid') > -1) {
|
|
227
|
-
const nonce = randomString(10);
|
|
228
|
-
this.token = { ...this.token, nonce };
|
|
229
|
-
return `&nonce=${nonce}`;
|
|
230
|
-
}
|
|
231
|
-
return '';
|
|
232
|
-
}
|
|
233
|
-
checkResponse(token, parameters) {
|
|
234
|
-
this.emitState(parameters);
|
|
235
|
-
this.cleanLocationHash();
|
|
236
|
-
if (!parameters || parameters['error']) {
|
|
237
|
-
return false;
|
|
238
|
-
}
|
|
239
|
-
if (token && token.nonce && parameters['access_token']) {
|
|
240
|
-
const jwtToken = jwt(parameters['access_token']);
|
|
241
|
-
return token.nonce === jwtToken.nonce;
|
|
242
|
-
}
|
|
243
|
-
return parameters['access_token'] || parameters['code'];
|
|
244
|
-
}
|
|
245
|
-
getCleanedUnSearchParameters() {
|
|
246
|
-
const { search } = this.location;
|
|
247
|
-
let searchString = search && search.substring(1) || '';
|
|
248
|
-
const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];
|
|
249
|
-
hashKeys.forEach(hashKey => {
|
|
250
|
-
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
251
|
-
searchString = searchString.replace(re, '');
|
|
252
|
-
});
|
|
253
|
-
return searchString.length && `?${searchString}` || '';
|
|
254
|
-
}
|
|
255
|
-
cleanLocationHash() {
|
|
256
|
-
const { hash } = this.location;
|
|
257
|
-
let curHash = hash && hash.substring(1) || '';
|
|
258
|
-
const hashKeys = [
|
|
259
|
-
'access_token',
|
|
260
|
-
'token_type',
|
|
261
|
-
'expires_in',
|
|
262
|
-
'scope',
|
|
263
|
-
'state',
|
|
264
|
-
'error',
|
|
265
|
-
'error_description',
|
|
266
|
-
'session_state',
|
|
267
|
-
'nonce',
|
|
268
|
-
'id_token',
|
|
269
|
-
'code'
|
|
270
|
-
];
|
|
271
|
-
hashKeys.forEach(hashKey => {
|
|
272
|
-
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
273
|
-
curHash = curHash.replace(re, '');
|
|
274
|
-
});
|
|
275
|
-
this.location.hash = curHash;
|
|
276
|
-
}
|
|
277
|
-
emitState(parameters) {
|
|
278
|
-
const { state } = parameters || {};
|
|
279
|
-
state && this.state$.next(state);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, deps: [{ token: i1.OAuthConfig }, { token: i2.TokenService }, { token: i3.HttpClient }, { token: LOCATION }, { token: i4.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
283
|
-
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService });
|
|
284
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: OAuthService, decorators: [{
|
|
285
|
-
type: Injectable
|
|
286
|
-
}], ctorParameters: function () { return [{ type: i1.OAuthConfig }, { type: i2.TokenService }, { type: i3.HttpClient }, { type: Location, decorators: [{
|
|
287
|
-
type: Inject,
|
|
288
|
-
args: [LOCATION]
|
|
289
|
-
}] }, { type: i4.Location }]; } });
|
|
290
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvbGliL3NlcnZpY2VzL29hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQy9FLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsUUFBUSxFQUdSLFdBQVcsRUFFWCxTQUFTLEVBTVYsTUFBTSxXQUFXLENBQUM7Ozs7OztBQUluQixNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQWUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0tBQ3pDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0tBQ25CLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0tBQ25CLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFckIsTUFBTSxZQUFZLEdBQUcsQ0FB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TSxFQUFDLElBQUksRUFBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHO1lBQ2YsY0FBYztZQUNkLFlBQVk7WUFDWixZQUFZO1lBQ1osT0FBTztZQUNQLE9BQU87WUFDUCxPQUFPO1lBQ1AsbUJBQW1CO1lBQ25CLGVBQWU7WUFDZixPQUFPO1lBQ1AsVUFBVTtZQUNWLE1BQU07U0FDUCxDQUFDO1FBQ0YsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixNQUFNLEVBQUUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLGFBQWEsR0FBRyxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUM7WUFDL0UsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFFTyxTQUFTLENBQUMsVUFBbUM7UUFDbkQsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7O3lHQW5TVSxZQUFZLG1HQTJHSCxRQUFROzZHQTNHakIsWUFBWTsyRkFBWixZQUFZO2tCQUR4QixVQUFVO3dJQTRHeUMsUUFBUTswQkFBN0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Zmlyc3RWYWx1ZUZyb20sIGZyb20sIG5vb3AsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25Db2RlQ29uZmlnLFxuICBBdXRob3JpemF0aW9uUGFyYW1ldGVycyxcbiAgSEVBREVSX0FQUExJQ0FUSU9OLFxuICBMT0NBVElPTixcbiAgT0F1dGhDb25maWcsXG4gIE9BdXRoUGFyYW1ldGVycyxcbiAgT0F1dGhTdGF0dXMsXG4gIE9BdXRoVG9rZW4sXG4gIE9BdXRoVHlwZSxcbiAgT0F1dGhUeXBlQ29uZmlnLFxuICBPcGVuSWRDb25maWcsXG4gIE9wZW5JZENvbmZpZ3VyYXRpb24sXG4gIFJlc291cmNlUGFyYW1ldGVycyxcbiAgVXNlckluZm9cbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TG9jYXRpb24gYXMgTG9jYXRpb24yfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtUb2tlblNlcnZpY2V9IGZyb20gJy4vdG9rZW4uc2VydmljZSc7XG5cbmNvbnN0IGFyclRvU3RyaW5nID0gKGJ1ZjogVWludDhBcnJheSkgPT4gYnVmLnJlZHVjZSgocywgYikgPT4gcyArIFN0cmluZy5mcm9tQ2hhckNvZGUoYiksICcnKTtcblxuY29uc3QgYmFzZTY0dXJsID0gKHN0cjogc3RyaW5nKSA9PiBidG9hKHN0cilcbiAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAucmVwbGFjZSgvPS9nLCAnJyk7XG5cbmNvbnN0IHJhbmRvbVN0cmluZyA9IChsZW5ndGg6IG51bWJlciA9IDQ4KSA9PiB7XG4gIGNvbnN0IGJ1ZmYgPSBhcnJUb1N0cmluZyhjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGxlbmd0aCAqIDIpKSk7XG4gIHJldHVybiBiYXNlNjR1cmwoYnVmZikuc3Vic3RyaW5nKDAsIGxlbmd0aCk7XG59O1xuXG5jb25zdCBwa2NlID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgYnVmZiA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKSk7XG4gIHJldHVybiBiYXNlNjR1cmwoYXJyVG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkoYnVmZikpKTtcbn07XG5cbmNvbnN0IHBhcnNlT2F1dGhVcmkgPSAoaGFzaDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gLyhbXiY9XSspPShbXiZdKikvZztcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGxldCBtO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICB3aGlsZSAoKG0gPSByZWdleC5leGVjKGhhc2gpKSAhPT0gbnVsbCkge1xuICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobVsxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMl0pO1xuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCAmJiBwYXJhbXMgfHwge307XG59O1xuXG5jb25zdCBqd3QgPSAodG9rZW46IHN0cmluZykgPT4gSlNPTi5wYXJzZShhdG9iKHRva2VuLnNwbGl0KCcuJylbMV0pKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoU2VydmljZSB7XG5cbiAgc3RhdGUkID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcbiAgY29uZmlnJCA9IG9mKHRoaXMuY29uZmlnKS5waXBlKFxuICAgIGZpbHRlcihCb29sZWFuKSxcbiAgICBmaWx0ZXIoY29uZmlnID0+ICEhY29uZmlnPy5jbGllbnRJZCksXG4gICAgbWFwKGNvbmZpZyA9PiBjb25maWcgYXMgT3BlbklkQ29uZmlnKSxcbiAgICBzd2l0Y2hNYXAoY29uZmlnID0+ICFjb25maWcuaXNzdWVyUGF0aCAmJiBvZihjb25maWcpIHx8IHRoaXMuaHR0cC5nZXQ8T3BlbklkQ29uZmlndXJhdGlvbj4oYCR7Y29uZmlnLmlzc3VlclBhdGh9Ly53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uYCkucGlwZShcbiAgICAgIHRhcCh2ID0+IHRoaXMuY29uZmlnID0ge1xuICAgICAgICAuLi52LmF1dGhvcml6YXRpb25fZW5kcG9pbnQgJiYge2F1dGhvcml6ZVBhdGg6IHYuYXV0aG9yaXphdGlvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgIC4uLnYudG9rZW5fZW5kcG9pbnQgJiYge3Rva2VuUGF0aDogdi50b2tlbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgIC4uLnYucmV2b2NhdGlvbl9lbmRwb2ludCAmJiB7cmV2b2tlUGF0aDogdi5yZXZvY2F0aW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi5jb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZCAmJiB7cGtjZTogdi5jb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZC5pbmRleE9mKCdTMjU2JykgPiAtMX0gfHwge30sXG4gICAgICAgIC4uLnYudXNlcmluZm9fZW5kcG9pbnQgJiYge3VzZXJQYXRoOiB2LnVzZXJpbmZvX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi5pbnRyb3NwZWN0aW9uX2VuZHBvaW50ICYmIHtpbnRyb3NwZWN0aW9uUGF0aDogdi5pbnRyb3NwZWN0aW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi5lbmRfc2Vzc2lvbl9lbmRwb2ludCAmJiB7bG9nb3V0UGF0aDogdi5lbmRfc2Vzc2lvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgIC4uLntzY29wZTogY29uZmlnLnNjb3BlIHx8ICdvcGVuaWQnfVxuICAgICAgfSBhcyBhbnkpLFxuICAgICAgbWFwKCgpID0+IHRoaXMuY29uZmlnKVxuICAgICkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHRva2VuJCA9IHRoaXMuY29uZmlnJC5waXBlKFxuICAgIHRhcChjb25maWcgPT4ge1xuICAgICAgY29uc3Qge2hhc2gsIHNlYXJjaCwgb3JpZ2luLCBwYXRobmFtZX0gPSB0aGlzLmxvY2F0aW9uO1xuICAgICAgY29uc3QgaXNJbXBsaWNpdFJlZGlyZWN0ID0gaGFzaCAmJiAvKGFjY2Vzc190b2tlbj0pfChlcnJvcj0pLy50ZXN0KGhhc2gpO1xuICAgICAgY29uc3QgaXNBdXRoQ29kZVJlZGlyZWN0ID0gc2VhcmNoICYmIC8oY29kZT0pfChlcnJvcj0pLy50ZXN0KHNlYXJjaCkgfHwgaGFzaCAmJiAvKGNvZGU9KXwoZXJyb3I9KS8udGVzdChoYXNoKTtcbiAgICAgIGlmIChpc0ltcGxpY2l0UmVkaXJlY3QpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHBhcnNlT2F1dGhVcmkoaGFzaC5zdWJzdHJpbmcoMSkpO1xuICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgdHlwZTogT0F1dGhUeXBlLklNUExJQ0lULFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNoZWNrUmVzcG9uc2UodGhpcy50b2tlbiwgcGFyYW1ldGVycyk7XG4gICAgICB9IGVsc2UgaWYgKGlzQXV0aENvZGVSZWRpcmVjdCkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyc2VPYXV0aFVyaShzZWFyY2ggJiYgc2VhcmNoLnN1YnN0cmluZygxKSB8fCBoYXNoICYmIGhhc2guc3Vic3RyaW5nKDEpKTtcbiAgICAgICAgaWYgKCF0aGlzLmNoZWNrUmVzcG9uc2UodGhpcy50b2tlbiwgcGFyYW1ldGVycykpIHtcbiAgICAgICAgICB0aGlzLnRva2VuID0gcGFyYW1ldGVycztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBuZXdQYXJhbWV0ZXJzU3RyaW5nID0gdGhpcy5nZXRDbGVhbmVkVW5TZWFyY2hQYXJhbWV0ZXJzKCk7XG4gICAgICAgICAgY29uc3Qge2NsaWVudElkLCBjbGllbnRTZWNyZXQsIHRva2VuUGF0aCwgc2NvcGV9ID0gY29uZmlnIGFzIEF1dGhvcml6YXRpb25Db2RlQ29uZmlnO1xuICAgICAgICAgIGNvbnN0IHtjb2RlVmVyaWZpZXJ9ID0gdGhpcy50b2tlbiB8fCB7fTsgLy9zaG91bGQgYmUgc2V0IGJ5IGF1dGhvcml6YXRpb25VcmwgY29uc3RydWN0aW9uXG4gICAgICAgICAgdGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICAgICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgICAgICAgIGNvZGU6IHBhcmFtZXRlcnM/LlsnY29kZSddLFxuICAgICAgICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogYCR7b3JpZ2lufSR7cGF0aG5hbWV9YCxcbiAgICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgICAgICAgIC4uLmNvZGVWZXJpZmllciAmJiB7Y29kZV92ZXJpZmllcjogY29kZVZlcmlmaWVyfSB8fCB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLCB7aGVhZGVyczogSEVBREVSX0FQUExJQ0FUSU9OfSkucGlwZShcbiAgICAgICAgICApLnN1YnNjcmliZSh0b2tlbiA9PiB7XG4gICAgICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgICAgICAuLi50b2tlbixcbiAgICAgICAgICAgICAgdHlwZTogT0F1dGhUeXBlLkFVVEhPUklaQVRJT05fQ09ERVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb25TZXJ2aWNlLnJlcGxhY2VTdGF0ZShgJHtwYXRobmFtZX0ke25ld1BhcmFtZXRlcnNTdHJpbmd9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSxcbiAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy50b2tlblNlcnZpY2UudG9rZW4kKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICBzdGF0dXMkID0gdGhpcy50b2tlbiQucGlwZShcbiAgICBtYXAodG9rZW4gPT4gdG9rZW4uYWNjZXNzX3Rva2VuICYmIE9BdXRoU3RhdHVzLkFVVEhPUklaRUQgfHwgdG9rZW4uZXJyb3IgJiYgT0F1dGhTdGF0dXMuREVOSUVEIHx8IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICB1c2VySW5mbyQgPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBmaWx0ZXIocyA9PiBzID09PSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEKSxcbiAgICBtYXAoKCkgPT4ge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWcgYXMgYW55O1xuICAgICAgcmV0dXJuIGNvbmZpZy51c2VyUGF0aDtcbiAgICB9KSxcbiAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgc3dpdGNoTWFwKHBhdGggPT4gdGhpcy5odHRwLmdldDxVc2VySW5mbz4ocGF0aCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHR5cGUkID0gdGhpcy50b2tlblNlcnZpY2UudHlwZSQ7XG4gIGlnbm9yZVBhdGhzID0gdGhpcy5hdXRoQ29uZmlnLmlnbm9yZVBhdGhzIHx8IFtdO1xuXG4gIGdldCB0b2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlblNlcnZpY2UudG9rZW47XG4gIH1cblxuICBzZXQgdG9rZW4odG9rZW4pIHtcbiAgICB0aGlzLnRva2VuU2VydmljZS50b2tlbiA9IHRva2VuO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZztcbiAgfVxuXG4gIHNldCBjb25maWcoY29uZmlnOiBPQXV0aFR5cGVDb25maWcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmF1dGhDb25maWcuY29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLmF1dGhDb25maWcuY29uZmlnLFxuICAgICAgICAuLi5jb25maWdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGF1dGhDb25maWc6IE9BdXRoQ29uZmlnLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBASW5qZWN0KExPQ0FUSU9OKSBwcm90ZWN0ZWQgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgbG9jYXRpb25TZXJ2aWNlOiBMb2NhdGlvbjIpIHtcbiAgfVxuXG4gIGFzeW5jIGxvZ2luKHBhcmFtZXRlcnM/OiBPQXV0aFBhcmFtZXRlcnMpIHtcbiAgICBpZiAoISFwYXJhbWV0ZXJzICYmIChwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycykucGFzc3dvcmQpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzb3VyY2VMb2dpbihwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIGlmICghIXBhcmFtZXRlcnMgJiYgKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvblBhcmFtZXRlcnMpLnJlZGlyZWN0VXJpICYmIChwYXJhbWV0ZXJzIGFzIEF1dGhvcml6YXRpb25QYXJhbWV0ZXJzKS5yZXNwb25zZVR5cGVcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMudG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvblBhcmFtZXRlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudENyZWRlbnRpYWxMb2dpbigpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ291dCh1c2VMb2dvdXRVcmw/OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXZva2UoKTtcbiAgICB0aGlzLnRva2VuID0ge307XG4gICAgY29uc3Qge2xvZ291dFBhdGgsIGxvZ291dFJlZGlyZWN0VXJpfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGlmICh1c2VMb2dvdXRVcmwgJiYgbG9nb3V0UGF0aCkge1xuICAgICAgY29uc3Qge29yaWdpbiwgcGF0aG5hbWV9ID0gdGhpcy5sb2NhdGlvbjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYCR7b3JpZ2lufSR7cGF0aG5hbWV9YDtcbiAgICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZShgJHtsb2dvdXRQYXRofT9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JHtsb2dvdXRSZWRpcmVjdFVyaSB8fCBjdXJyZW50UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmV2b2tlKCkge1xuICAgIGNvbnN0IHtyZXZva2VQYXRoLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0fSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGlmIChyZXZva2VQYXRoKSB7XG4gICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IHRoaXMudG9rZW4gfHwge307XG4gICAgICBjb25zdCB0b1Jldm9rZSA9IFtdO1xuICAgICAgaWYgKGFjY2Vzc190b2tlbikge1xuICAgICAgICB0b1Jldm9rZS5wdXNoKHtcbiAgICAgICAgICAuLi5jbGllbnRJZCAmJiB7Y2xpZW50X2lkOiBjbGllbnRJZH0gfHwge30sXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAnYWNjZXNzX3Rva2VuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHRvUmV2b2tlLnB1c2goe1xuICAgICAgICAgIC4uLmNsaWVudElkICYmIHtjbGllbnRfaWQ6IGNsaWVudElkfSB8fCB7fSxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgdG9rZW46IHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAncmVmcmVzaF90b2tlbidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmcm9tKHRvUmV2b2tlKS5waXBlKFxuICAgICAgICBjb25jYXRNYXAobyA9PiBvZihvKS5waXBlKGRlbGF5KDMwMCkpKSwgLy8gc3BhY2UgcmVxdWVzdCB0byBhdm9pZCBjYW5jZWxsYXRpb25cbiAgICAgICAgc3dpdGNoTWFwKG8gPT4gdGhpcy5odHRwLnBvc3QocmV2b2tlUGF0aCwgbmV3IEh0dHBQYXJhbXMoe2Zyb21PYmplY3Q6IG99KSkpLFxuICAgICAgKS5zdWJzY3JpYmUobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNsaWVudENyZWRlbnRpYWxMb2dpbigpIHtcbiAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldCxcbiAgICAgICAgZ3JhbnRfdHlwZTogT0F1dGhUeXBlLkNMSUVOVF9DUkVERU5USUFMLFxuICAgICAgICAuLi5zY29wZSA/IHtzY29wZX0gOiB7fSxcbiAgICAgIH1cbiAgICB9KSwge2hlYWRlcnM6IEhFQURFUl9BUFBMSUNBVElPTn0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgIH0pLFxuICAgICAgdGFwKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIHR5cGU6IE9BdXRoVHlwZS5DTElFTlRfQ1JFREVOVElBTCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlTG9naW4ocGFyYW1ldGVyczogUmVzb3VyY2VQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qge2NsaWVudElkLCBjbGllbnRTZWNyZXQsIHRva2VuUGF0aCwgc2NvcGV9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBwYXNzd29yZH0gPSBwYXJhbWV0ZXJzO1xuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICBncmFudF90eXBlOiBPQXV0aFR5cGUuUkVTT1VSQ0UsXG4gICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogSEVBREVSX0FQUExJQ0FUSU9OfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgIH0pLFxuICAgICAgdGFwKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIHR5cGU6IE9BdXRoVHlwZS5SRVNPVVJDRSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnM6IEF1dGhvcml6YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWcgYXMgYW55O1xuICAgIGxldCBhdXRob3JpemF0aW9uVXJsID0gYCR7Y29uZmlnLmF1dGhvcml6ZVBhdGh9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGNvbmZpZy5hdXRob3JpemVQYXRoLmluY2x1ZGVzKCc/JykgJiYgJyYnIHx8ICc/JztcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGBjbGllbnRfaWQ9JHtjb25maWcuY2xpZW50SWR9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnMucmVkaXJlY3RVcmkpfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnJlc3BvbnNlX3R5cGU9JHtwYXJhbWV0ZXJzLnJlc3BvbnNlVHlwZX1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZzY29wZT0ke2VuY29kZVVSSUNvbXBvbmVudChjb25maWcuc2NvcGUgfHwgJycpfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnMuc3RhdGUgfHwgJycpfWA7XG4gICAgcmV0dXJuIHRoaXMubG9jYXRpb24ucmVwbGFjZShgJHthdXRob3JpemF0aW9uVXJsfSR7dGhpcy5nZW5lcmF0ZU5vbmNlKGNvbmZpZyl9JHthd2FpdCB0aGlzLmdlbmVyYXRlQ29kZUNoYWxsZW5nZShjb25maWcpfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlQ29kZUNoYWxsZW5nZShjb25maWc6IGFueSkge1xuICAgIGlmIChjb25maWcucGtjZSkge1xuICAgICAgY29uc3QgY29kZVZlcmlmaWVyID0gcmFuZG9tU3RyaW5nKCk7XG4gICAgICB0aGlzLnRva2VuID0gey4uLnRoaXMudG9rZW4sIGNvZGVWZXJpZmllcn07XG4gICAgICByZXR1cm4gYCZjb2RlX2NoYWxsZW5nZT0ke2F3YWl0IHBrY2UoY29kZVZlcmlmaWVyKX0mY29kZV9jaGFsbGVuZ2VfbWV0aG9kPVMyNTZgO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVOb25jZShjb25maWc6IGFueSkge1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNjb3BlICYmIGNvbmZpZy5zY29wZS5pbmRleE9mKCdvcGVuaWQnKSA+IC0xKSB7XG4gICAgICBjb25zdCBub25jZSA9IHJhbmRvbVN0cmluZygxMCk7XG4gICAgICB0aGlzLnRva2VuID0gey4uLnRoaXMudG9rZW4sIG5vbmNlfTtcbiAgICAgIHJldHVybiBgJm5vbmNlPSR7bm9uY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1Jlc3BvbnNlKHRva2VuPzogT0F1dGhUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgdGhpcy5lbWl0U3RhdGUocGFyYW1ldGVycyk7XG4gICAgdGhpcy5jbGVhbkxvY2F0aW9uSGFzaCgpO1xuICAgIGlmICghcGFyYW1ldGVycyB8fCBwYXJhbWV0ZXJzWydlcnJvciddKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0b2tlbiAmJiB0b2tlbi5ub25jZSAmJiBwYXJhbWV0ZXJzWydhY2Nlc3NfdG9rZW4nXSkge1xuICAgICAgY29uc3Qgand0VG9rZW4gPSBqd3QocGFyYW1ldGVyc1snYWNjZXNzX3Rva2VuJ10pO1xuICAgICAgcmV0dXJuIHRva2VuLm5vbmNlID09PSBqd3RUb2tlbi5ub25jZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtZXRlcnNbJ2FjY2Vzc190b2tlbiddIHx8IHBhcmFtZXRlcnNbJ2NvZGUnXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2xlYW5lZFVuU2VhcmNoUGFyYW1ldGVycygpIHtcbiAgICBjb25zdCB7c2VhcmNofSA9IHRoaXMubG9jYXRpb247XG4gICAgbGV0IHNlYXJjaFN0cmluZyA9IHNlYXJjaCAmJiBzZWFyY2guc3Vic3RyaW5nKDEpIHx8ICcnO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydjb2RlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnLCAnc2NvcGUnLCAnYXV0aHVzZXInLCAncHJvbXB0J107XG4gICAgaGFzaEtleXMuZm9yRWFjaChoYXNoS2V5ID0+IHtcbiAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnJicgKyBoYXNoS2V5ICsgJyg9W14mXSopP3xeJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/Jj8nKTtcbiAgICAgIHNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZy5yZXBsYWNlKHJlLCAnJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlYXJjaFN0cmluZy5sZW5ndGggJiYgYD8ke3NlYXJjaFN0cmluZ31gIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkxvY2F0aW9uSGFzaCgpIHtcbiAgICBjb25zdCB7aGFzaH0gPSB0aGlzLmxvY2F0aW9uO1xuICAgIGxldCBjdXJIYXNoID0gaGFzaCAmJiBoYXNoLnN1YnN0cmluZygxKSB8fCAnJztcbiAgICBjb25zdCBoYXNoS2V5cyA9IFtcbiAgICAgICdhY2Nlc3NfdG9rZW4nLFxuICAgICAgJ3Rva2VuX3R5cGUnLFxuICAgICAgJ2V4cGlyZXNfaW4nLFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAnZXJyb3InLFxuICAgICAgJ2Vycm9yX2Rlc2NyaXB0aW9uJyxcbiAgICAgICdzZXNzaW9uX3N0YXRlJyxcbiAgICAgICdub25jZScsXG4gICAgICAnaWRfdG9rZW4nLFxuICAgICAgJ2NvZGUnXG4gICAgXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKGhhc2hLZXkgPT4ge1xuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcmJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/fF4nICsgaGFzaEtleSArICcoPVteJl0qKT8mPycpO1xuICAgICAgY3VySGFzaCA9IGN1ckhhc2gucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHRoaXMubG9jYXRpb24uaGFzaCA9IGN1ckhhc2g7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0ZShwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGNvbnN0IHtzdGF0ZX0gPSBwYXJhbWV0ZXJzIHx8IHt9O1xuICAgIHN0YXRlICYmIHRoaXMuc3RhdGUkLm5leHQoc3RhdGUpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
var _TokenService_token$;
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { Inject, Injectable } from '@angular/core';
|
|
4
|
-
import { BehaviorSubject, distinctUntilChanged, of, switchMap } from 'rxjs';
|
|
5
|
-
import { HEADER_APPLICATION, OAUTH_HTTP_CLIENT } from '../models';
|
|
6
|
-
import { catchError, map, shareReplay } from 'rxjs/operators';
|
|
7
|
-
import { HttpParams } from '@angular/common/http';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "../models";
|
|
10
|
-
import * as i2 from "@angular/common/http";
|
|
11
|
-
const isExpiredToken = (token) => token && token.expires && Date.now() > token.expires || false;
|
|
12
|
-
export class TokenService {
|
|
13
|
-
constructor(authConfig, http, zone) {
|
|
14
|
-
this.authConfig = authConfig;
|
|
15
|
-
this.http = http;
|
|
16
|
-
this.zone = zone;
|
|
17
|
-
_TokenService_token$.set(this, new BehaviorSubject(this.saved));
|
|
18
|
-
this.token$ = __classPrivateFieldGet(this, _TokenService_token$, "f").pipe(distinctUntilChanged((p, c) => JSON.stringify(p || null) === JSON.stringify(c || null)), switchMap(token => !isExpiredToken(token) && of(token) || this.refreshToken(token)), shareReplay(1));
|
|
19
|
-
this.type$ = this.token$.pipe(map(token => token?.type), shareReplay(1));
|
|
20
|
-
this.accessToken$ = this.token$.pipe(map(token => token?.access_token), shareReplay(1));
|
|
21
|
-
}
|
|
22
|
-
get token() {
|
|
23
|
-
return __classPrivateFieldGet(this, _TokenService_token$, "f").value;
|
|
24
|
-
}
|
|
25
|
-
set token(token) {
|
|
26
|
-
const expiresIn = Number(token.expires_in) || 0;
|
|
27
|
-
const result = {
|
|
28
|
-
...token,
|
|
29
|
-
...expiresIn && { expires: Date.now() + expiresIn * 1000 } || {}
|
|
30
|
-
};
|
|
31
|
-
this.saved = result;
|
|
32
|
-
__classPrivateFieldGet(this, _TokenService_token$, "f").next(result);
|
|
33
|
-
}
|
|
34
|
-
get saved() {
|
|
35
|
-
const { storageKey, storage } = this.authConfig;
|
|
36
|
-
return storageKey && storage && storage[storageKey] && JSON.parse(storage[storageKey]) || {};
|
|
37
|
-
}
|
|
38
|
-
set saved(token) {
|
|
39
|
-
const { storageKey, storage } = this.authConfig;
|
|
40
|
-
if (storage && storageKey) {
|
|
41
|
-
if (token) {
|
|
42
|
-
storage[storageKey] = JSON.stringify(token);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
delete storage[storageKey];
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
refreshToken(token) {
|
|
50
|
-
const { tokenPath, clientId, clientSecret, scope } = this.authConfig.config;
|
|
51
|
-
const { refresh_token } = token || {};
|
|
52
|
-
return tokenPath && refresh_token && this.http.post(tokenPath, new HttpParams({
|
|
53
|
-
fromObject: {
|
|
54
|
-
client_id: clientId,
|
|
55
|
-
...clientSecret && { client_secret: clientSecret } || {},
|
|
56
|
-
grant_type: 'refresh_token',
|
|
57
|
-
refresh_token,
|
|
58
|
-
...scope && { scope } || {},
|
|
59
|
-
}
|
|
60
|
-
}), {
|
|
61
|
-
headers: HEADER_APPLICATION
|
|
62
|
-
}).pipe(catchError(() => {
|
|
63
|
-
this.token = {};
|
|
64
|
-
return of(this.token);
|
|
65
|
-
}), map(token => {
|
|
66
|
-
this.token = {
|
|
67
|
-
...this.token,
|
|
68
|
-
...token
|
|
69
|
-
};
|
|
70
|
-
return this.token;
|
|
71
|
-
})) || of(token);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
_TokenService_token$ = new WeakMap();
|
|
75
|
-
TokenService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, deps: [{ token: i1.OAuthConfig }, { token: OAUTH_HTTP_CLIENT }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
76
|
-
TokenService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService });
|
|
77
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: TokenService, decorators: [{
|
|
78
|
-
type: Injectable
|
|
79
|
-
}], ctorParameters: function () { return [{ type: i1.OAuthConfig }, { type: i2.HttpClient, decorators: [{
|
|
80
|
-
type: Inject,
|
|
81
|
-
args: [OAUTH_HTTP_CLIENT]
|
|
82
|
-
}] }, { type: i0.NgZone }]; } });
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvbGliL3NlcnZpY2VzL3Rva2VuLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFjLEVBQUUsRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDdEYsT0FBTyxFQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUEwQixNQUFNLFdBQVcsQ0FBQztBQUN6RixPQUFPLEVBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWEsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFNUQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7QUFHN0csTUFBTSxPQUFPLFlBQVk7SUFpQnZCLFlBQXNCLFVBQXVCLEVBQ0ksSUFBZ0IsRUFDM0MsSUFBWTtRQUZaLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDSSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQzNDLFNBQUksR0FBSixJQUFJLENBQVE7UUFqQmxDLCtCQUFVLElBQUksZUFBZSxDQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQztRQUN0RCxXQUFNLEdBQUcsdUJBQUEsSUFBSSw0QkFBUSxDQUFDLElBQUksQ0FDeEIsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxJ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Q0FBQyxFQUFFO1lBQ0YsT0FBTyxFQUFFLGtCQUFrQjtTQUM1QixDQUFDLENBQUMsSUFBSSxDQUNMLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNoQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLEtBQUssR0FBRztnQkFDWCxHQUFHLElBQUksQ0FBQyxLQUFLO2dCQUNiLEdBQUcsS0FBSzthQUNULENBQUM7WUFDRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQ0gsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakIsQ0FBQzs7O3lHQTlFVSxZQUFZLDZDQWtCSCxpQkFBaUI7NkdBbEIxQixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQW1CSSxNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SEVBREVSX0FQUExJQ0FUSU9OLCBPQVVUSF9IVFRQX0NMSUVOVCwgT0F1dGhDb25maWcsIE9BdXRoVG9rZW59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIG1hcCwgc2hhcmVSZXBsYXl9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5jb25zdCBpc0V4cGlyZWRUb2tlbiA9ICh0b2tlbj86IE9BdXRoVG9rZW4pID0+IHRva2VuICYmIHRva2VuLmV4cGlyZXMgJiYgRGF0ZS5ub3coKSA+IHRva2VuLmV4cGlyZXMgfHwgZmFsc2U7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb2tlblNlcnZpY2Uge1xuXG4gICN0b2tlbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9BdXRoVG9rZW4+KHRoaXMuc2F2ZWQpO1xuICB0b2tlbiQgPSB0aGlzLiN0b2tlbiQucGlwZShcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocCwgYykgPT4gSlNPTi5zdHJpbmdpZnkocCB8fCBudWxsKSA9PT0gSlNPTi5zdHJpbmdpZnkoYyB8fCBudWxsKSksXG4gICAgc3dpdGNoTWFwKHRva2VuID0+ICFpc0V4cGlyZWRUb2tlbih0b2tlbikgJiYgb2YodG9rZW4pIHx8IHRoaXMucmVmcmVzaFRva2VuKHRva2VuKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgdHlwZSQgPSB0aGlzLnRva2VuJC5waXBlKFxuICAgIG1hcCh0b2tlbiA9PiB0b2tlbj8udHlwZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgYWNjZXNzVG9rZW4kID0gdGhpcy50b2tlbiQucGlwZShcbiAgICBtYXAodG9rZW4gPT4gdG9rZW4/LmFjY2Vzc190b2tlbiksXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gICk7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGF1dGhDb25maWc6IE9BdXRoQ29uZmlnLFxuICAgICAgICAgICAgICBASW5qZWN0KE9BVVRIX0hUVFBfQ0xJRU5UKSBwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHpvbmU6IE5nWm9uZSkge1xuICB9XG5cbiAgZ2V0IHRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLiN0b2tlbiQudmFsdWU7XG4gIH1cblxuICBzZXQgdG9rZW4odG9rZW4pIHtcbiAgICBjb25zdCBleHBpcmVzSW4gPSBOdW1iZXIodG9rZW4uZXhwaXJlc19pbikgfHwgMDtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi50b2tlbixcbiAgICAgIC4uLmV4cGlyZXNJbiAmJiB7ZXhwaXJlczogRGF0ZS5ub3coKSArIGV4cGlyZXNJbiAqIDEwMDB9IHx8IHt9XG4gICAgfTtcbiAgICB0aGlzLnNhdmVkID0gcmVzdWx0O1xuICAgIHRoaXMuI3Rva2VuJC5uZXh0KHJlc3VsdCk7XG4gIH1cblxuICBnZXQgc2F2ZWQoKSB7XG4gICAgY29uc3Qge3N0b3JhZ2VLZXksIHN0b3JhZ2V9ID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgIHJldHVybiBzdG9yYWdlS2V5ICYmIHN0b3JhZ2UgJiYgc3RvcmFnZVtzdG9yYWdlS2V5XSAmJiBKU09OLnBhcnNlKHN0b3JhZ2Vbc3RvcmFnZUtleV0pIHx8IHt9O1xuICB9XG5cbiAgc2V0IHNhdmVkKHRva2VuOiBPQXV0aFRva2VuKSB7XG4gICAgY29uc3Qge3N0b3JhZ2VLZXksIHN0b3JhZ2V9ID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgIGlmIChzdG9yYWdlICYmIHN0b3JhZ2VLZXkpIHtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBzdG9yYWdlW3N0b3JhZ2VLZXldID0gSlNPTi5zdHJpbmdpZnkodG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHN0b3JhZ2Vbc3RvcmFnZUtleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hUb2tlbih0b2tlbj86IE9BdXRoVG9rZW4pOiBPYnNlcnZhYmxlPE9BdXRoVG9rZW4+IHtcbiAgICBjb25zdCB7dG9rZW5QYXRoLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB7cmVmcmVzaF90b2tlbn0gPSB0b2tlbiB8fCB7fTtcbiAgICByZXR1cm4gdG9rZW5QYXRoICYmIHJlZnJlc2hfdG9rZW4gJiYgdGhpcy5odHRwLnBvc3Q8T0F1dGhUb2tlbj4odG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICByZWZyZXNoX3Rva2VuLFxuICAgICAgICAuLi5zY29wZSAmJiB7c2NvcGV9IHx8IHt9LFxuICAgICAgfVxuICAgIH0pLCB7XG4gICAgICBoZWFkZXJzOiBIRUFERVJfQVBQTElDQVRJT05cbiAgICB9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7fTtcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMudG9rZW4pO1xuICAgICAgfSksXG4gICAgICBtYXAodG9rZW4gPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0ge1xuICAgICAgICAgIC4uLnRoaXMudG9rZW4sXG4gICAgICAgICAgLi4udG9rZW5cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW47XG4gICAgICB9KVxuICAgICkgfHwgb2YodG9rZW4pO1xuICB9XG59XG4iXX0=
|