@alauda-fe/common
Version:
Alauda frontend team common codes.
108 lines • 13 kB
JavaScript
import { Injectable } from '@angular/core';
import { shareReplay, Subject, takeUntil, tap } from 'rxjs';
import { K8sResourceAction, parseWorkspace, skipError, SilentlyNavigateService, } from '../core/public-api';
import { NO_PERMISSION } from './constants';
import { K8sPermissionService } from './k8s-permission.service';
import * as i0 from "@angular/core";
import * as i1 from "./k8s-permission.service";
import * as i2 from "../core/public-api";
const PROJECTS_DEF = {
type: {
apiGroup: 'auth.alauda.io',
type: 'projects',
},
};
const NAMESPACES_DEF = {
type: {
type: 'namespaces',
},
advanced: true,
};
/**
* @see https://confluence.alauda.cn/pages/viewpage.action?pageId=115520649
*/
export class PermissionGuardService {
constructor(k8sPermission, silentlyNavigate) {
this.k8sPermission = k8sPermission;
this.silentlyNavigate = silentlyNavigate;
this.destroy$$ = new Subject();
this.cache = new WeakMap();
}
canActivate(route, state) {
if (this.cache.has(state)) {
return this.cache.get(state);
}
const params = this.getParams(route, route.data.childFirst);
let permissionParams;
const validWorkspace = parseWorkspace(params.workspace);
if (validWorkspace) {
permissionParams = {
...NAMESPACES_DEF,
...validWorkspace,
};
}
else {
// params.workspace acts on something like gitops application
const project = params.project || params.workspace?.split('~')?.[0];
if (project && project !== '~all') {
const { cluster, namespace } = params;
permissionParams =
cluster && namespace
? {
...NAMESPACES_DEF,
project,
cluster,
namespace,
}
: { ...PROJECTS_DEF, name: project };
}
}
if (permissionParams) {
const allowed$ = this.k8sPermission
.isAllowed({
action: K8sResourceAction.GET,
...permissionParams,
})
.pipe(skipError(false), tap(allowed => {
if (!allowed) {
this.silentlyNavigate.navigate(state.url, NO_PERMISSION);
}
}), takeUntil(this.destroy$$), shareReplay(1));
this.cache.set(state, allowed$);
return allowed$;
}
return true;
}
canActivateChild(route, state) {
return this.canActivate(route, state);
}
ngOnDestroy() {
this.destroy$$.next();
this.destroy$$.complete();
}
getParams(route, childFirst = false) {
let params = {
...route.queryParams,
...route.params,
};
if (!childFirst) {
return params;
}
if (route.children.length) {
route.children.forEach(child => {
params = {
...params,
...this.getParams(child, childFirst),
};
});
}
return params;
}
static { this.ɵfac = function PermissionGuardService_Factory(t) { return new (t || PermissionGuardService)(i0.ɵɵinject(i1.K8sPermissionService), i0.ɵɵinject(i2.SilentlyNavigateService)); }; }
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PermissionGuardService, factory: PermissionGuardService.ɵfac, providedIn: 'root' }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PermissionGuardService, [{
type: Injectable,
args: [{ providedIn: 'root' }]
}], () => [{ type: i1.K8sPermissionService }, { type: i2.SilentlyNavigateService }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9wZXJtaXNzaW9uL3Blcm1pc3Npb24uZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQU90RCxPQUFPLEVBQWMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3hFLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFFVCx1QkFBdUIsR0FDeEIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7O0FBR2hFLE1BQU0sWUFBWSxHQUFHO0lBQ25CLElBQUksRUFBRTtRQUNKLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsSUFBSSxFQUFFLFVBQVU7S0FDakI7Q0FDTyxDQUFDO0FBRVgsTUFBTSxjQUFjLEdBQUc7SUFDckIsSUFBSSxFQUFFO1FBQ0osSUFBSSxFQUFFLFlBQVk7S0FDbkI7SUFDRCxRQUFRLEVBQUUsSUFBSTtDQUNOLENBQUM7QUFFWDs7R0FFRztBQUVILE1BQU0sT0FBTyxzQkFBc0I7SUFVakMsWUFDbUIsYUFBbUMsRUFDbkMsZ0JBQXlDO1FBRHpDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBVDNDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRWhDLFVBQUssR0FBRyxJQUFJLE9BQU8sRUFHakMsQ0FBQztJQUtELENBQUM7SUFFSixXQUFXLENBQUMsS0FBNkIsRUFBRSxLQUEwQjtRQUNuRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxD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LEdBQUc7b0JBQ1AsR0FBRyxNQUFNO29CQUNULEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO2lCQUNyQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzt1RkE3R1Usc0JBQXNCO3VFQUF0QixzQkFBc0IsV0FBdEIsc0JBQXNCLG1CQURULE1BQU07O2lGQUNuQixzQkFBc0I7Y0FEbEMsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgQ2FuQWN0aXZhdGUsXG4gIENhbkFjdGl2YXRlQ2hpbGQsXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSwgU3ViamVjdCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSzhzUmVzb3VyY2VEZWZpbml0aW9uIH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7XG4gIFN0cmluZ01hcCxcbiAgSzhzUmVzb3VyY2VBY3Rpb24sXG4gIHBhcnNlV29ya3NwYWNlLFxuICBza2lwRXJyb3IsXG4gIFdvcmtzcGFjZSxcbiAgU2lsZW50bHlOYXZpZ2F0ZVNlcnZpY2UsXG59IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5cbmltcG9ydCB7IE5PX1BFUk1JU1NJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBLOHNQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4vazhzLXBlcm1pc3Npb24uc2VydmljZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uR3VhcmREYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IFBST0pFQ1RTX0RFRiA9IHtcbiAgdHlwZToge1xuICAgIGFwaUdyb3VwOiAnYXV0aC5hbGF1ZGEuaW8nLFxuICAgIHR5cGU6ICdwcm9qZWN0cycsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5jb25zdCBOQU1FU1BBQ0VTX0RFRiA9IHtcbiAgdHlwZToge1xuICAgIHR5cGU6ICduYW1lc3BhY2VzJyxcbiAgfSxcbiAgYWR2YW5jZWQ6IHRydWUsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9jb25mbHVlbmNlLmFsYXVkYS5jbi9wYWdlcy92aWV3cGFnZS5hY3Rpb24/cGFnZUlkPTExNTUyMDY0OVxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25HdWFyZFNlcnZpY2VcbiAgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgT25EZXN0cm95XG57XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFdlYWtNYXA8XG4gICAgUm91dGVyU3RhdGVTbmFwc2hvdCxcbiAgICBPYnNlcnZhYmxlPGJvb2xlYW4+XG4gID4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGs4c1Blcm1pc3Npb246IEs4c1Blcm1pc3Npb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2lsZW50bHlOYXZpZ2F0ZTogU2lsZW50bHlOYXZpZ2F0ZVNlcnZpY2UsXG4gICkge31cblxuICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoc3RhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoc3RhdGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtcyhcbiAgICAgIHJvdXRlLFxuICAgICAgKHJvdXRlLmRhdGEgYXMgUGVybWlzc2lvbkd1YXJkRGF0YSkuY2hpbGRGaXJzdCxcbiAgICApO1xuXG4gICAgbGV0IHBlcm1pc3Npb25QYXJhbXM6IChcbiAgICAgIHwgeyBuYW1lOiBzdHJpbmcgfVxuICAgICAgfCAoV29ya3NwYWNlICYge1xuICAgICAgICAgIGFkdmFuY2VkOiB0cnVlO1xuICAgICAgICB9KVxuICAgICkgJiB7XG4gICAgICB0eXBlOiBLOHNSZXNvdXJjZURlZmluaXRpb247XG4gICAgfTtcblxuICAgIGNvbnN0IHZhbGlkV29ya3NwYWNlID0gcGFyc2VXb3Jrc3BhY2UocGFyYW1zLndvcmtzcGFjZSk7XG5cbiAgICBpZiAodmFsaWRXb3Jrc3BhY2UpIHtcbiAgICAgIHBlcm1pc3Npb25QYXJhbXMgPSB7XG4gICAgICAgIC4uLk5BTUVTUEFDRVNfREVGLFxuICAgICAgICAuLi52YWxpZFdvcmtzcGFjZSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHBhcmFtcy53b3Jrc3BhY2UgYWN0cyBvbiBzb21ldGhpbmcgbGlrZSBnaXRvcHMgYXBwbGljYXRpb25cbiAgICAgIGNvbnN0IHByb2plY3QgPSBwYXJhbXMucHJvamVjdCB8fCBwYXJhbXMud29ya3NwYWNlPy5zcGxpdCgnficpPy5bMF07XG5cbiAgICAgIGlmIChwcm9qZWN0ICYmIHByb2plY3QgIT09ICd+YWxsJykge1xuICAgICAgICBjb25zdCB7IGNsdXN0ZXIsIG5hbWVzcGFjZSB9ID0gcGFyYW1zO1xuICAgICAgICBwZXJtaXNzaW9uUGFyYW1zID1cbiAgICAgICAgICBjbHVzdGVyICYmIG5hbWVzcGFjZVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4uTkFNRVNQQUNFU19ERUYsXG4gICAgICAgICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7IC4uLlBST0pFQ1RTX0RFRiwgbmFtZTogcHJvamVjdCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwZXJtaXNzaW9uUGFyYW1zKSB7XG4gICAgICBjb25zdCBhbGxvd2VkJCA9IHRoaXMuazhzUGVybWlzc2lvblxuICAgICAgICAuaXNBbGxvd2VkKHtcbiAgICAgICAgICBhY3Rpb246IEs4c1Jlc291cmNlQWN0aW9uLkdFVCxcbiAgICAgICAgICAuLi5wZXJtaXNzaW9uUGFyYW1zLFxuICAgICAgICB9KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBza2lwRXJyb3IoZmFsc2UpLFxuICAgICAgICAgIHRhcChhbGxvd2VkID0+IHtcbiAgICAgICAgICAgIGlmICghYWxsb3dlZCkge1xuICAgICAgICAgICAgICB0aGlzLnNpbGVudGx5TmF2aWdhdGUubmF2aWdhdGUoc3RhdGUudXJsLCBOT19QRVJNSVNTSU9OKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgICAgICAgIHNoYXJlUmVwbGF5KDEpLFxuICAgICAgICApO1xuXG4gICAgICB0aGlzLmNhY2hlLnNldChzdGF0ZSwgYWxsb3dlZCQpO1xuXG4gICAgICByZXR1cm4gYWxsb3dlZCQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjYW5BY3RpdmF0ZUNoaWxkKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkge1xuICAgIHJldHVybiB0aGlzLmNhbkFjdGl2YXRlKHJvdXRlLCBzdGF0ZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGdldFBhcmFtcyhyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgY2hpbGRGaXJzdCA9IGZhbHNlKTogU3RyaW5nTWFwIHtcbiAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgLi4ucm91dGUucXVlcnlQYXJhbXMsXG4gICAgICAuLi5yb3V0ZS5wYXJhbXMsXG4gICAgfTtcbiAgICBpZiAoIWNoaWxkRmlyc3QpIHtcbiAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuICAgIGlmIChyb3V0ZS5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHJvdXRlLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIC4uLnRoaXMuZ2V0UGFyYW1zKGNoaWxkLCBjaGlsZEZpcnN0KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG59XG4iXX0=