vix-ui
Version:
A set of essential UI modules for your Angular application in ViSenze
274 lines (273 loc) • 24.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { OAuthService } from 'angular-oauth2-oidc';
import { Injectable } from '@angular/core';
import * as OktaAuth from '@okta/okta-auth-js';
import { AuthConfigService } from './auth-config.service';
import { OktaService } from './okta.service';
import { UserInfo } from '../modules/user-info';
import { UserGroups } from '../modules/user-groups';
/**
* VixAuthService is the interface exported to users. It wraps all API and methods.
*/
export class VixAuthService {
/**
* @param {?} oauth
* @param {?} authConfig
* @param {?} okta
*/
constructor(oauth, authConfig, okta) {
this.oauth = oauth;
this.authConfig = authConfig;
this.okta = okta;
this.oktaAuth = new OktaAuth({
url: this.authConfig.getUrl(),
issuer: this.authConfig.getIssuer()
});
}
/**
* Check permissions by userGroups and requireGroups
*
* @param {?} userGroups groups users are in
* @param {?} requireGroups groups application requires user to have
* @return {?} true/false
*/
static hasPermission(userGroups, requireGroups) {
return userGroups.hasPermission(requireGroups);
}
/**
* Use tokenManager to store userId
* TODO: actually I have problems in create a cache object to hold all these cache variables, so I use tokenManager to do these works.
* TODO: need to create a share service to provide cache service
*
* @param {?} userId
* @return {?}
*/
setUserId(userId) {
const /** @type {?} */ obj = {
accessToken: 'userId',
expiresAt: Math.round((new Date()).getTime() / 1000 + 3600),
scopes: [userId]
};
this.oktaAuth.tokenManager.add('userId', obj);
}
/**
* Get userId from tokenManager
* @return {?}
*/
getUserId() {
const /** @type {?} */ userIdObj = this.oktaAuth.tokenManager.get('userId');
if (userIdObj) {
return this.oktaAuth.tokenManager.get('userId').scopes[0];
}
else {
return null;
}
}
/**
* Store userGroup and shared among browsers by TokenManager with key 'userGroup'
*
* @param {?} userGroups
* @return {?}
*/
setCurrentUserGroups(userGroups) {
const /** @type {?} */ obj = {
accessToken: 'userGroups',
expiresAt: Math.round((new Date()).getTime() / 1000 + 3600),
scopes: userGroups.groups
};
this.oktaAuth.tokenManager.add('userGroups', obj);
}
/**
* Get stored userGroups and refresh if expires
*
* @return {?}
*/
getLoginUserGroups() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const /** @type {?} */ userGroupsTokenObj = this.oktaAuth.tokenManager.get('userGroups');
const /** @type {?} */ nowSecond = (new Date()).getTime() / 1000;
if (!userGroupsTokenObj || nowSecond > userGroupsTokenObj.expireAt) {
const /** @type {?} */ tmpUserGroups = yield this.getUserGroups(this.getUserId());
this.setCurrentUserGroups(tmpUserGroups);
}
const /** @type {?} */ userGroups = new UserGroups(null);
userGroups.groups = this.oktaAuth.tokenManager.get('userGroups').scopes;
return userGroups;
});
}
/**
* Get current login userInfo
* TODO: we can cache user info includes groups information when finished login
*
* @return {?}
*/
getUserInfo() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (this.isLogin()) {
const /** @type {?} */ oktaUserInfo = yield this.okta.getUserInfo(this.getUserId());
return yield new UserInfo(oktaUserInfo);
}
else {
return Promise.reject('not login');
}
});
}
/**
* get userGroup by given userId
*
* @param {?} userId
* @return {?}
*/
getUserGroups(userId) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (this.isLogin()) {
try {
const /** @type {?} */ oktaUserGroups = yield this.okta.getUserGroups(userId);
return yield new UserGroups(oktaUserGroups);
}
catch (/** @type {?} */ err) {
console.log('getUserGroups err', err);
// return new UserGroups(null);
}
}
else {
return null;
}
});
}
/**
* Return if already login by check the existence of accessToken
*
* @return {?}
*/
isLogin() {
return !!this.getUserId();
}
/**
* Redirect to url for Google login
* @param {?} redirectUrl
* @return {?}
*/
loginWithGoogle(redirectUrl) {
window.location.href = `${this.authConfig.getUrl()}/oauth2/v1/authorize?` +
`idp=0oadulhuz78SMW8cD0h7&client_id=${this.authConfig.getClientId()}&response_type=id_token&` +
`response_mode=fragment&scope=openid&scope=email&scope=picture&scope=name&` +
`state=WM6D&nonce=YsG76jo&redirect_uri=${redirectUrl}`;
}
/**
* Login by username and password
*
* @param {?} username
* @param {?} password
* @return {?}
*/
loginWithPassword(username, password) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const /** @type {?} */ nonce = yield this.oauth.createAndSaveNonce();
const /** @type {?} */ signInResponse = yield this.oktaAuth.signIn({ username: username, password: password });
if (signInResponse.status === 'SUCCESS') {
yield this.oktaAuth.token.getWithoutPrompt({
clientId: this.authConfig.getClientId(),
responseType: ['id_token', 'token'],
scopes: ['openid', 'profile', 'email'],
sessionToken: signInResponse.sessionToken,
nonce: nonce,
redirectUri: window.location.origin
});
const /** @type {?} */ session = yield this.getSession();
if (session.status === 'ACTIVE') {
console.log('session ACTIVE');
this.setUserId(session.userId);
}
return Promise.resolve('login successfully');
}
else {
return Promise.reject('username or password error');
}
});
}
/**
* List all groups
*
* @return {?}
*/
listGroups() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
return yield this.okta.listGroups();
});
}
/**
* Get session
*
* @return {?}
*/
getSession() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
return yield this.oktaAuth.session.get();
});
}
/**
* Navigate browser to login page
* @return {?}
*/
navigateToLoginPage() {
console.log('navigateToLoginPage:', this.authConfig.getLoginUrl());
document.location.href = this.authConfig.getLoginUrl();
}
/**
* Navigate browser to redirect page
* @return {?}
*/
navigateToRedirectPage() {
console.log('navigateToRedirectPage:', this.authConfig.getRedirectUrl());
document.location.href = this.authConfig.getRedirectUrl();
}
/**
* Logout current user and clear token
*
* @return {?}
*/
logout() {
if (this.isLogin()) {
this.oktaAuth.tokenManager.clear();
console.log('start to logout');
this.oktaAuth.signOut().then(() => {
console.log('logout done, to navigate', this.authConfig.getLoginUrl());
this.navigateToLoginPage();
});
}
else {
}
}
}
VixAuthService.decorators = [
{ type: Injectable },
];
/** @nocollapse */
VixAuthService.ctorParameters = () => [
{ type: OAuthService, },
{ type: AuthConfigService, },
{ type: OktaService, },
];
function VixAuthService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
VixAuthService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
VixAuthService.ctorParameters;
/** @type {?} */
VixAuthService.prototype.oktaAuth;
/** @type {?} */
VixAuthService.prototype.oauth;
/** @type {?} */
VixAuthService.prototype.authConfig;
/** @type {?} */
VixAuthService.prototype.okta;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdml4LXVpLyIsInNvdXJjZXMiOlsidml4LXNlcnZpY2VzL2F1dGgvc2VydmljZXMvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQU1wRCxNQUFNOzs7Ozs7SUFHSixZQUFvQixLQUFtQixFQUNuQixZQUNBO1FBRkEsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixlQUFVLEdBQVYsVUFBVTtRQUNWLFNBQUksR0FBSixJQUFJO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUM7WUFDM0IsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRTtTQUNwQyxDQUFDLENBQUM7S0FDSjs7Ozs7Ozs7SUFVRCxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQXNCLEVBQUUsYUFBdUI7UUFDbEUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDaEQ7Ozs7Ozs7OztJQVNELFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLHVCQUFNLEdBQUcsR0FBRztZQUNWLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFNBQVMs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O1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7S0FDM0Q7Ozs7OztJQU9ELE1BQU07UUFDSixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUM1QixDQUFDLENBQUM7U0FDSjtRQUFDLElBQUksQ0FBQyxDQUFDO1NBQ1A7S0FDRjs7O1lBMU5GLFVBQVU7Ozs7WUFYRixZQUFZO1lBR1osaUJBQWlCO1lBQ2pCLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIE9rdGFBdXRoIGZyb20gJ0Bva3RhL29rdGEtYXV0aC1qcyc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4vYXV0aC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBPa3RhU2VydmljZSB9IGZyb20gJy4vb2t0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJJbmZvIH0gZnJvbSAnLi4vbW9kdWxlcy91c2VyLWluZm8nO1xuaW1wb3J0IHsgVXNlckdyb3VwcyB9IGZyb20gJy4uL21vZHVsZXMvdXNlci1ncm91cHMnO1xuXG4vKipcbiAqIFZpeEF1dGhTZXJ2aWNlIGlzIHRoZSBpbnRlcmZhY2UgZXhwb3J0ZWQgdG8gdXNlcnMuIEl0IHdyYXBzIGFsbCBBUEkgYW5kIG1ldGhvZHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWaXhBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgb2t0YUF1dGg6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9hdXRoOiBPQXV0aFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgYXV0aENvbmZpZzogQXV0aENvbmZpZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgb2t0YTogT2t0YVNlcnZpY2UpIHtcbiAgICB0aGlzLm9rdGFBdXRoID0gbmV3IE9rdGFBdXRoKHtcbiAgICAgIHVybDogdGhpcy5hdXRoQ29uZmlnLmdldFVybCgpLFxuICAgICAgaXNzdWVyOiB0aGlzLmF1dGhDb25maWcuZ2V0SXNzdWVyKClcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENoZWNrIHBlcm1pc3Npb25zIGJ5IHVzZXJHcm91cHMgYW5kIHJlcXVpcmVHcm91cHNcbiAgICpcbiAgICogQHBhcmFtIHVzZXJHcm91cHMgZ3JvdXBzIHVzZXJzIGFyZSBpblxuICAgKiBAcGFyYW0gcmVxdWlyZUdyb3VwcyBncm91cHMgYXBwbGljYXRpb24gcmVxdWlyZXMgdXNlciB0byBoYXZlXG4gICAqIEByZXR1cm5zIHRydWUvZmFsc2VcbiAgICovXG4gIHN0YXRpYyBoYXNQZXJtaXNzaW9uKHVzZXJHcm91cHM6IFVzZXJHcm91cHMsIHJlcXVpcmVHcm91cHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHVzZXJHcm91cHMuaGFzUGVybWlzc2lvbihyZXF1aXJlR3JvdXBzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG9rZW5NYW5hZ2VyIHRvIHN0b3JlIHVzZXJJZFxuICAgKiBUT0RPOiBhY3R1YWxseSBJIGhhdmUgcHJvYmxlbXMgaW4gY3JlYXRlIGEgY2FjaGUgb2JqZWN0IHRvIGhvbGQgYWxsIHRoZXNlIGNhY2hlIHZhcmlhYmxlcywgc28gSSB1c2UgdG9rZW5NYW5hZ2VyIHRvIGRvIHRoZXNlIHdvcmtzLlxuICAgKiBUT0RPOiBuZWVkIHRvIGNyZWF0ZSBhIHNoYXJlIHNlcnZpY2UgdG8gcHJvdmlkZSBjYWNoZSBzZXJ2aWNlXG4gICAqXG4gICAqIEBwYXJhbSB1c2VySWRcbiAgICovXG4gIHNldFVzZXJJZCh1c2VySWQ6IHN0cmluZykge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiAndXNlcklkJyxcbiAgICAgIGV4cGlyZXNBdDogTWF0aC5yb3VuZCgobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMCArIDM2MDApLFxuICAgICAgc2NvcGVzOiBbdXNlcklkXVxuICAgIH07XG4gICAgdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuYWRkKCd1c2VySWQnLCBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VySWQgZnJvbSB0b2tlbk1hbmFnZXJcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFVzZXJJZCgpIHtcbiAgICBjb25zdCB1c2VySWRPYmogPSB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJJZCcpO1xuICAgIGlmICh1c2VySWRPYmopIHtcbiAgICAgIHJldHVybiB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJJZCcpLnNjb3Blc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3JlIHVzZXJHcm91cCBhbmQgc2hhcmVkIGFtb25nIGJyb3dzZXJzIGJ5IFRva2VuTWFuYWdlciB3aXRoIGtleSAndXNlckdyb3VwJ1xuICAgKlxuICAgKiBAcGFyYW0gdXNlckdyb3Vwc1xuICAgKi9cbiAgc2V0Q3VycmVudFVzZXJHcm91cHModXNlckdyb3VwczogVXNlckdyb3Vwcykge1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiAndXNlckdyb3VwcycsXG4gICAgICBleHBpcmVzQXQ6IE1hdGgucm91bmQoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDAgKyAzNjAwKSxcbiAgICAgIHNjb3BlczogdXNlckdyb3Vwcy5ncm91cHNcbiAgICB9O1xuICAgIHRoaXMub2t0YUF1dGgudG9rZW5NYW5hZ2VyLmFkZCgndXNlckdyb3VwcycsIG9iaik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0b3JlZCB1c2VyR3JvdXBzIGFuZCByZWZyZXNoIGlmIGV4cGlyZXNcbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGdldExvZ2luVXNlckdyb3VwcygpOiBQcm9taXNlPFVzZXJHcm91cHM+IHtcbiAgICBjb25zdCB1c2VyR3JvdXBzVG9rZW5PYmogPSB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJHcm91cHMnKTtcbiAgICBjb25zdCBub3dTZWNvbmQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICBpZiAoIXVzZXJHcm91cHNUb2tlbk9iaiB8fCBub3dTZWNvbmQgPiB1c2VyR3JvdXBzVG9rZW5PYmouZXhwaXJlQXQpIHtcbiAgICAgIGNvbnN0IHRtcFVzZXJHcm91cHMgPSBhd2FpdCB0aGlzLmdldFVzZXJHcm91cHModGhpcy5nZXRVc2VySWQoKSk7XG4gICAgICB0aGlzLnNldEN1cnJlbnRVc2VyR3JvdXBzKHRtcFVzZXJHcm91cHMpO1xuICAgIH1cbiAgICBjb25zdCB1c2VyR3JvdXBzID0gbmV3IFVzZXJHcm91cHMobnVsbCk7XG4gICAgdXNlckdyb3Vwcy5ncm91cHMgPSB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5nZXQoJ3VzZXJHcm91cHMnKS5zY29wZXM7XG4gICAgcmV0dXJuIHVzZXJHcm91cHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgbG9naW4gdXNlckluZm9cbiAgICogVE9ETzogd2UgY2FuIGNhY2hlIHVzZXIgaW5mbyBpbmNsdWRlcyBncm91cHMgaW5mb3JtYXRpb24gd2hlbiBmaW5pc2hlZCBsb2dpblxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZ2V0VXNlckluZm8oKTogUHJvbWlzZTxVc2VySW5mbz4ge1xuICAgIGlmICh0aGlzLmlzTG9naW4oKSkge1xuICAgICAgY29uc3Qgb2t0YVVzZXJJbmZvID0gYXdhaXQgdGhpcy5va3RhLmdldFVzZXJJbmZvKHRoaXMuZ2V0VXNlcklkKCkpO1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBVc2VySW5mbyhva3RhVXNlckluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ25vdCBsb2dpbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdXNlckdyb3VwIGJ5IGdpdmVuIHVzZXJJZFxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBnZXRVc2VyR3JvdXBzKHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyR3JvdXBzPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dpbigpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBva3RhVXNlckdyb3VwcyA9IGF3YWl0IHRoaXMub2t0YS5nZXRVc2VyR3JvdXBzKHVzZXJJZCk7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXcgVXNlckdyb3Vwcyhva3RhVXNlckdyb3Vwcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2dldFVzZXJHcm91cHMgZXJyJywgZXJyKTtcbiAgICAgICAgLy8gcmV0dXJuIG5ldyBVc2VyR3JvdXBzKG51bGwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGlmIGFscmVhZHkgbG9naW4gYnkgY2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiBhY2Nlc3NUb2tlblxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgaXNMb2dpbigpOiBhbnkge1xuICAgIHJldHVybiAhIXRoaXMuZ2V0VXNlcklkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVkaXJlY3QgdG8gdXJsIGZvciBHb29nbGUgbG9naW5cbiAgICovXG4gIGxvZ2luV2l0aEdvb2dsZShyZWRpcmVjdFVybDogc3RyaW5nKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgJHt0aGlzLmF1dGhDb25maWcuZ2V0VXJsKCl9L29hdXRoMi92MS9hdXRob3JpemU/YCArXG4gICAgICBgaWRwPTBvYWR1bGh1ejc4U01XOGNEMGg3JmNsaWVudF9pZD0ke3RoaXMuYXV0aENvbmZpZy5nZXRDbGllbnRJZCgpfSZyZXNwb25zZV90eXBlPWlkX3Rva2VuJmAgK1xuICAgICAgYHJlc3BvbnNlX21vZGU9ZnJhZ21lbnQmc2NvcGU9b3BlbmlkJnNjb3BlPWVtYWlsJnNjb3BlPXBpY3R1cmUmc2NvcGU9bmFtZSZgICtcbiAgICAgIGBzdGF0ZT1XTTZEJm5vbmNlPVlzRzc2am8mcmVkaXJlY3RfdXJpPSR7cmVkaXJlY3RVcmx9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpbiBieSB1c2VybmFtZSBhbmQgcGFzc3dvcmRcbiAgICpcbiAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBhd2FpdCB0aGlzLm9hdXRoLmNyZWF0ZUFuZFNhdmVOb25jZSgpO1xuICAgIGNvbnN0IHNpZ25JblJlc3BvbnNlID0gYXdhaXQgdGhpcy5va3RhQXV0aC5zaWduSW4oe3VzZXJuYW1lOiB1c2VybmFtZSwgcGFzc3dvcmQ6IHBhc3N3b3JkfSk7XG4gICAgaWYgKHNpZ25JblJlc3BvbnNlLnN0YXR1cyA9PT0gJ1NVQ0NFU1MnKSB7XG4gICAgICBhd2FpdCB0aGlzLm9rdGFBdXRoLnRva2VuLmdldFdpdGhvdXRQcm9tcHQoe1xuICAgICAgICBjbGllbnRJZDogdGhpcy5hdXRoQ29uZmlnLmdldENsaWVudElkKCksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogWydpZF90b2tlbicsICd0b2tlbiddLFxuICAgICAgICBzY29wZXM6IFsnb3BlbmlkJywgJ3Byb2ZpbGUnLCAnZW1haWwnXSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBzaWduSW5SZXNwb25zZS5zZXNzaW9uVG9rZW4sXG4gICAgICAgIG5vbmNlOiBub25jZSxcbiAgICAgICAgcmVkaXJlY3RVcmk6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpO1xuICAgICAgaWYgKHNlc3Npb24uc3RhdHVzID09PSAnQUNUSVZFJykge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Vzc2lvbiBBQ1RJVkUnKTtcbiAgICAgICAgdGhpcy5zZXRVc2VySWQoc2Vzc2lvbi51c2VySWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgnbG9naW4gc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgndXNlcm5hbWUgb3IgcGFzc3dvcmQgZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgZ3JvdXBzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEdyb3VwcygpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5va3RhLmxpc3RHcm91cHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2Vzc2lvblxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub2t0YUF1dGguc2Vzc2lvbi5nZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSBicm93c2VyIHRvIGxvZ2luIHBhZ2VcbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0ZVRvTG9naW5QYWdlKCkge1xuICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0ZVRvTG9naW5QYWdlOicsIHRoaXMuYXV0aENvbmZpZy5nZXRMb2dpblVybCgpKTtcbiAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gdGhpcy5hdXRoQ29uZmlnLmdldExvZ2luVXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgYnJvd3NlciB0byByZWRpcmVjdCBwYWdlXG4gICAqL1xuICBuYXZpZ2F0ZVRvUmVkaXJlY3RQYWdlKCkge1xuICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0ZVRvUmVkaXJlY3RQYWdlOicsIHRoaXMuYXV0aENvbmZpZy5nZXRSZWRpcmVjdFVybCgpKTtcbiAgICBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gdGhpcy5hdXRoQ29uZmlnLmdldFJlZGlyZWN0VXJsKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGN1cnJlbnQgdXNlciBhbmQgY2xlYXIgdG9rZW5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICovXG4gIGxvZ291dCgpIHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIHRoaXMub2t0YUF1dGgudG9rZW5NYW5hZ2VyLmNsZWFyKCk7XG4gICAgICBjb25zb2xlLmxvZygnc3RhcnQgdG8gbG9nb3V0Jyk7XG4gICAgICB0aGlzLm9rdGFBdXRoLnNpZ25PdXQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2xvZ291dCBkb25lLCB0byBuYXZpZ2F0ZScsIHRoaXMuYXV0aENvbmZpZy5nZXRMb2dpblVybCgpKTtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvTG9naW5QYWdlKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgIH1cbiAgfVxufVxuIl19