@knora/core
Version:
Knora ui module: core
179 lines • 23 kB
JavaScript
import * as tslib_1 from "tslib";
import { Inject, Injectable } from '@angular/core';
import { ApiResponseData, ApiResponseError, CredentialsResponse, KnoraApiConfig, KnoraApiConnection, UserResponse, Constants } from '@knora/api';
import * as momentImported from 'moment';
import { KnoraApiConfigToken, KnoraApiConnectionToken } from './core.module';
import * as i0 from "@angular/core";
import * as i1 from "./core.module";
var moment = momentImported;
var SessionService = /** @class */ (function () {
function SessionService(knoraApiConnection, knoraApiConfig) {
this.knoraApiConnection = knoraApiConnection;
this.knoraApiConfig = knoraApiConfig;
/**
* max session time in milliseconds
* default value (24h): 86400000
*
*/
this.MAX_SESSION_TIME = 86400000; // 1d = 24 * 60 * 60 * 1000
}
/**
* set the session by using the json web token (jwt) and the user object;
* it will be used in the login process
*
* @param jwt
* @param username
*/
SessionService.prototype.setSession = function (jwt, identifier, identifierType) {
var _this = this;
var session;
this.updateKnoraApiConnection(jwt);
// get user information
this.knoraApiConnection.admin.usersEndpoint.getUser(identifierType, identifier).subscribe(function (response) {
var e_1, _a;
var sysAdmin = false;
var projectAdmin = [];
// get permission inforamation: a) is user sysadmin? b) get list of project iris where user is project admin
var groupsPerProjectKeys = Object.keys(response.body.user.permissions.groupsPerProject);
try {
for (var groupsPerProjectKeys_1 = tslib_1.__values(groupsPerProjectKeys), groupsPerProjectKeys_1_1 = groupsPerProjectKeys_1.next(); !groupsPerProjectKeys_1_1.done; groupsPerProjectKeys_1_1 = groupsPerProjectKeys_1.next()) {
var key = groupsPerProjectKeys_1_1.value;
if (key === Constants.SystemProjectIRI) {
sysAdmin = response.body.user.permissions.groupsPerProject[key].indexOf(Constants.SystemAdminGroupIRI) > -1;
}
if (response.body.user.permissions.groupsPerProject[key].indexOf(Constants.ProjectAdminGroupIRI) > -1) {
projectAdmin.push(key);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (groupsPerProjectKeys_1_1 && !groupsPerProjectKeys_1_1.done && (_a = groupsPerProjectKeys_1.return)) _a.call(groupsPerProjectKeys_1);
}
finally { if (e_1) throw e_1.error; }
}
// store session information in browser's localstorage
session = {
id: _this.setTimestamp(),
user: {
name: response.body.user.username,
jwt: jwt,
lang: response.body.user.lang,
sysAdmin: sysAdmin,
projectAdmin: projectAdmin
}
};
// update localStorage
localStorage.setItem('session', JSON.stringify(session));
}, function (error) {
localStorage.removeItem('session');
console.error(error);
});
};
/**
* Validate intern session and check knora api credentials if necessary.
* If a json web token exists, it doesn't mean, that the knora api credentials are still valid.
*
* @returns boolean
*/
SessionService.prototype.validateSession = function () {
var _this = this;
// mix of checks with session.validation and this.authenticate
var session = JSON.parse(localStorage.getItem('session'));
var tsNow = this.setTimestamp();
if (session) {
this.updateKnoraApiConnection(session.user.jwt);
// check if the session is still valid:
if (session.id + this.MAX_SESSION_TIME <= tsNow) {
// the internal (knora-ui) session has expired
// check if the api credentails are still valid
// console.error('session is not valid; check knora api credentials');
this.knoraApiConnection.v2.auth.checkCredentials().subscribe(function (response) {
// the knora api credentials are still valid
// console.log('knora api credentials', response);
// refresh the jwt in @knora/api
_this.updateKnoraApiConnection(session.user.jwt);
// update the session.id
session.id = tsNow;
localStorage.setItem('session', JSON.stringify(session));
// console.log('knora api credentials are valid; return', true);
return true;
}, function (error) {
// a user is not authenticated anymore!
// console.error('session.service -- validateSession -- authenticate: the session expired on API side');
_this.destroySession();
// console.warn('knora api credentials are not valid; return', false);
return false;
});
}
else {
// the internal (knora-ui) session is still valid
// console.log('session is valid; return', true);
return true;
}
}
else {
// no session found; update knora api connection with empty jwt
this.updateKnoraApiConnection();
// console.warn('session is not valid; return', false);
return false;
}
};
/**
* update the session storage
* @param jwt
* @param username
*
* @returns boolean
*/
SessionService.prototype.updateSession = function (jwt, username) {
if (jwt && username) {
this.setSession(jwt, username, 'username');
return true;
}
else {
return false;
}
};
/**
* Destroy session by removing the session from local storage
*
*/
SessionService.prototype.destroySession = function () {
localStorage.removeItem('session');
};
/**
* Update the knora-api-config and knora-api-connection of @knora/api
*
* @param {string} jwt?
*/
SessionService.prototype.updateKnoraApiConnection = function (jwt) {
this.knoraApiConfig.jsonWebToken = (jwt ? jwt : '');
this.knoraApiConnection = new KnoraApiConnection(this.knoraApiConfig);
};
/**
* Convert a timestamp in a number
* @returns number
*/
SessionService.prototype.setTimestamp = function () {
return (moment().add(0, 'second')).valueOf();
};
SessionService.ctorParameters = function () { return [
{ type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] },
{ type: KnoraApiConfig, decorators: [{ type: Inject, args: [KnoraApiConfigToken,] }] }
]; };
SessionService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function SessionService_Factory() { return new SessionService(i0.ɵɵinject(i1.KnoraApiConnectionToken), i0.ɵɵinject(i1.KnoraApiConfigToken)); }, token: SessionService, providedIn: "root" });
SessionService = tslib_1.__decorate([
Injectable({
providedIn: 'root'
}),
tslib_1.__param(0, Inject(KnoraApiConnectionToken)),
tslib_1.__param(1, Inject(KnoraApiConfigToken)),
tslib_1.__metadata("design:paramtypes", [KnoraApiConnection,
KnoraApiConfig])
], SessionService);
return SessionService;
}());
export { SessionService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc2Vzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pKLE9BQU8sS0FBSyxjQUFjLE1BQU0sUUFBUSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBK0I3RSxJQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFLOUI7SUFVSSx3QkFDNkMsa0JBQXNDLEVBQzFDLGNBQThCO1FBRDFCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBVnZFOzs7O1VBSUU7UUFDTyxxQkFBZ0IsR0FBVyxRQUFRLENBQUMsQ0FBQywyQkFBMkI7SUFNckUsQ0FBQztJQUlMOzs7Ozs7U0FNSztJQUNMLG1DQUFVLEdBQVYsVUFBVyxHQUFXLEVBQUUsVUFBa0IsRUFBRSxjQUFvQztRQUFoRixpQkE0Q0M7UUExQ0csSUFBSSxPQUFnQixDQUFDO1FBRXJCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuQyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQ3JGLFVBQUMsUUFBdUM7O1lBQ3BDLElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztZQUM5QixJQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7WUFFbEMsNEdBQTRHO1lBQzVHLElBQU0sb0JBQW9CLEdBQWEsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7Z0JBRXBHLEtBQWtCLElBQUEseUJBQUEsaUJBQUEsb0JBQW9CLENBQUEsMERBQUEsNEZBQUU7b0JBQW5DLElBQU0sR0FBRyxpQ0FBQTtvQkFDVixJQUFJLEdBQUcsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLEVBQUU7d0JBQ3BDLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUMvRztvQkFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQ25HLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQzFCO2lCQUNKOzs7Ozs7Ozs7WUFFRCxzREFBc0Q7WUFDdEQsT0FBTyxHQUFHO2dCQUNOLEVBQUUsRUFBRSxLQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN2QixJQUFJLEVBQUU7b0JBQ0YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7b0JBQ2pDLEdBQUcsRUFBRSxHQUFHO29CQUNSLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO29CQUM3QixRQUFRLEVBQUUsUUFBUTtvQkFDbEIsWUFBWSxFQUFFLFlBQVk7aUJBQzdCO2FBQ0osQ0FBQztZQUNGLHNCQUFzQjtZQUN0QixZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxFQUNELFVBQUMsS0FBdUI7WUFDcEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsd0NBQWUsR0FBZjtRQUFBLGlCQXlEQztRQXhERyw4REFBOEQ7UUFDOUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFNUQsSUFBTSxLQUFLLEdBQVcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRTFDLElBQUksT0FBTyxFQUFFO1lBRVQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFaEQsdUNBQXVDO1lBQ3ZDLElBQUksT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLElBQUksS0FBSyxFQUFFO2dCQUM3Qyw4Q0FBOEM7Z0JBQzlDLCtDQUErQztnQkFFL0Msc0VBQXNFO2dCQUV0RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FDeEQsVUFBQyxRQUE4QztvQkFDM0MsNENBQTRDO29CQUM1QyxrREFBa0Q7b0JBRWxELGdDQUFnQztvQkFDaEMsS0FBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBRWhELHdCQUF3QjtvQkFDeEIsT0FBTyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7b0JBRW5CLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztvQkFFekQsZ0VBQWdFO29CQUNoRSxPQUFPLElBQUksQ0FBQztnQkFDaEIsQ0FBQyxFQUNELFVBQUMsS0FBdUI7b0JBQ3BCLHVDQUF1QztvQkFDdkMsd0dBQXdHO29CQUV4RyxLQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBRXRCLHNFQUFzRTtvQkFDdEUsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUMsQ0FDSixDQUFDO2FBRUw7aUJBQU07Z0JBQ0gsaURBQWlEO2dCQUVqRCxpREFBaUQ7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjthQUFNO1lBQ0gsK0RBQStEO1lBQy9ELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBRWhDLHVEQUF1RDtZQUN2RCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxzQ0FBYSxHQUFiLFVBQWMsR0FBVyxFQUFFLFFBQWdCO1FBQ3ZDLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUNBQWMsR0FBZDtRQUNJLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpREFBd0IsR0FBaEMsVUFBaUMsR0FBWTtRQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHFDQUFZLEdBQXBCO1FBQ0ksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqRCxDQUFDOztnQkFwS2dFLGtCQUFrQix1QkFBOUUsTUFBTSxTQUFDLHVCQUF1QjtnQkFDc0IsY0FBYyx1QkFBbEUsTUFBTSxTQUFDLG1CQUFtQjs7O0lBWnRCLGNBQWM7UUFIMUIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztRQVlPLG1CQUFBLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQy9CLG1CQUFBLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2lEQURpQyxrQkFBa0I7WUFDMUIsY0FBYztPQVo5RCxjQUFjLENBa0wxQjt5QkExTkQ7Q0EwTkMsQUFsTEQsSUFrTEM7U0FsTFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VEYXRhLCBBcGlSZXNwb25zZUVycm9yLCBDcmVkZW50aWFsc1Jlc3BvbnNlLCBLbm9yYUFwaUNvbmZpZywgS25vcmFBcGlDb25uZWN0aW9uLCBVc2VyUmVzcG9uc2UsIENvbnN0YW50cyB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgS25vcmFBcGlDb25maWdUb2tlbiwgS25vcmFBcGlDb25uZWN0aW9uVG9rZW4gfSBmcm9tICcuL2NvcmUubW9kdWxlJztcbmltcG9ydCB7IEtub3JhQ29uc3RhbnRzIH0gZnJvbSAnLi9kZWNsYXJhdGlvbnMnO1xuXG4vKipcbiAqIEN1cnJlbnRseSBsb2dnZWQtaW4gdXNlciBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRVc2VyIHtcbiAgICAvLyB1c2VybmFtZVxuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8vIGpzb24gd2ViIHRva2VuXG4gICAgand0OiBzdHJpbmc7XG5cbiAgICAvLyBkZWZhdWx0IGxhbmd1YWdlIGZvciB1aVxuICAgIGxhbmc6IHN0cmluZztcblxuICAgIC8vIGlzIHN5c3RlbSBhZG1pbj9cbiAgICBzeXNBZG1pbjogYm9vbGVhbjtcblxuICAgIC8vIGxpc3Qgb2YgcHJvamVjdCBzaG9ydGNvZGVzIHdoZXJlIHRoZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICBwcm9qZWN0QWRtaW46IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlc3Npb24gd2l0aCBpZCAoPSBsb2dpbiB0aW1lc3RhbXApIGFuZCBpbmZvcmFtdGlvbiBhYm91dCBsb2dnZWQtaW4gdXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcjogQ3VycmVudFVzZXI7XG59XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlc3Npb25TZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICogbWF4IHNlc3Npb24gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAqIGRlZmF1bHQgdmFsdWUgKDI0aCk6IDg2NDAwMDAwXG4gICAgKlxuICAgICovXG4gICAgcmVhZG9ubHkgTUFYX1NFU1NJT05fVElNRTogbnVtYmVyID0gODY0MDAwMDA7IC8vIDFkID0gMjQgKiA2MCAqIDYwICogMTAwMFxuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbm5lY3Rpb25Ub2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbm5lY3Rpb246IEtub3JhQXBpQ29ubmVjdGlvbixcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbmZpZ1Rva2VuKSBwcml2YXRlIGtub3JhQXBpQ29uZmlnOiBLbm9yYUFwaUNvbmZpZ1xuICAgICkgeyB9XG5cblxuXG4gICAgLyoqXG4gICAgICAgKiBzZXQgdGhlIHNlc3Npb24gYnkgdXNpbmcgdGhlIGpzb24gd2ViIHRva2VuIChqd3QpIGFuZCB0aGUgdXNlciBvYmplY3Q7XG4gICAgICAgKiBpdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGxvZ2luIHByb2Nlc3NcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gand0XG4gICAgICAgKiBAcGFyYW0gdXNlcm5hbWVcbiAgICAgICAqL1xuICAgIHNldFNlc3Npb24oand0OiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgaWRlbnRpZmllclR5cGU6ICdlbWFpbCcgfCAndXNlcm5hbWUnKSB7XG5cbiAgICAgICAgbGV0IHNlc3Npb246IFNlc3Npb247XG5cbiAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0KTtcblxuICAgICAgICAvLyBnZXQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi5hZG1pbi51c2Vyc0VuZHBvaW50LmdldFVzZXIoaWRlbnRpZmllclR5cGUsIGlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPFVzZXJSZXNwb25zZT4pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3lzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0QWRtaW46IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgcGVybWlzc2lvbiBpbmZvcmFtYXRpb246IGEpIGlzIHVzZXIgc3lzYWRtaW4/IGIpIGdldCBsaXN0IG9mIHByb2plY3QgaXJpcyB3aGVyZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cHNQZXJQcm9qZWN0S2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBncm91cHNQZXJQcm9qZWN0S2V5cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBDb25zdGFudHMuU3lzdGVtUHJvamVjdElSSSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW4gPSByZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdFtrZXldLmluZGV4T2YoQ29uc3RhbnRzLlN5c3RlbUFkbWluR3JvdXBJUkkpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS51c2VyLnBlcm1pc3Npb25zLmdyb3Vwc1BlclByb2plY3Rba2V5XS5pbmRleE9mKENvbnN0YW50cy5Qcm9qZWN0QWRtaW5Hcm91cElSSSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIHNlc3Npb24gaW5mb3JtYXRpb24gaW4gYnJvd3NlcidzIGxvY2Fsc3RvcmFnZVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldFRpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXNwb25zZS5ib2R5LnVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBqd3Q6IGp3dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHJlc3BvbnNlLmJvZHkudXNlci5sYW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW46IHN5c0FkbWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluOiBwcm9qZWN0QWRtaW5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZXNzaW9uJywgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzZXNzaW9uJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW50ZXJuIHNlc3Npb24gYW5kIGNoZWNrIGtub3JhIGFwaSBjcmVkZW50aWFscyBpZiBuZWNlc3NhcnkuXG4gICAgICogSWYgYSBqc29uIHdlYiB0b2tlbiBleGlzdHMsIGl0IGRvZXNuJ3QgbWVhbiwgdGhhdCB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZVNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIG1peCBvZiBjaGVja3Mgd2l0aCBzZXNzaW9uLnZhbGlkYXRpb24gYW5kIHRoaXMuYXV0aGVudGljYXRlXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykpO1xuXG4gICAgICAgIGNvbnN0IHRzTm93OiBudW1iZXIgPSB0aGlzLnNldFRpbWVzdGFtcCgpO1xuXG4gICAgICAgIGlmIChzZXNzaW9uKSB7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB2YWxpZDpcbiAgICAgICAgICAgIGlmIChzZXNzaW9uLmlkICsgdGhpcy5NQVhfU0VTU0lPTl9USU1FIDw9IHRzTm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGludGVybmFsIChrbm9yYS11aSkgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBhcGkgY3JlZGVudGFpbHMgYXJlIHN0aWxsIHZhbGlkXG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgY2hlY2sga25vcmEgYXBpIGNyZWRlbnRpYWxzJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmNoZWNrQ3JlZGVudGlhbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPENyZWRlbnRpYWxzUmVzcG9uc2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2tub3JhIGFwaSBjcmVkZW50aWFscycsIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgand0IGluIEBrbm9yYS9hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlc3Npb24uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uaWQgPSB0c05vdztcblxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nlc3Npb24nLCBKU09OLnN0cmluZ2lmeShzZXNzaW9uKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdrbm9yYSBhcGkgY3JlZGVudGlhbHMgYXJlIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCBhbnltb3JlIVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignc2Vzc2lvbi5zZXJ2aWNlIC0tIHZhbGlkYXRlU2Vzc2lvbiAtLSBhdXRoZW50aWNhdGU6IHRoZSBzZXNzaW9uIGV4cGlyZWQgb24gQVBJIHNpZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95U2Vzc2lvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ2tub3JhIGFwaSBjcmVkZW50aWFscyBhcmUgbm90IHZhbGlkOyByZXR1cm4nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcm5hbCAoa25vcmEtdWkpIHNlc3Npb24gaXMgc3RpbGwgdmFsaWRcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXNzaW9uIGlzIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIHNlc3Npb24gZm91bmQ7IHVwZGF0ZSBrbm9yYSBhcGkgY29ubmVjdGlvbiB3aXRoIGVtcHR5IGp3dFxuICAgICAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgcmV0dXJuJywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gand0XG4gICAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAgICovXG4gICAgdXBkYXRlU2Vzc2lvbihqd3Q6IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoand0ICYmIHVzZXJuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oand0LCB1c2VybmFtZSwgJ3VzZXJuYW1lJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgc2Vzc2lvbiBieSByZW1vdmluZyB0aGUgc2Vzc2lvbiBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgICAgKlxuICAgICAqL1xuICAgIGRlc3Ryb3lTZXNzaW9uKCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUga25vcmEtYXBpLWNvbmZpZyBhbmQga25vcmEtYXBpLWNvbm5lY3Rpb24gb2YgQGtub3JhL2FwaVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBqd3Q/XG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua25vcmFBcGlDb25maWcuanNvbldlYlRva2VuID0gKGp3dCA/IGp3dCA6ICcnKTtcbiAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24gPSBuZXcgS25vcmFBcGlDb25uZWN0aW9uKHRoaXMua25vcmFBcGlDb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSB0aW1lc3RhbXAgaW4gYSBudW1iZXJcbiAgICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFRpbWVzdGFtcCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKG1vbWVudCgpLmFkZCgwLCAnc2Vjb25kJykpLnZhbHVlT2YoKTtcbiAgICB9XG5cblxufVxuIl19