@universis/common
Version:
Universis - common directives and services
115 lines • 15.2 kB
JavaScript
import { Inject, Injectable, InjectionToken } from '@angular/core';
import { Router } from '@angular/router';
import { UserService } from '../services/user.service';
import { Observable } from 'rxjs';
import { ErrorService } from '../../error/error.service';
import { ConfigurationService } from '../../shared/services/configuration.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "../../error/error.service";
import * as i3 from "../../shared/services/configuration.service";
import * as i4 from "../services/user.service";
export let APP_LOCATIONS = new InjectionToken('app.locations');
export const DEFAULT_APP_LOCATIONS = [{
privilege: 'Location',
target: {
url: '^/auth/'
},
mask: 1
},
{
privilege: 'Location',
target: {
url: '^/error'
},
mask: 1
}
];
export class AuthGuard {
constructor(_router, _locations, _errorService, _configurationService, _userService) {
this._router = _router;
this._locations = _locations;
this._errorService = _errorService;
this._configurationService = _configurationService;
this._userService = _userService;
// merge app locations, if any
if (this._configurationService.settings && this._configurationService.settings.auth) {
// get extra locations
const appLocations = this._configurationService.settings.auth.locations;
if (Array.isArray(appLocations)) {
// get APP_LOCATIONS
if (this._locations) {
this._locations.unshift.apply(this._locations, appLocations);
}
}
}
this._locations.forEach((x) => {
if (typeof x.target.pattern === 'undefined' || x.target.pattern === null) {
x.target.pattern = new RegExp(x.target.url, 'i');
}
});
}
canActivateLocation(path, user) {
let groups = [];
if (user && user.groups) {
groups = user.groups.map((x) => {
return x.name;
});
}
return this._locations.find((x) => {
return x.target?.pattern?.test(path)
&& (typeof x.account === 'undefined' || groups.indexOf(x.account.name) >= 0)
&& (x.mask === 0 || (typeof x.mask === 'number' && (x.mask & 1) === 1))
&& user;
});
}
canActivate(route, state) {
return this._canActivate(state);
}
canActivateChild(childRoute, state) {
return this._canActivate(state);
}
_canActivate(state) {
return new Observable(resolve => {
this._userService.getUser().then((res) => {
const location = this.canActivateLocation(state.url, res);
if (location && (typeof location.account === 'undefined')) {
return resolve.next(true);
}
if (res) {
if (location && typeof location.mask === 'number' && (location.mask & 1) === 1) {
return resolve.next(true);
}
else {
if (location && location.redirectTo) {
void this._router.navigate([location.redirectTo]);
return resolve.next(false);
}
// noinspection JSIgnoredPromiseFromCall
this._router.navigate(['/error/403.1'], {
queryParams: {
action: 'Error.LoginAsDifferentUser',
continue: '/auth/loginAs'
}
});
return resolve.next(false);
}
}
// noinspection JSIgnoredPromiseFromCall
this._router.navigate(['/auth/login'], { queryParams: {
continue: state.url
} });
return resolve.next(false);
});
});
}
}
AuthGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthGuard, deps: [{ token: i1.Router }, { token: APP_LOCATIONS }, { token: i2.ErrorService }, { token: i3.ConfigurationService }, { token: i4.UserService }], target: i0.ɵɵFactoryTarget.Injectable });
AuthGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthGuard });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AuthGuard, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.Router }, { type: Array, decorators: [{
type: Inject,
args: [APP_LOCATIONS]
}] }, { type: i2.ErrorService }, { type: i3.ConfigurationService }, { type: i4.UserService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hdXRoL2d1YXJkcy9hdXRoLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQXdELE1BQU0sRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUNuSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7Ozs7OztBQUdqRixNQUFNLENBQUMsSUFBSSxhQUFhLEdBQUcsSUFBSSxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQztRQUNsQyxTQUFTLEVBQUUsVUFBVTtRQUNyQixNQUFNLEVBQUU7WUFDSixHQUFHLEVBQUUsU0FBUztTQUNqQjtRQUNELElBQUksRUFBRSxDQUFDO0tBQ1I7SUFDRDtRQUNFLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLE1BQU0sRUFBRTtZQUNKLEdBQUcsRUFBRSxTQUFTO1NBQ2pCO1FBQ0QsSUFBSSxFQUFFLENBQUM7S0FDUjtDQUNGLENBQUM7QUFHRixNQUFNLE9BQU8sU0FBUztJQUVwQixZQUFvQixPQUFlLEVBQ0YsVUFBcUMsRUFDNUQsYUFBMkIsRUFDM0IscUJBQTJDLEVBQzNDLFlBQXlCO1FBSmYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNGLGVBQVUsR0FBVixVQUFVLENBQTJCO1FBQzVELGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFD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ckIsVUFBVTs7MEJBSU4sTUFBTTsyQkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQsIFJvdXRlciwgUm91dGVyU3RhdGVTbmFwc2hvdH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdXNlci5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uL2Vycm9yL2Vycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHtDb25maWd1cmF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQge0xvY2F0aW9uUGVybWlzc2lvbn0gZnJvbSAnLi9hdXRoLmd1YXJkLmludGVyZmFjZXMnO1xuXG5leHBvcnQgbGV0IEFQUF9MT0NBVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2FwcC5sb2NhdGlvbnMnKTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVBQX0xPQ0FUSU9OUyA9IFt7XG4gICAgcHJpdmlsZWdlOiAnTG9jYXRpb24nLFxuICAgIHRhcmdldDoge1xuICAgICAgICB1cmw6ICdeL2F1dGgvJ1xuICAgIH0sXG4gICAgbWFzazogMVxuICB9LFxuICB7XG4gICAgcHJpdmlsZWdlOiAnTG9jYXRpb24nLFxuICAgIHRhcmdldDoge1xuICAgICAgICB1cmw6ICdeL2Vycm9yJ1xuICAgIH0sXG4gICAgbWFzazogMVxuICB9XG5dO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aEd1YXJkIGltcGxlbWVudHMgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLFxuICAgIEBJbmplY3QoQVBQX0xPQ0FUSU9OUykgcHJpdmF0ZSBfbG9jYXRpb25zOiBBcnJheTxMb2NhdGlvblBlcm1pc3Npb24+LFxuICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UpIHtcblxuICAgIC8vIG1lcmdlIGFwcCBsb2NhdGlvbnMsIGlmIGFueVxuICAgIGlmICh0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5zZXR0aW5ncyAmJiB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5zZXR0aW5ncy5hdXRoKSB7XG4gICAgICAvLyBnZXQgZXh0cmEgbG9jYXRpb25zXG4gICAgICBjb25zdCBhcHBMb2NhdGlvbnMgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5zZXR0aW5ncy5hdXRoLmxvY2F0aW9ucztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFwcExvY2F0aW9ucykpIHtcbiAgICAgICAgLy8gZ2V0IEFQUF9MT0NBVElPTlNcbiAgICAgICAgaWYgKHRoaXMuX2xvY2F0aW9ucykge1xuICAgICAgICAgIHRoaXMuX2xvY2F0aW9ucy51bnNoaWZ0LmFwcGx5KHRoaXMuX2xvY2F0aW9ucywgYXBwTG9jYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9sb2NhdGlvbnMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB4LnRhcmdldC5wYXR0ZXJuID09PSAndW5kZWZpbmVkJyB8fCB4LnRhcmdldC5wYXR0ZXJuID09PSBudWxsKSB7XG4gICAgICAgIHgudGFyZ2V0LnBhdHRlcm4gPSBuZXcgUmVnRXhwKHgudGFyZ2V0LnVybCwgJ2knKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5BY3RpdmF0ZUxvY2F0aW9uKHBhdGg6IHN0cmluZywgdXNlcjogYW55KTogTG9jYXRpb25QZXJtaXNzaW9uIHwgdW5kZWZpbmVkIHtcblxuICAgIGxldCBncm91cHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHVzZXIgJiYgdXNlci5ncm91cHMpIHtcbiAgICAgIGdyb3VwcyA9IHVzZXIuZ3JvdXBzLm1hcCgoeCkgPT4ge1xuICAgICAgICByZXR1cm4geC5uYW1lO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2NhdGlvbnMuZmluZCgoeCkgPT4ge1xuICAgICAgcmV0dXJuIHgudGFyZ2V0Py5wYXR0ZXJuPy50ZXN0KHBhdGgpXG4gICAgICAgICYmICh0eXBlb2YgeC5hY2NvdW50ID09PSAndW5kZWZpbmVkJyB8fCBncm91cHMuaW5kZXhPZih4LmFjY291bnQubmFtZSkgPj0gMClcbiAgICAgICAgJiYgKHgubWFzayA9PT0gMCB8fCAodHlwZW9mIHgubWFzayA9PT0gJ251bWJlcicgJiYgKHgubWFzayAmIDEpID09PSAxKSlcbiAgICAgICAgJiYgdXNlcjtcbiAgICB9KTtcblxuICB9XG5cblxuICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbkFjdGl2YXRlKHN0YXRlKTtcbiAgfVxuXG4gIGNhbkFjdGl2YXRlQ2hpbGQoY2hpbGRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYW5BY3RpdmF0ZShzdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIF9jYW5BY3RpdmF0ZShzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4gfCBib29sZWFuIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl91c2VyU2VydmljZS5nZXRVc2VyKCkudGhlbigocmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5jYW5BY3RpdmF0ZUxvY2F0aW9uKHN0YXRlLnVybCwgcmVzKTtcbiAgICAgICAgaWYgKGxvY2F0aW9uICYmICh0eXBlb2YgbG9jYXRpb24uYWNjb3VudCA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUubmV4dCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgaWYgKGxvY2F0aW9uICYmIHR5cGVvZiBsb2NhdGlvbi5tYXNrID09PSAnbnVtYmVyJyAmJiAobG9jYXRpb24ubWFzayAmIDEpID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24gJiYgbG9jYXRpb24ucmVkaXJlY3RUbykge1xuICAgICAgICAgICAgICB2b2lkIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbbG9jYXRpb24ucmVkaXJlY3RUb10pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU0lnbm9yZWRQcm9taXNlRnJvbUNhbGxcbiAgICAgICAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvci80MDMuMSddLCB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnRXJyb3IuTG9naW5Bc0RpZmZlcmVudFVzZXInLFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOiAnL2F1dGgvbG9naW5BcydcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTSWdub3JlZFByb21pc2VGcm9tQ2FsbFxuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycvYXV0aC9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICBjb250aW51ZTogc3RhdGUudXJsXG4gICAgICAgICAgfX0pO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZS5uZXh0KGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=