UNPKG

@knora/core

Version:
165 lines 21.8 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"; const moment = momentImported; let SessionService = class SessionService { constructor(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 */ setSession(jwt, identifier, identifierType) { let session; this.updateKnoraApiConnection(jwt); // get user information this.knoraApiConnection.admin.usersEndpoint.getUser(identifierType, identifier).subscribe((response) => { let sysAdmin = false; const projectAdmin = []; // get permission inforamation: a) is user sysadmin? b) get list of project iris where user is project admin const groupsPerProjectKeys = Object.keys(response.body.user.permissions.groupsPerProject); for (const key of groupsPerProjectKeys) { 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); } } // 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)); }, (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 */ validateSession() { // mix of checks with session.validation and this.authenticate const session = JSON.parse(localStorage.getItem('session')); const 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((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; }, (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 */ updateSession(jwt, username) { if (jwt && username) { this.setSession(jwt, username, 'username'); return true; } else { return false; } } /** * Destroy session by removing the session from local storage * */ destroySession() { localStorage.removeItem('session'); } /** * Update the knora-api-config and knora-api-connection of @knora/api * * @param {string} jwt? */ updateKnoraApiConnection(jwt) { this.knoraApiConfig.jsonWebToken = (jwt ? jwt : ''); this.knoraApiConnection = new KnoraApiConnection(this.knoraApiConfig); } /** * Convert a timestamp in a number * @returns number */ setTimestamp() { return (moment().add(0, 'second')).valueOf(); } }; SessionService.ctorParameters = () => [ { 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); export { SessionService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL2NvcmUvIiwic291cmNlcyI6WyJsaWIvc2Vzc2lvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pKLE9BQU8sS0FBSyxjQUFjLE1BQU0sUUFBUSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBK0I3RSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFLOUIsSUFBYSxjQUFjLEdBQTNCLE1BQWEsY0FBYztJQVV2QixZQUM2QyxrQkFBc0MsRUFDMUMsY0FBOEI7UUFEMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUMxQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFWdkU7Ozs7VUFJRTtRQUNPLHFCQUFnQixHQUFXLFFBQVEsQ0FBQyxDQUFDLDJCQUEyQjtJQU1yRSxDQUFDO0lBSUw7Ozs7OztTQU1LO0lBQ0wsVUFBVSxDQUFDLEdBQVcsRUFBRSxVQUFrQixFQUFFLGNBQW9DO1FBRTVFLElBQUksT0FBZ0IsQ0FBQztRQUVyQixJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbkMsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUNyRixDQUFDLFFBQXVDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLFFBQVEsR0FBWSxLQUFLLENBQUM7WUFDOUIsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1lBRWxDLDRHQUE0RztZQUM1RyxNQUFNLG9CQUFvQixHQUFhLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFcEcsS0FBSyxNQUFNLEdBQUcsSUFBSSxvQkFBb0IsRUFBRTtnQkFDcEMsSUFBSSxHQUFHLEtBQUssU0FBUyxDQUFDLGdCQUFnQixFQUFFO29CQUNwQyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDL0c7Z0JBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNuRyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMxQjthQUNKO1lBRUQsc0RBQXNEO1lBQ3RELE9BQU8sR0FBRztnQkFDTixFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdkIsSUFBSSxFQUFFO29CQUNGLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO29CQUNqQyxHQUFHLEVBQUUsR0FBRztvQkFDUixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDN0IsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFlBQVksRUFBRSxZQUFZO2lCQUM3QjthQUNKLENBQUM7WUFDRixzQkFBc0I7WUFDdEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsRUFDRCxDQUFDLEtBQXVCLEVBQUUsRUFBRTtZQUN4QixZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlO1FBQ1gsOERBQThEO1FBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRTVELE1BQU0sS0FBSyxHQUFXLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUxQyxJQUFJLE9BQU8sRUFBRTtZQUVULElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWhELHVDQUF1QztZQUN2QyxJQUFJLE9BQU8sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEtBQUssRUFBRTtnQkFDN0MsOENBQThDO2dCQUM5QywrQ0FBK0M7Z0JBRS9DLHNFQUFzRTtnQkFFdEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQ3hELENBQUMsUUFBOEMsRUFBRSxFQUFFO29CQUMvQyw0Q0FBNEM7b0JBQzVDLGtEQUFrRDtvQkFFbEQsZ0NBQWdDO29CQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFFaEQsd0JBQXdCO29CQUN4QixPQUFPLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztvQkFFbkIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUV6RCxnRUFBZ0U7b0JBQ2hFLE9BQU8sSUFBSSxDQUFDO2dCQUNoQixDQUFDLEVBQ0QsQ0FBQyxLQUF1QixFQUFFLEVBQUU7b0JBQ3hCLHVDQUF1QztvQkFDdkMsd0dBQXdHO29CQUV4RyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBRXRCLHNFQUFzRTtvQkFDdEUsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUMsQ0FDSixDQUFDO2FBRUw7aUJBQU07Z0JBQ0gsaURBQWlEO2dCQUVqRCxpREFBaUQ7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjthQUFNO1lBQ0gsK0RBQStEO1lBQy9ELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBRWhDLHVEQUF1RDtZQUN2RCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsR0FBVyxFQUFFLFFBQWdCO1FBQ3ZDLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNWLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3QkFBd0IsQ0FBQyxHQUFZO1FBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWTtRQUNoQixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pELENBQUM7Q0FHSixDQUFBOztZQXZLb0Usa0JBQWtCLHVCQUE5RSxNQUFNLFNBQUMsdUJBQXVCO1lBQ3NCLGNBQWMsdUJBQWxFLE1BQU0sU0FBQyxtQkFBbUI7OztBQVp0QixjQUFjO0lBSDFCLFVBQVUsQ0FBQztRQUNSLFVBQVUsRUFBRSxNQUFNO0tBQ3JCLENBQUM7SUFZTyxtQkFBQSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtJQUMvQixtQkFBQSxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQTs2Q0FEaUMsa0JBQWtCO1FBQzFCLGNBQWM7R0FaOUQsY0FBYyxDQWtMMUI7U0FsTFksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VEYXRhLCBBcGlSZXNwb25zZUVycm9yLCBDcmVkZW50aWFsc1Jlc3BvbnNlLCBLbm9yYUFwaUNvbmZpZywgS25vcmFBcGlDb25uZWN0aW9uLCBVc2VyUmVzcG9uc2UsIENvbnN0YW50cyB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgS25vcmFBcGlDb25maWdUb2tlbiwgS25vcmFBcGlDb25uZWN0aW9uVG9rZW4gfSBmcm9tICcuL2NvcmUubW9kdWxlJztcbmltcG9ydCB7IEtub3JhQ29uc3RhbnRzIH0gZnJvbSAnLi9kZWNsYXJhdGlvbnMnO1xuXG4vKipcbiAqIEN1cnJlbnRseSBsb2dnZWQtaW4gdXNlciBpbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1cnJlbnRVc2VyIHtcbiAgICAvLyB1c2VybmFtZVxuICAgIG5hbWU6IHN0cmluZztcblxuICAgIC8vIGpzb24gd2ViIHRva2VuXG4gICAgand0OiBzdHJpbmc7XG5cbiAgICAvLyBkZWZhdWx0IGxhbmd1YWdlIGZvciB1aVxuICAgIGxhbmc6IHN0cmluZztcblxuICAgIC8vIGlzIHN5c3RlbSBhZG1pbj9cbiAgICBzeXNBZG1pbjogYm9vbGVhbjtcblxuICAgIC8vIGxpc3Qgb2YgcHJvamVjdCBzaG9ydGNvZGVzIHdoZXJlIHRoZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICBwcm9qZWN0QWRtaW46IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFNlc3Npb24gd2l0aCBpZCAoPSBsb2dpbiB0aW1lc3RhbXApIGFuZCBpbmZvcmFtdGlvbiBhYm91dCBsb2dnZWQtaW4gdXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24ge1xuICAgIGlkOiBudW1iZXI7XG4gICAgdXNlcjogQ3VycmVudFVzZXI7XG59XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNlc3Npb25TZXJ2aWNlIHtcblxuICAgIC8qKlxuICAgICogbWF4IHNlc3Npb24gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAqIGRlZmF1bHQgdmFsdWUgKDI0aCk6IDg2NDAwMDAwXG4gICAgKlxuICAgICovXG4gICAgcmVhZG9ubHkgTUFYX1NFU1NJT05fVElNRTogbnVtYmVyID0gODY0MDAwMDA7IC8vIDFkID0gMjQgKiA2MCAqIDYwICogMTAwMFxuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbm5lY3Rpb25Ub2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbm5lY3Rpb246IEtub3JhQXBpQ29ubmVjdGlvbixcbiAgICAgICAgQEluamVjdChLbm9yYUFwaUNvbmZpZ1Rva2VuKSBwcml2YXRlIGtub3JhQXBpQ29uZmlnOiBLbm9yYUFwaUNvbmZpZ1xuICAgICkgeyB9XG5cblxuXG4gICAgLyoqXG4gICAgICAgKiBzZXQgdGhlIHNlc3Npb24gYnkgdXNpbmcgdGhlIGpzb24gd2ViIHRva2VuIChqd3QpIGFuZCB0aGUgdXNlciBvYmplY3Q7XG4gICAgICAgKiBpdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGxvZ2luIHByb2Nlc3NcbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gand0XG4gICAgICAgKiBAcGFyYW0gdXNlcm5hbWVcbiAgICAgICAqL1xuICAgIHNldFNlc3Npb24oand0OiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZywgaWRlbnRpZmllclR5cGU6ICdlbWFpbCcgfCAndXNlcm5hbWUnKSB7XG5cbiAgICAgICAgbGV0IHNlc3Npb246IFNlc3Npb247XG5cbiAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0KTtcblxuICAgICAgICAvLyBnZXQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi5hZG1pbi51c2Vyc0VuZHBvaW50LmdldFVzZXIoaWRlbnRpZmllclR5cGUsIGlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPFVzZXJSZXNwb25zZT4pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgc3lzQWRtaW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0QWRtaW46IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgcGVybWlzc2lvbiBpbmZvcmFtYXRpb246IGEpIGlzIHVzZXIgc3lzYWRtaW4/IGIpIGdldCBsaXN0IG9mIHByb2plY3QgaXJpcyB3aGVyZSB1c2VyIGlzIHByb2plY3QgYWRtaW5cbiAgICAgICAgICAgICAgICBjb25zdCBncm91cHNQZXJQcm9qZWN0S2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyhyZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBncm91cHNQZXJQcm9qZWN0S2V5cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBDb25zdGFudHMuU3lzdGVtUHJvamVjdElSSSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW4gPSByZXNwb25zZS5ib2R5LnVzZXIucGVybWlzc2lvbnMuZ3JvdXBzUGVyUHJvamVjdFtrZXldLmluZGV4T2YoQ29uc3RhbnRzLlN5c3RlbUFkbWluR3JvdXBJUkkpID4gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuYm9keS51c2VyLnBlcm1pc3Npb25zLmdyb3Vwc1BlclByb2plY3Rba2V5XS5pbmRleE9mKENvbnN0YW50cy5Qcm9qZWN0QWRtaW5Hcm91cElSSSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHN0b3JlIHNlc3Npb24gaW5mb3JtYXRpb24gaW4gYnJvd3NlcidzIGxvY2Fsc3RvcmFnZVxuICAgICAgICAgICAgICAgIHNlc3Npb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldFRpbWVzdGFtcCgpLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXNwb25zZS5ib2R5LnVzZXIudXNlcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBqd3Q6IGp3dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHJlc3BvbnNlLmJvZHkudXNlci5sYW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3lzQWRtaW46IHN5c0FkbWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEFkbWluOiBwcm9qZWN0QWRtaW5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIGxvY2FsU3RvcmFnZVxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzZXNzaW9uJywgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzZXNzaW9uJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgaW50ZXJuIHNlc3Npb24gYW5kIGNoZWNrIGtub3JhIGFwaSBjcmVkZW50aWFscyBpZiBuZWNlc3NhcnkuXG4gICAgICogSWYgYSBqc29uIHdlYiB0b2tlbiBleGlzdHMsIGl0IGRvZXNuJ3QgbWVhbiwgdGhhdCB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICAgKi9cbiAgICB2YWxpZGF0ZVNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIG1peCBvZiBjaGVja3Mgd2l0aCBzZXNzaW9uLnZhbGlkYXRpb24gYW5kIHRoaXMuYXV0aGVudGljYXRlXG4gICAgICAgIGNvbnN0IHNlc3Npb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykpO1xuXG4gICAgICAgIGNvbnN0IHRzTm93OiBudW1iZXIgPSB0aGlzLnNldFRpbWVzdGFtcCgpO1xuXG4gICAgICAgIGlmIChzZXNzaW9uKSB7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgc2Vzc2lvbiBpcyBzdGlsbCB2YWxpZDpcbiAgICAgICAgICAgIGlmIChzZXNzaW9uLmlkICsgdGhpcy5NQVhfU0VTU0lPTl9USU1FIDw9IHRzTm93KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGludGVybmFsIChrbm9yYS11aSkgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBhcGkgY3JlZGVudGFpbHMgYXJlIHN0aWxsIHZhbGlkXG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgY2hlY2sga25vcmEgYXBpIGNyZWRlbnRpYWxzJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmNoZWNrQ3JlZGVudGlhbHMoKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPENyZWRlbnRpYWxzUmVzcG9uc2U+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUga25vcmEgYXBpIGNyZWRlbnRpYWxzIGFyZSBzdGlsbCB2YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2tub3JhIGFwaSBjcmVkZW50aWFscycsIHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCB0aGUgand0IGluIEBrbm9yYS9hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlS25vcmFBcGlDb25uZWN0aW9uKHNlc3Npb24udXNlci5qd3QpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHNlc3Npb24uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uaWQgPSB0c05vdztcblxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Nlc3Npb24nLCBKU09OLnN0cmluZ2lmeShzZXNzaW9uKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdrbm9yYSBhcGkgY3JlZGVudGlhbHMgYXJlIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCBhbnltb3JlIVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcignc2Vzc2lvbi5zZXJ2aWNlIC0tIHZhbGlkYXRlU2Vzc2lvbiAtLSBhdXRoZW50aWNhdGU6IHRoZSBzZXNzaW9uIGV4cGlyZWQgb24gQVBJIHNpZGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95U2Vzc2lvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ2tub3JhIGFwaSBjcmVkZW50aWFscyBhcmUgbm90IHZhbGlkOyByZXR1cm4nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcm5hbCAoa25vcmEtdWkpIHNlc3Npb24gaXMgc3RpbGwgdmFsaWRcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXNzaW9uIGlzIHZhbGlkOyByZXR1cm4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vIHNlc3Npb24gZm91bmQ7IHVwZGF0ZSBrbm9yYSBhcGkgY29ubmVjdGlvbiB3aXRoIGVtcHR5IGp3dFxuICAgICAgICAgICAgdGhpcy51cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdzZXNzaW9uIGlzIG5vdCB2YWxpZDsgcmV0dXJuJywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdXBkYXRlIHRoZSBzZXNzaW9uIHN0b3JhZ2VcbiAgICAgKiBAcGFyYW0gand0XG4gICAgICogQHBhcmFtIHVzZXJuYW1lXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAgICovXG4gICAgdXBkYXRlU2Vzc2lvbihqd3Q6IHN0cmluZywgdXNlcm5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoand0ICYmIHVzZXJuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oand0LCB1c2VybmFtZSwgJ3VzZXJuYW1lJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgc2Vzc2lvbiBieSByZW1vdmluZyB0aGUgc2Vzc2lvbiBmcm9tIGxvY2FsIHN0b3JhZ2VcbiAgICAgKlxuICAgICAqL1xuICAgIGRlc3Ryb3lTZXNzaW9uKCkge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUga25vcmEtYXBpLWNvbmZpZyBhbmQga25vcmEtYXBpLWNvbm5lY3Rpb24gb2YgQGtub3JhL2FwaVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBqd3Q/XG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVLbm9yYUFwaUNvbm5lY3Rpb24oand0Pzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua25vcmFBcGlDb25maWcuanNvbldlYlRva2VuID0gKGp3dCA/IGp3dCA6ICcnKTtcbiAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24gPSBuZXcgS25vcmFBcGlDb25uZWN0aW9uKHRoaXMua25vcmFBcGlDb25maWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYSB0aW1lc3RhbXAgaW4gYSBudW1iZXJcbiAgICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFRpbWVzdGFtcCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKG1vbWVudCgpLmFkZCgwLCAnc2Vjb25kJykpLnZhbHVlT2YoKTtcbiAgICB9XG5cblxufVxuIl19