UNPKG

@knora/core

Version:
179 lines 23 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc2Vzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pKLE9BQU8sS0FBSyxjQUFjLE1BQU0sUUFBUSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBK0I3RSxJQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFLOUI7SUFVSSx3QkFDNkMsa0JBQXNDLEVBQzFDLGNBQThCO1FBRDFCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDMUMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBVnZFOzs7O1VBSUU7UUFDTyxxQkFBZ0IsR0FBVyxRQUFRLENBQUMsQ0FBQywyQkFBMkI7SUFNckUsQ0FBQztJQUlMOzs7Ozs7U0FNSztJQUNMLG1DQUFVLEdBQVYsVUFBVyxHQUFXLEVBQUUsVUFBa0IsRUFBRSxjQUFvQztRQUFoRixpQkE0Q0M7UUExQ0csSUFBSSxPQUFnQixDQUFDO1FBRXJCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuQyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQ3JGLFVBQUMsUUFBdUM7O1lBQ3BDLElBQUksUUFBUSxHQUFZLEtBQUssQ0FBQztZQUM5QixJQUFNLFlBQVksR0FBYSxFQUFFLENBQUM7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QUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqRCxDQUFDOztnQkFwS2dFLGtCQUFrQix1QkFBOUUsTUFBTSxTQUFDLHVCQUF1QjtnQkFDc0IsY0FBYyx1QkFBbEUsTUFBTSxTQUFDLG1CQUFtQjs7O0lBWnRCLGNBQWM7UUFIMUIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztRQVlPLG1CQUFBLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1FBQy9CLG1CQUFBLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO2lEQURpQyxrQkFBa0I7WUFDMUIsY0FBYztPQVo5RCxjQUFjLENBa0wxQjt5QkExTkQ7Q0EwTkMsQUFsTEQsSUFrTEM7U0FsTFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VEYXRhLCBBcGlSZXNwb25zZUVycm9yLCBDcmVkZW50aWFsc1Jlc3BvbnNlLCBLbm9yYUFwaUNvbmZpZywgS25vcmFBcGlDb25uZWN0aW9uLCBVc2VyUmVzcG9uc2UsIENvbnN0YW50cyB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgS25vcmFBcGlDb25maWdUb2tlbiwgS25vcmFBcGlDb25uZWN0aW9uVG9rZW4gfSBmcm9tICcuL2NvcmUubW9kdWxlJztcbmltcG9ydCB7IEtub3JhQ29uc3RhbnRzIH0gZnJvbSAnLi9kZWNsYXJhdGlvbnMnO1xuXG4vKipcbiAqIEN1cnJlbnRseSBsb2dnZWQtaW4gdXNlciBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRVc2VyIHtcbiAgICAvLyB1c2VybmFtZVxuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8vIGpzb24gd2ViIHRva2VuXG4gICAgand0OiBzdHJpbmc7XG5cbiAgICAvLyBkZWZhdWx0IGxhbmd1YWdlIGZvciB1aVxuICAgIGxhbmc6IHN0cmluZztcblxuICAgIC8vIGlzIHN5c3RlbSBhZG1pbj9cbiAgICBzeXNBZG1pbjogYm9vbGVhbjtcblxuICAgIC8vIGxpc3Qgb2YgcHJvamVjdCBzaG9ydGNvZGVzIHdoZXJlIHRoZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICBwcm9qZWN0QWRtaW46IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlc3Npb24gd2l0aCBpZCAoPSBsb2dpbiB0aW1lc3RhbXApIGFuZCBpbmZvcmFtdGlvbiBhYm91dCBsb2dnZWQtaW4gdXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcjogQ3VycmVudFVzZXI7XG59XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlc3Npb25TZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICogbWF4IHNlc3Npb24gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAqIGRlZmF1bHQgdmFsdWUgKDI0aCk6IDg2NDAwMDAwXG4gICAgKlxuICAgICovXG4gICAgcmVhZG9ubHkgTUFYX1NFU1NJT05fVElNRTogbnVtYmVyID0gODY0MDAwMDA7IC8vIDFkID0gMjQgKiA2MCAqIDYwICogMTAwMFxuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbm5lY3Rpb25Ub2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbm5lY3Rpb246IEtub3JhQXBpQ29ubmVjdGlvbixcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbmZpZ1Rva2VuKSBwcml2YXRlIGtub3JhQXBpQ29uZmlnOiBLbm9yYUFwaUNvbmZpZ1xuICAgICkgeyB9XG5cblxuXG4gICAgLyoqXG4gICAgICAgKiBzZXQgdGhlIHNlc3Npb24gYnkgdXNpbmcgdGhlIGpzb24gd2ViIHRva2VuIChqd3QpIGFuZCB0aGUgdXNlciBvYmplY3Q7XG4gICAgICAgKiBpdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGxvZ2luIHByb2Nlc3NcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gand0XG4gICAgICAgKiBAcGFyYW0gdXNlcm5hbWVcbiAgICAgICAqL1xuICAgIHNldFNlc3Npb24oand0OiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgaWRlbnRpZmllclR5cGU6ICdlbWFpbCcgfCAndXNlcm5hbWUnKSB7XG5cbiAgICAgICAgbGV0IHNlc3Npb246IFNlc3Npb247XG5cbiAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0KTtcblxuICAgICAgICAvLyBnZXQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi5hZG1pbi51c2Vyc0VuZHBvaW50LmdldFVzZXIoaWRlbnRpZmllclR5cGUsIGlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPFVzZXJSZXNwb25zZT4pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3lzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0QWRtaW46IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgcGVybWlzc2lvbiBpbmZvcmFtYXRpb246IGEpIGlzIHVzZXIgc3lzYWRtaW4/IGIpIGdldCBsaXN0IG9mIHByb2plY3QgaXJpcyB3aGVyZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cHNQZXJQcm9qZWN0S2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBncm91cHNQZXJQcm9qZWN0S2V5cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBDb25zdGFudHMuU3lzdGVtUHJvamVjdElSSSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW4gPSByZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdFtrZXldLmluZGV4T2YoQ29uc3RhbnRzLlN5c3RlbUFkbWluR3JvdXBJUkkpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS51c2VyLnBlcm1pc3Npb25zLmdyb3Vwc1BlclByb2plY3Rba2V5XS5pbmRleE9mKENvbnN0YW50cy5Qcm9qZWN0QWRtaW5Hcm91cElSSSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIHNlc3Npb24gaW5mb3JtYXRpb24gaW4gYnJvd3NlcidzIGxvY2Fsc3RvcmFnZVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldFRpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXNwb25zZS5ib2R5LnVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBqd3Q6IGp3dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHJlc3BvbnNlLmJvZHkudXNlci5sYW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW46IHN5c0FkbWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluOiBwcm9qZWN0QWRtaW5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZXNzaW9uJywgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzZXNzaW9uJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW50ZXJuIHNlc3Npb24gYW5kIGNoZWNrIGtub3JhIGFwaSBjcmVkZW50aWFscyBpZiBuZWNlc3NhcnkuXG4gICAgICogSWYgYSBqc29uIHdlYiB0b2tlbiBleGlzdHMsIGl0IGRvZXNuJ3QgbWVhbiwgdGhhdCB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZVNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIG1peCBvZiBjaGVja3Mgd2l0aCBzZXNzaW9uLnZhbGlkYXRpb24gYW5kIHRoaXMuYXV0aGVudGljYXRlXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykpO1xuXG4gICAgICAgIGNvbnN0IHRzTm93OiBudW1iZXIgPSB0aGlzLnNldFRpbWVzdGFtcCgpO1xuXG4gICAgICAgIGlmIChzZXNzaW9uKSB7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB2YWxpZDpcbiAgICAgICAgICAgIGlmIChzZXNzaW9uLmlkICsgdGhpcy5NQVhfU0VTU0lPTl9USU1FIDw9IHRzTm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGludGVybmFsIChrbm9yYS11aSkgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBhcGkgY3JlZGVudGFpbHMgYXJlIHN0aWxsIHZhbGlkXG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgY2hlY2sga25vcmEgYXBpIGNyZWRlbnRpYWxzJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmNoZWNrQ3JlZGVudGlhbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPENyZWRlbnRpYWxzUmVzcG9uc2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2tub3JhIGFwaSBjcmVkZW50aWFscycsIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgand0IGluIEBrbm9yYS9hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlc3Npb24uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uaWQgPSB0c05vdztcblxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nlc3Npb24nLCBKU09OLnN0cmluZ2lmeShzZXNzaW9uKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdrbm9yYSBhcGkgY3JlZGVudGlhbHMgYXJlIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCBhbnltb3JlIVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignc2Vzc2lvbi5zZXJ2aWNlIC0tIHZhbGlkYXRlU2Vzc2lvbiAtLSBhdXRoZW50aWNhdGU6IHRoZSBzZXNzaW9uIGV4cGlyZWQgb24gQVBJIHNpZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95U2Vzc2lvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ2tub3JhIGFwaSBjcmVkZW50aWFscyBhcmUgbm90IHZhbGlkOyByZXR1cm4nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcm5hbCAoa25vcmEtdWkpIHNlc3Npb24gaXMgc3RpbGwgdmFsaWRcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXNzaW9uIGlzIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIHNlc3Npb24gZm91bmQ7IHVwZGF0ZSBrbm9yYSBhcGkgY29ubmVjdGlvbiB3aXRoIGVtcHR5IGp3dFxuICAgICAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgcmV0dXJuJywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gand0XG4gICAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAgICovXG4gICAgdXBkYXRlU2Vzc2lvbihqd3Q6IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoand0ICYmIHVzZXJuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oand0LCB1c2VybmFtZSwgJ3VzZXJuYW1lJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgc2Vzc2lvbiBieSByZW1vdmluZyB0aGUgc2Vzc2lvbiBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgICAgKlxuICAgICAqL1xuICAgIGRlc3Ryb3lTZXNzaW9uKCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUga25vcmEtYXBpLWNvbmZpZyBhbmQga25vcmEtYXBpLWNvbm5lY3Rpb24gb2YgQGtub3JhL2FwaVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBqd3Q/XG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua25vcmFBcGlDb25maWcuanNvbldlYlRva2VuID0gKGp3dCA/IGp3dCA6ICcnKTtcbiAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24gPSBuZXcgS25vcmFBcGlDb25uZWN0aW9uKHRoaXMua25vcmFBcGlDb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSB0aW1lc3RhbXAgaW4gYSBudW1iZXJcbiAgICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFRpbWVzdGFtcCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKG1vbWVudCgpLmFkZCgwLCAnc2Vjb25kJykpLnZhbHVlT2YoKTtcbiAgICB9XG5cblxufVxuIl19