@esfaenza/access-control 11.2.9 → 11.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -71,7 +71,8 @@
71
71
  *
72
72
  * @ignore
73
73
  */
74
- AccessControlService.prototype.hasACExpression = function (expression) {
74
+ AccessControlService.prototype.hasACExpression = function (expression, absolute) {
75
+ if (absolute === void 0) { absolute = false; }
75
76
  if (!this.Initialized)
76
77
  console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
77
78
  if (!expression)
@@ -80,9 +81,11 @@
80
81
  console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
81
82
  return true;
82
83
  }
83
- if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP)
84
+ // Per le espressioni di visibilità "dirette" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche
85
+ // Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo "sono Jace Admin"
86
+ if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')
84
87
  expression = "(" + expression + ") " + this.ACC_DEF_COND_OP + " " + this.ACC_DEF_COND;
85
- //Espressione già valutata, non serve rivalutarla
88
+ // Espressione già valutata, non serve rivalutarla
86
89
  if (this.cache[expression])
87
90
  return this.cache[expression];
88
91
  var RolesPermissionsRegexp = /.:[^|&()]+/g;
@@ -104,7 +107,7 @@
104
107
  return ret;
105
108
  };
106
109
  /**
107
- * Utilizzato da hasACExpression
110
+ * Utilizzato da hasACExpression dentro eval
108
111
  *
109
112
  * @ignore
110
113
  */
@@ -116,7 +119,7 @@
116
119
  return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
117
120
  };
118
121
  /**
119
- * Utilizzato da hasACExpression
122
+ * Utilizzato da hasACExpression dentro eval
120
123
  *
121
124
  * @ignore
122
125
  */
@@ -128,7 +131,7 @@
128
131
  return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
129
132
  };
130
133
  /**
131
- * Utilizzato da hasACExpression
134
+ * Utilizzato da hasACExpression dentro eval
132
135
  *
133
136
  * @ignore
134
137
  */
@@ -145,8 +148,9 @@
145
148
  /**
146
149
  * Entry point che controlla un'espressione identificante un permesso, ad esempio "P:visualizzazione" controlla che l'utente collegato abbia un permesso che si chiama "visualizzazione"
147
150
  */
148
- AccessControlService.prototype.has = function (expr) {
149
- return this.hasACExpression(expr);
151
+ AccessControlService.prototype.has = function (expr, absolute) {
152
+ if (absolute === void 0) { absolute = false; }
153
+ return this.hasACExpression(expr, absolute);
150
154
  };
151
155
  return AccessControlService;
152
156
  }());
@@ -287,26 +291,25 @@
287
291
  this.templateRef = templateRef;
288
292
  this.viewContainer = viewContainer;
289
293
  this._ac = _ac;
290
- }
291
- Object.defineProperty(AccessControlDirective.prototype, "ac", {
292
294
  /**
293
- * Input autoreferenziale per la direttiva
295
+ * Espressione da processare scritta come {Chiave}:{Valore}
294
296
  *
295
- * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}
297
+ * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions.
296
298
  *
297
- * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions
299
+ * Nelle ultime versioni del template è anche presente di default la custom permission "X" che indica se l'applicaizone è Esterna o no
298
300
  */
299
- set: function (expression) {
300
- var allow = this._ac.has(expression);
301
- //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template
302
- if (allow)
303
- this.viewContainer.createEmbeddedView(this.templateRef);
304
- else
305
- this.viewContainer.clear();
306
- },
307
- enumerable: false,
308
- configurable: true
309
- });
301
+ this.ac = null;
302
+ /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */
303
+ this.acAbsolute = false;
304
+ }
305
+ AccessControlDirective.prototype.ngOnInit = function () {
306
+ var allow = this._ac.has(this.ac, this.acAbsolute);
307
+ //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template
308
+ if (allow)
309
+ this.viewContainer.createEmbeddedView(this.templateRef);
310
+ else
311
+ this.viewContainer.clear();
312
+ };
310
313
  return AccessControlDirective;
311
314
  }());
312
315
  AccessControlDirective.decorators = [
@@ -320,7 +323,8 @@
320
323
  { type: AccessControlService }
321
324
  ]; };
322
325
  AccessControlDirective.propDecorators = {
323
- ac: [{ type: core.Input }]
326
+ ac: [{ type: core.Input }],
327
+ acAbsolute: [{ type: core.Input }]
324
328
  };
325
329
 
326
330
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-access-control.umd.js","sources":["../../../projects/access-control/src/lib/tokens.ts","../../../projects/access-control/src/lib/access-control.service.ts","../../../projects/access-control/src/lib/AccessControlRouteGuard.ts","../../../projects/access-control/src/lib/access-control.directive.ts","../../../projects/access-control/src/lib/models/ComponentContext.ts","../../../projects/access-control/src/lib/context-aware.directive.ts","../../../projects/access-control/src/lib/access-control.module.ts","../../../projects/access-control/src/lib/models/AccessControlModuleConfig.ts","../../../projects/access-control/src/public-api.ts","../../../projects/access-control/src/esfaenza-access-control.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Token che racchiude il locale scelto per l'applicazione */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');\r\n\r\n/** Token che indica la condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND');\r\n\r\n/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND_OP: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND_OP');","// Angular\r\nimport { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { ACC_DEF_COND, ACC_DEF_COND_OP } from \"./tokens\";\r\n\r\n/**\r\n * Entrypoint di tutte le operazioni esposte dalla libreria access-control\r\n */\r\n@Injectable()\r\nexport class AccessControlService {\r\n\r\n /**\r\n * Indica se l'Identity è stata inizializzata\r\n */\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Indica se sono state effettuate inizializzazioni di Custom Permissions\r\n */\r\n public InitializedCustom: boolean = false;\r\n\r\n /** @ignore */\r\n private cache: {} = {};\r\n\r\n /** @ignore */\r\n private taggedItemsCache: { key: string, items: string[] }[] = [];\r\n\r\n /**\r\n * Identity associata a quest'istanza del Servizio Access Control, utile se si vuole avere accesso a Ruoli e Permessi direttamente da qui, per qualsivoglia motivo\r\n */\r\n public Identity: { Roles: string[], Permissions: string[] };\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(ACC_DEF_COND) private ACC_DEF_COND: string, @Optional() @Inject(ACC_DEF_COND_OP) private ACC_DEF_COND_OP: string,) { }\r\n\r\n /**\r\n * Inizializza l'Identity del servizio con il modello specificato\r\n * \r\n * @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi\r\n */\r\n public initializeIdentity(identity: { Roles: string[], Permissions: string[] }) {\r\n this.Identity = identity;\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Inizializza i permessi Custom del servizio con il modello specificato\r\n * \r\n * @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom\r\n */\r\n public initializeCustomPermissions(customPermissions: { key: string, items: string[] }[]) {\r\n for (let i = 0; i < customPermissions.length; i++) {\r\n if (customPermissions[i].key.length > 1) {\r\n console.error(\"[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.\");\r\n return;\r\n }\r\n }\r\n\r\n this.taggedItemsCache = customPermissions;\r\n this.InitializedCustom = true;\r\n }\r\n\r\n /**\r\n * Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity\r\n */\r\n public isLoggedIn() {\r\n return !!this.Identity;\r\n }\r\n\r\n /**\r\n * Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)\r\n * Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P\r\n * \r\n * @ignore\r\n */\r\n private hasACExpression(expression: string): boolean {\r\n if (!this.Initialized)\r\n console.error(\"Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service\");\r\n\r\n if (!expression)\r\n return true;\r\n\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n\r\n if(this.ACC_DEF_COND && this.ACC_DEF_COND_OP)\r\n expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;\r\n \r\n //Espressione già valutata, non serve rivalutarla\r\n if (this.cache[expression])\r\n return this.cache[expression];\r\n\r\n var RolesPermissionsRegexp = /.:[^|&()]+/g;\r\n\r\n var matches = expression.match(RolesPermissionsRegexp);\r\n \r\n if (!matches)\r\n throw \"Espressione Access Control non valida: \" + expression + \". Assicurarsi che sia scritta in modo corretto\";\r\n\r\n matches.forEach(t => {\r\n var splits = t.split(':');\r\n if (splits[0] == \"R\")\r\n expression = expression.replace(t.trim(), \"this.hasRole('\" + splits[1].trim() + \"')\");\r\n else if (splits[0] == \"P\")\r\n expression = expression.replace(t.trim(), \"this.hasPermission('\" + splits[1].trim() + \"')\");\r\n else\r\n expression = expression.replace(t.trim(), \"this.hasCustom('\" + splits[1].trim() + \"', '\" + splits[0].trim() + \"')\");\r\n });\r\n\r\n var ret = <boolean>eval(expression);\r\n // Cache valore\r\n this.cache[expression] = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasRole(role: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasPermission(permission: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasCustom(value: string, tag: string): boolean {\r\n var items = this.taggedItemsCache.find(t => t.key == tag)?.items;\r\n if (!items)\r\n return true;\r\n else if (items.length == 0)\r\n return false;\r\n else\r\n return !!items.find(t => t == value);\r\n }\r\n\r\n /**\r\n * Entry point che controlla un'espressione identificante un permesso, ad esempio \"P:visualizzazione\" controlla che l'utente collegato abbia un permesso che si chiama \"visualizzazione\"\r\n */\r\n public has(expr: string) {\r\n return this.hasACExpression(expr);\r\n }\r\n}","//Angular\r\nimport { ActivatedRouteSnapshot, CanActivateChild, RouterStateSnapshot } from \"@angular/router\";\r\nimport { Injectable, Optional, Inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n//Libs\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n//Models\r\nimport { ACC_LOCALE } from \"./tokens\";\r\nimport { AccessControlService } from './access-control.service';\r\n\r\n/**\r\n * Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe\r\n * che la ereditavalorizzare la variabile Routes con le route permesse dal modulo e il permesso per cui si vuole riservare l'accesso. Ad esempio:\r\n * \r\n * ```typescript\r\n * @Injectable()\r\n * export class HasAuthGuardComponent extends BaseRouterGuard {\r\n * constructor(acc: AccessControlService, router: Router, ms: MessageService, ts: BaseTokenService) {\r\n * super(ms, acc, router, ts);\r\n * this.Routes = [\r\n * { route: \"page_route\", permission: \"P:perm_one\" },\r\n * { route: \"*\", permission: \"R:role_one\" }\r\n * ]\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class AccessControlRouteGuard implements CanActivateChild {\r\n /**\r\n * @ignore\r\n */\r\n private lc: LocalizationService;\r\n\r\n /**\r\n * Route di login che serve per reindirizzare alla pagina di login in caso di fallimento del controllo sui Permessi\r\n * \r\n * @default\r\n */\r\n protected LoginRoute : string = \"login\";\r\n\r\n /**\r\n * Permette di specificare delle Route sempre consentite, anche a livello di \"Radice\". Ad esempio la Root \"test\" permetterà\r\n * l'accesso a tutte le route che anche solo iniziano per \"test\"\r\n */\r\n protected AlwaysAllowedRoots: string[] = [];\r\n \r\n /**\r\n * Lista di Route con la loro espressione di controllo per valutare i permessi\r\n */\r\n protected Routes: { route: any; permission: string; }[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(private msgService : MessageService, private ac: AccessControlService, private router: Router, @Optional() @Inject(ACC_LOCALE) LOCALE: string) {\r\n this.lc = new LocalizationService(LOCALE ?? 'it-IT');\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n canActivateChild(route: ActivatedRouteSnapshot, _: RouterStateSnapshot): Promise<boolean> {\r\n var url = route.url.join('/');\r\n //Se l'applicazione non è pronta e non sto navigando nelle pagine consentite\r\n if (!this.ac.Initialized && !this.AlwaysAllowedRoots.find(r => url.indexOf(r) != -1))\r\n return Promise.resolve(false);\r\n \r\n var routeMatched: boolean = false;\r\n for (let i = 0; i < this.Routes.length; i++) {\r\n let r = this.Routes[i];\r\n //Se faccio match con la route significa che ho navigato in una delle route conosciute, altrimenti avverto ma lascio andare\r\n if (url.indexOf(r.route) != -1) {\r\n routeMatched = true;\r\n return this.handleMatch(url, r);\r\n }\r\n }\r\n //Se non faccio nessun match ma ho una route wildcard (*) prendo quella e controllo su quella\r\n if (!routeMatched) {\r\n var wildcardRoute = this.Routes.find(r => r.route == \"*\");\r\n if (wildcardRoute)\r\n return this.handleMatch(url, wildcardRoute);\r\n else\r\n console.log(\"Navigaizone avvenuta su route sconosciuta: \" + url);\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private handleMatch(fromurl: string, r: any) {\r\n let identity = this.ac.Identity;\r\n\r\n if (this.ac.has(r.permission) ||\r\n (\r\n // Considero anche la possibilità di avere l'access control inizializzato ma che l'account scope non sia ancora presente\r\n // in questo caso suppongo sia un hard refresh e mi fido del fatto che l'utente possa entrarci\r\n // TODO: Fixare meglio concatenando una promise che va a prendere l'account scope se serve\r\n this.ac.Initialized &&\r\n (!identity.Roles || identity.Roles.length == 0) &&\r\n (!identity.Permissions || identity.Permissions.length == 0)\r\n ))\r\n return Promise.resolve(true);\r\n else {\r\n //Se sono nel sito originale (non ho aperto un newtab) blocco la navigazione\r\n //Se ho aperto una nuova tab invece rispedisco al login\r\n if (window.history.length > 2 && this.ac.isLoggedIn()) {\r\n this.msgService.simpleError(this.lc.loc(\"You don't have the required permissions to view this page. The navigation has been blocked\"));\r\n return Promise.resolve(false);\r\n }\r\n else {\r\n this.onRedirectInProgress();\r\n this.router.navigate([this.LoginRoute, { fromUrl: fromurl }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Callback che viene eseguito prima che la Guard reindirizzi al login\r\n */\r\n protected onRedirectInProgress() {\r\n }\r\n}","// Angular\r\nimport { Directive, Input, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\n\r\n/**\r\n * Direttiva che permette di gestire il controllo accessi su componenti HTML. \r\n * \r\n * Per gli esempi di utilizzo fare riferimento al README.\r\n */\r\n@Directive({\r\n selector: '[ac]',\r\n})\r\nexport class AccessControlDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef, private _ac: AccessControlService) { }\r\n\r\n /**\r\n * Input autoreferenziale per la direttiva\r\n * \r\n * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}\r\n * \r\n * Le {Chiave} disponibili sono di default \"R\" per i ruoli e \"P\" per i permessi. È possibile espanderle con le Custom Permissions\r\n */\r\n @Input() set ac(expression: string) {\r\n var allow = this._ac.has(expression);\r\n\r\n //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template\r\n\r\n if (allow) this.viewContainer.createEmbeddedView(this.templateRef);\r\n else this.viewContainer.clear();\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Token da iniettare per ogni singolo componente per cui si vuole disattivare/attivare massivamente degli input in maniera contestuale\r\n */\r\n@Injectable()\r\nexport class ComponentContext{\r\n /**\r\n * Nome del Contesto assegnato al Componente\r\n */\r\n name : string;\r\n}","// Angular\r\nimport { Directive, ElementRef, Optional, Inject } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\nimport { ACC_CUSTOMKEY } from \"./tokens\"\r\n\r\n// Classi\r\nimport { ComponentContext } from \"./models/ComponentContext\";\r\n\r\n/**\r\n * Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.\r\n * \r\n * Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext\r\n */\r\n@Directive({\r\n selector: '[contextAware]',\r\n})\r\nexport class ContextAwareDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(element: ElementRef, @Optional() private context: ComponentContext, private ac: AccessControlService, @Optional() @Inject(ACC_CUSTOMKEY) private ACC_CUSTOMKEY: string) {\r\n var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + \":\" + this.context.name,);\r\n\r\n if (!allow)\r\n element.nativeElement.setAttribute(\"enabled\", \"true\");\r\n }\r\n}","import { LocalizationModule } from '@esfaenza/localizations';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\n\r\nimport { ACC_LOCALE, ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP } from './tokens';\r\n\r\nimport { AccessControlModuleConfig } from './models/AccessControlModuleConfig';\r\nimport { AccessControlService } from './access-control.service';\r\nimport { AccessControlRouteGuard } from './AccessControlRouteGuard';\r\nimport { AccessControlDirective } from './access-control.directive';\r\nimport { ContextAwareDirective } from './context-aware.directive';\r\n\r\n@NgModule({\r\n imports: [LocalizationModule],\r\n declarations: [AccessControlDirective, ContextAwareDirective],\r\n exports:[AccessControlDirective, ContextAwareDirective]\r\n})\r\nexport class AccessControlModule {\r\n static forRoot(config?: AccessControlModuleConfig): ModuleWithProviders<AccessControlModule> {\r\n return {\r\n ngModule: AccessControlModule,\r\n providers: [\r\n AccessControlService,\r\n AccessControlRouteGuard,\r\n { provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },\r\n { provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },\r\n { provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },\r\n { provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'\r\n */\r\nexport class AccessControlModuleConfig {\r\n\r\n /**\r\n * locale dell'applicazione in forma standard, ad esempio \"it-IT\", \"en-US\", etc...\r\n * \r\n * Attualmente si supportano solo le lingue Italiano e Inglese\r\n */\r\n locale: string;\r\n\r\n /** Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno */\r\n customKey: string;\r\n\r\n /** Condizione di default da aggiungere a ogni condizione utente. Es: 'R:Jace Admin' */\r\n defaultCondition?: string;\r\n\r\n /** Relazione logica fra la condizione di default e la condizione utente. Es: '||'. Di default viene utilizzato l'OR logico */\r\n defaultConditionLogicalOperator?: string;\r\n}","/*\r\n * Public API Surface of access-control\r\n */\r\n\r\nexport * from './lib/access-control.module';\r\nexport * from './lib/access-control.service';\r\nexport * from './lib/access-control.directive'\r\nexport * from \"./lib/models/AccessControlModuleConfig\";\r\nexport * from \"./lib/AccessControlRouteGuard\";\r\nexport * from \"./lib/tokens\";\r\nexport * from \"./lib/models/ComponentContext\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {ContextAwareDirective as ɵa} from './lib/context-aware.directive';"],"names":["InjectionToken","Injectable","Optional","Inject","LocalizationService","MessageService","Router","Directive","TemplateRef","ViewContainerRef","Input","ElementRef","NgModule","LocalizationModule"],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-access-control.umd.js","sources":["../../../projects/access-control/src/lib/tokens.ts","../../../projects/access-control/src/lib/access-control.service.ts","../../../projects/access-control/src/lib/AccessControlRouteGuard.ts","../../../projects/access-control/src/lib/access-control.directive.ts","../../../projects/access-control/src/lib/models/ComponentContext.ts","../../../projects/access-control/src/lib/context-aware.directive.ts","../../../projects/access-control/src/lib/access-control.module.ts","../../../projects/access-control/src/lib/models/AccessControlModuleConfig.ts","../../../projects/access-control/src/public-api.ts","../../../projects/access-control/src/esfaenza-access-control.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Token che racchiude il locale scelto per l'applicazione */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');\r\n\r\n/** Token che indica la condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND');\r\n\r\n/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND_OP: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND_OP');","// Angular\r\nimport { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { ACC_DEF_COND, ACC_DEF_COND_OP } from \"./tokens\";\r\n\r\n/**\r\n * Entrypoint di tutte le operazioni esposte dalla libreria access-control\r\n */\r\n@Injectable()\r\nexport class AccessControlService {\r\n\r\n /**\r\n * Indica se l'Identity è stata inizializzata\r\n */\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Indica se sono state effettuate inizializzazioni di Custom Permissions\r\n */\r\n public InitializedCustom: boolean = false;\r\n\r\n /** @ignore */\r\n private cache: {} = {};\r\n\r\n /** @ignore */\r\n private taggedItemsCache: { key: string, items: string[] }[] = [];\r\n\r\n /**\r\n * Identity associata a quest'istanza del Servizio Access Control, utile se si vuole avere accesso a Ruoli e Permessi direttamente da qui, per qualsivoglia motivo\r\n */\r\n public Identity: { Roles: string[], Permissions: string[] };\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(ACC_DEF_COND) private ACC_DEF_COND: string, @Optional() @Inject(ACC_DEF_COND_OP) private ACC_DEF_COND_OP: string,) { }\r\n\r\n /**\r\n * Inizializza l'Identity del servizio con il modello specificato\r\n * \r\n * @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi\r\n */\r\n public initializeIdentity(identity: { Roles: string[], Permissions: string[] }) {\r\n this.Identity = identity;\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Inizializza i permessi Custom del servizio con il modello specificato\r\n * \r\n * @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom\r\n */\r\n public initializeCustomPermissions(customPermissions: { key: string, items: string[] }[]) {\r\n for (let i = 0; i < customPermissions.length; i++) {\r\n if (customPermissions[i].key.length > 1) {\r\n console.error(\"[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.\");\r\n return;\r\n }\r\n }\r\n\r\n this.taggedItemsCache = customPermissions;\r\n this.InitializedCustom = true;\r\n }\r\n\r\n /**\r\n * Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity\r\n */\r\n public isLoggedIn() {\r\n return !!this.Identity;\r\n }\r\n\r\n /**\r\n * Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)\r\n * Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P\r\n * \r\n * @ignore\r\n */\r\n private hasACExpression(expression: string, absolute: boolean = false): boolean {\r\n if (!this.Initialized)\r\n console.error(\"Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service\");\r\n\r\n if (!expression)\r\n return true;\r\n\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n\r\n // Per le espressioni di visibilità \"dirette\" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche\r\n // Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo \"sono Jace Admin\"\r\n if(this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')\r\n expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;\r\n \r\n // Espressione già valutata, non serve rivalutarla\r\n if (this.cache[expression])\r\n return this.cache[expression];\r\n\r\n var RolesPermissionsRegexp = /.:[^|&()]+/g;\r\n\r\n var matches = expression.match(RolesPermissionsRegexp);\r\n \r\n if (!matches)\r\n throw \"Espressione Access Control non valida: \" + expression + \". Assicurarsi che sia scritta in modo corretto\";\r\n\r\n matches.forEach(t => {\r\n var splits = t.split(':');\r\n if (splits[0] == \"R\")\r\n expression = expression.replace(t.trim(), \"this.hasRole('\" + splits[1].trim() + \"')\");\r\n else if (splits[0] == \"P\")\r\n expression = expression.replace(t.trim(), \"this.hasPermission('\" + splits[1].trim() + \"')\");\r\n else\r\n expression = expression.replace(t.trim(), \"this.hasCustom('\" + splits[1].trim() + \"', '\" + splits[0].trim() + \"')\");\r\n });\r\n\r\n var ret = <boolean>eval(expression);\r\n // Cache valore\r\n this.cache[expression] = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasRole(role: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasPermission(permission: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasCustom(value: string, tag: string): boolean {\r\n var items = this.taggedItemsCache.find(t => t.key == tag)?.items;\r\n if (!items)\r\n return true;\r\n else if (items.length == 0)\r\n return false;\r\n else\r\n return !!items.find(t => t == value);\r\n }\r\n\r\n /**\r\n * Entry point che controlla un'espressione identificante un permesso, ad esempio \"P:visualizzazione\" controlla che l'utente collegato abbia un permesso che si chiama \"visualizzazione\"\r\n */\r\n public has(expr: string, absolute: boolean = false) {\r\n return this.hasACExpression(expr, absolute);\r\n }\r\n}","//Angular\r\nimport { ActivatedRouteSnapshot, CanActivateChild, RouterStateSnapshot } from \"@angular/router\";\r\nimport { Injectable, Optional, Inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n//Libs\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n//Models\r\nimport { ACC_LOCALE } from \"./tokens\";\r\nimport { AccessControlService } from './access-control.service';\r\n\r\n/**\r\n * Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe\r\n * che la ereditavalorizzare la variabile Routes con le route permesse dal modulo e il permesso per cui si vuole riservare l'accesso. Ad esempio:\r\n * \r\n * ```typescript\r\n * @Injectable()\r\n * export class HasAuthGuardComponent extends BaseRouterGuard {\r\n * constructor(acc: AccessControlService, router: Router, ms: MessageService, ts: BaseTokenService) {\r\n * super(ms, acc, router, ts);\r\n * this.Routes = [\r\n * { route: \"page_route\", permission: \"P:perm_one\" },\r\n * { route: \"*\", permission: \"R:role_one\" }\r\n * ]\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class AccessControlRouteGuard implements CanActivateChild {\r\n /**\r\n * @ignore\r\n */\r\n private lc: LocalizationService;\r\n\r\n /**\r\n * Route di login che serve per reindirizzare alla pagina di login in caso di fallimento del controllo sui Permessi\r\n * \r\n * @default\r\n */\r\n protected LoginRoute : string = \"login\";\r\n\r\n /**\r\n * Permette di specificare delle Route sempre consentite, anche a livello di \"Radice\". Ad esempio la Root \"test\" permetterà\r\n * l'accesso a tutte le route che anche solo iniziano per \"test\"\r\n */\r\n protected AlwaysAllowedRoots: string[] = [];\r\n \r\n /**\r\n * Lista di Route con la loro espressione di controllo per valutare i permessi\r\n */\r\n protected Routes: { route: any; permission: string; }[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(private msgService : MessageService, private ac: AccessControlService, private router: Router, @Optional() @Inject(ACC_LOCALE) LOCALE: string) {\r\n this.lc = new LocalizationService(LOCALE ?? 'it-IT');\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n canActivateChild(route: ActivatedRouteSnapshot, _: RouterStateSnapshot): Promise<boolean> {\r\n var url = route.url.join('/');\r\n //Se l'applicazione non è pronta e non sto navigando nelle pagine consentite\r\n if (!this.ac.Initialized && !this.AlwaysAllowedRoots.find(r => url.indexOf(r) != -1))\r\n return Promise.resolve(false);\r\n \r\n var routeMatched: boolean = false;\r\n for (let i = 0; i < this.Routes.length; i++) {\r\n let r = this.Routes[i];\r\n //Se faccio match con la route significa che ho navigato in una delle route conosciute, altrimenti avverto ma lascio andare\r\n if (url.indexOf(r.route) != -1) {\r\n routeMatched = true;\r\n return this.handleMatch(url, r);\r\n }\r\n }\r\n //Se non faccio nessun match ma ho una route wildcard (*) prendo quella e controllo su quella\r\n if (!routeMatched) {\r\n var wildcardRoute = this.Routes.find(r => r.route == \"*\");\r\n if (wildcardRoute)\r\n return this.handleMatch(url, wildcardRoute);\r\n else\r\n console.log(\"Navigaizone avvenuta su route sconosciuta: \" + url);\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private handleMatch(fromurl: string, r: any) {\r\n let identity = this.ac.Identity;\r\n\r\n if (this.ac.has(r.permission) ||\r\n (\r\n // Considero anche la possibilità di avere l'access control inizializzato ma che l'account scope non sia ancora presente\r\n // in questo caso suppongo sia un hard refresh e mi fido del fatto che l'utente possa entrarci\r\n // TODO: Fixare meglio concatenando una promise che va a prendere l'account scope se serve\r\n this.ac.Initialized &&\r\n (!identity.Roles || identity.Roles.length == 0) &&\r\n (!identity.Permissions || identity.Permissions.length == 0)\r\n ))\r\n return Promise.resolve(true);\r\n else {\r\n //Se sono nel sito originale (non ho aperto un newtab) blocco la navigazione\r\n //Se ho aperto una nuova tab invece rispedisco al login\r\n if (window.history.length > 2 && this.ac.isLoggedIn()) {\r\n this.msgService.simpleError(this.lc.loc(\"You don't have the required permissions to view this page. The navigation has been blocked\"));\r\n return Promise.resolve(false);\r\n }\r\n else {\r\n this.onRedirectInProgress();\r\n this.router.navigate([this.LoginRoute, { fromUrl: fromurl }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Callback che viene eseguito prima che la Guard reindirizzi al login\r\n */\r\n protected onRedirectInProgress() {\r\n }\r\n}","// Angular\r\nimport { Directive, Input, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\n\r\n/**\r\n * Direttiva che permette di gestire il controllo accessi su componenti HTML. \r\n * \r\n * Per gli esempi di utilizzo fare riferimento al README.\r\n */\r\n@Directive({\r\n selector: '[ac]',\r\n})\r\nexport class AccessControlDirective {\r\n \r\n /** \r\n * Espressione da processare scritta come {Chiave}:{Valore}\r\n * \r\n * Le {Chiave} disponibili sono di default \"R\" per i ruoli e \"P\" per i permessi. È possibile espanderle con le Custom Permissions.\r\n * \r\n * Nelle ultime versioni del template è anche presente di default la custom permission \"X\" che indica se l'applicaizone è Esterna o no\r\n */\r\n @Input() ac : string = null;\r\n\r\n /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */\r\n @Input() acAbsolute: boolean = false;\r\n\r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef, private _ac: AccessControlService) { }\r\n\r\n\r\n ngOnInit(){\r\n var allow = this._ac.has(this.ac, this.acAbsolute);\r\n\r\n //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template\r\n\r\n if (allow) this.viewContainer.createEmbeddedView(this.templateRef);\r\n else this.viewContainer.clear();\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Token da iniettare per ogni singolo componente per cui si vuole disattivare/attivare massivamente degli input in maniera contestuale\r\n */\r\n@Injectable()\r\nexport class ComponentContext{\r\n /**\r\n * Nome del Contesto assegnato al Componente\r\n */\r\n name : string;\r\n}","// Angular\r\nimport { Directive, ElementRef, Optional, Inject } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\nimport { ACC_CUSTOMKEY } from \"./tokens\"\r\n\r\n// Classi\r\nimport { ComponentContext } from \"./models/ComponentContext\";\r\n\r\n/**\r\n * Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.\r\n * \r\n * Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext\r\n */\r\n@Directive({\r\n selector: '[contextAware]',\r\n})\r\nexport class ContextAwareDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(element: ElementRef, @Optional() private context: ComponentContext, private ac: AccessControlService, @Optional() @Inject(ACC_CUSTOMKEY) private ACC_CUSTOMKEY: string) {\r\n var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + \":\" + this.context.name,);\r\n\r\n if (!allow)\r\n element.nativeElement.setAttribute(\"enabled\", \"true\");\r\n }\r\n}","import { LocalizationModule } from '@esfaenza/localizations';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\n\r\nimport { ACC_LOCALE, ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP } from './tokens';\r\n\r\nimport { AccessControlModuleConfig } from './models/AccessControlModuleConfig';\r\nimport { AccessControlService } from './access-control.service';\r\nimport { AccessControlRouteGuard } from './AccessControlRouteGuard';\r\nimport { AccessControlDirective } from './access-control.directive';\r\nimport { ContextAwareDirective } from './context-aware.directive';\r\n\r\n@NgModule({\r\n imports: [LocalizationModule],\r\n declarations: [AccessControlDirective, ContextAwareDirective],\r\n exports:[AccessControlDirective, ContextAwareDirective]\r\n})\r\nexport class AccessControlModule {\r\n static forRoot(config?: AccessControlModuleConfig): ModuleWithProviders<AccessControlModule> {\r\n return {\r\n ngModule: AccessControlModule,\r\n providers: [\r\n AccessControlService,\r\n AccessControlRouteGuard,\r\n { provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },\r\n { provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },\r\n { provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },\r\n { provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'\r\n */\r\nexport class AccessControlModuleConfig {\r\n\r\n /**\r\n * locale dell'applicazione in forma standard, ad esempio \"it-IT\", \"en-US\", etc...\r\n * \r\n * Attualmente si supportano solo le lingue Italiano e Inglese\r\n */\r\n locale: string;\r\n\r\n /** Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno */\r\n customKey: string;\r\n\r\n /** Condizione di default da aggiungere a ogni condizione utente. Es: 'R:Jace Admin' */\r\n defaultCondition?: string;\r\n\r\n /** Relazione logica fra la condizione di default e la condizione utente. Es: '||'. Di default viene utilizzato l'OR logico */\r\n defaultConditionLogicalOperator?: string;\r\n}","/*\r\n * Public API Surface of access-control\r\n */\r\n\r\nexport * from './lib/access-control.module';\r\nexport * from './lib/access-control.service';\r\nexport * from './lib/access-control.directive'\r\nexport * from \"./lib/models/AccessControlModuleConfig\";\r\nexport * from \"./lib/AccessControlRouteGuard\";\r\nexport * from \"./lib/tokens\";\r\nexport * from \"./lib/models/ComponentContext\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {ContextAwareDirective as ɵa} from './lib/context-aware.directive';"],"names":["InjectionToken","Injectable","Optional","Inject","LocalizationService","MessageService","Router","Directive","TemplateRef","ViewContainerRef","Input","ElementRef","NgModule","LocalizationModule"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@esfaenza/localizations"),require("@angular/core"),require("@angular/router"),require("@esfaenza/extensions")):"function"==typeof define&&define.amd?define("@esfaenza/access-control",["exports","@esfaenza/localizations","@angular/core","@angular/router","@esfaenza/extensions"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).esfaenza=e.esfaenza||{},e.esfaenza["access-control"]={}),e.localizations,e.ng.core,e.ng.router,e.extensions)}(this,(function(exports,localizations,core,router,extensions){"use strict";var ACC_LOCALE=new core.InjectionToken("ACC_LOCALE"),ACC_CUSTOMKEY=new core.InjectionToken("ACC_CUSTOMKEY"),ACC_DEF_COND=new core.InjectionToken("ACC_DEF_COND"),ACC_DEF_COND_OP=new core.InjectionToken("ACC_DEF_COND_OP"),AccessControlService=function(){function AccessControlService(e,t){this.ACC_DEF_COND=e,this.ACC_DEF_COND_OP=t,this.Initialized=!1,this.InitializedCustom=!1,this.cache={},this.taggedItemsCache=[]}return AccessControlService.prototype.initializeIdentity=function(e){this.Identity=e,this.Initialized=!0},AccessControlService.prototype.initializeCustomPermissions=function(e){for(var t=0;t<e.length;t++)if(e[t].key.length>1)return void console.error("[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.");this.taggedItemsCache=e,this.InitializedCustom=!0},AccessControlService.prototype.isLoggedIn=function(){return!!this.Identity},AccessControlService.prototype.hasACExpression=function(expression){if(this.Initialized||console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service"),!expression)return!0;if(!this.Identity)return console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default"),!0;if(this.ACC_DEF_COND&&this.ACC_DEF_COND_OP&&(expression="("+expression+") "+this.ACC_DEF_COND_OP+" "+this.ACC_DEF_COND),this.cache[expression])return this.cache[expression];var RolesPermissionsRegexp=/.:[^|&()]+/g,matches=expression.match(RolesPermissionsRegexp);if(!matches)throw"Espressione Access Control non valida: "+expression+". Assicurarsi che sia scritta in modo corretto";matches.forEach((function(e){var t=e.split(":");expression="R"==t[0]?expression.replace(e.trim(),"this.hasRole('"+t[1].trim()+"')"):"P"==t[0]?expression.replace(e.trim(),"this.hasPermission('"+t[1].trim()+"')"):expression.replace(e.trim(),"this.hasCustom('"+t[1].trim()+"', '"+t[0].trim()+"')")}));var ret=eval(expression);return this.cache[expression]=ret,ret},AccessControlService.prototype.hasRole=function(e){return this.Identity?this.Identity.Roles&&this.Identity.Roles.length>0&&-1!=this.Identity.Roles.indexOf(e):(console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default"),!0)},AccessControlService.prototype.hasPermission=function(e){return this.Identity?this.Identity.Permissions&&this.Identity.Permissions.length>0&&-1!=this.Identity.Permissions.indexOf(e):(console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default"),!0)},AccessControlService.prototype.hasCustom=function(e,t){var o,i=null===(o=this.taggedItemsCache.find((function(e){return e.key==t})))||void 0===o?void 0:o.items;return!i||0!=i.length&&!!i.find((function(t){return t==e}))},AccessControlService.prototype.has=function(e){return this.hasACExpression(e)},AccessControlService}();AccessControlService.decorators=[{type:core.Injectable}],AccessControlService.ctorParameters=function(){return[{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_DEF_COND]}]},{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_DEF_COND_OP]}]}]};var AccessControlRouteGuard=function(){function e(e,t,o,i){this.msgService=e,this.ac=t,this.router=o,this.LoginRoute="login",this.AlwaysAllowedRoots=[],this.Routes=[],this.lc=new localizations.LocalizationService(null!=i?i:"it-IT")}return e.prototype.canActivateChild=function(e,t){var o=e.url.join("/");if(!this.ac.Initialized&&!this.AlwaysAllowedRoots.find((function(e){return-1!=o.indexOf(e)})))return Promise.resolve(!1);for(var i=!1,r=0;r<this.Routes.length;r++){var s=this.Routes[r];if(-1!=o.indexOf(s.route))return i=!0,this.handleMatch(o,s)}if(!i){var n=this.Routes.find((function(e){return"*"==e.route}));if(n)return this.handleMatch(o,n);console.log("Navigaizone avvenuta su route sconosciuta: "+o)}return Promise.resolve(!0)},e.prototype.handleMatch=function(e,t){var o=this.ac.Identity;return this.ac.has(t.permission)||!(!this.ac.Initialized||o.Roles&&0!=o.Roles.length||o.Permissions&&0!=o.Permissions.length)?Promise.resolve(!0):window.history.length>2&&this.ac.isLoggedIn()?(this.msgService.simpleError(this.lc.loc("You don't have the required permissions to view this page. The navigation has been blocked")),Promise.resolve(!1)):(this.onRedirectInProgress(),void this.router.navigate([this.LoginRoute,{fromUrl:e}]))},e.prototype.onRedirectInProgress=function(){},e}();AccessControlRouteGuard.decorators=[{type:core.Injectable}],AccessControlRouteGuard.ctorParameters=function(){return[{type:extensions.MessageService},{type:AccessControlService},{type:router.Router},{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_LOCALE]}]}]};var AccessControlDirective=function(){function e(e,t,o){this.templateRef=e,this.viewContainer=t,this._ac=o}return Object.defineProperty(e.prototype,"ac",{set:function(e){this._ac.has(e)?this.viewContainer.createEmbeddedView(this.templateRef):this.viewContainer.clear()},enumerable:!1,configurable:!0}),e}();AccessControlDirective.decorators=[{type:core.Directive,args:[{selector:"[ac]"}]}],AccessControlDirective.ctorParameters=function(){return[{type:core.TemplateRef},{type:core.ViewContainerRef},{type:AccessControlService}]},AccessControlDirective.propDecorators={ac:[{type:core.Input}]};var ComponentContext=function(){};ComponentContext.decorators=[{type:core.Injectable}];var ContextAwareDirective=function(e,t,o,i){this.context=t,this.ac=o,this.ACC_CUSTOMKEY=i,!this.context||!this.context.name||!this.ACC_CUSTOMKEY||this.ac.has(this.ACC_CUSTOMKEY+":"+this.context.name)||e.nativeElement.setAttribute("enabled","true")};ContextAwareDirective.decorators=[{type:core.Directive,args:[{selector:"[contextAware]"}]}],ContextAwareDirective.ctorParameters=function(){return[{type:core.ElementRef},{type:ComponentContext,decorators:[{type:core.Optional}]},{type:AccessControlService},{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_CUSTOMKEY]}]}]};var AccessControlModule=function(){function e(){}return e.forRoot=function(t){return{ngModule:e,providers:[AccessControlService,AccessControlRouteGuard,{provide:ACC_LOCALE,useValue:(null==t?void 0:t.locale)||"it-IT"},{provide:ACC_CUSTOMKEY,useValue:(null==t?void 0:t.customKey)||null},{provide:ACC_DEF_COND,useValue:(null==t?void 0:t.defaultCondition)||null},{provide:ACC_DEF_COND_OP,useValue:(null==t?void 0:t.defaultConditionLogicalOperator)||"||"}]}},e}();AccessControlModule.decorators=[{type:core.NgModule,args:[{imports:[localizations.LocalizationModule],declarations:[AccessControlDirective,ContextAwareDirective],exports:[AccessControlDirective,ContextAwareDirective]}]}];var AccessControlModuleConfig=function(){};exports.ACC_CUSTOMKEY=ACC_CUSTOMKEY,exports.ACC_DEF_COND=ACC_DEF_COND,exports.ACC_DEF_COND_OP=ACC_DEF_COND_OP,exports.ACC_LOCALE=ACC_LOCALE,exports.AccessControlDirective=AccessControlDirective,exports.AccessControlModule=AccessControlModule,exports.AccessControlModuleConfig=AccessControlModuleConfig,exports.AccessControlRouteGuard=AccessControlRouteGuard,exports.AccessControlService=AccessControlService,exports.ComponentContext=ComponentContext,exports.ɵa=ContextAwareDirective,Object.defineProperty(exports,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@esfaenza/localizations"),require("@angular/core"),require("@angular/router"),require("@esfaenza/extensions")):"function"==typeof define&&define.amd?define("@esfaenza/access-control",["exports","@esfaenza/localizations","@angular/core","@angular/router","@esfaenza/extensions"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).esfaenza=e.esfaenza||{},e.esfaenza["access-control"]={}),e.localizations,e.ng.core,e.ng.router,e.extensions)}(this,(function(exports,localizations,core,router,extensions){"use strict";var ACC_LOCALE=new core.InjectionToken("ACC_LOCALE"),ACC_CUSTOMKEY=new core.InjectionToken("ACC_CUSTOMKEY"),ACC_DEF_COND=new core.InjectionToken("ACC_DEF_COND"),ACC_DEF_COND_OP=new core.InjectionToken("ACC_DEF_COND_OP"),AccessControlService=function(){function AccessControlService(e,t){this.ACC_DEF_COND=e,this.ACC_DEF_COND_OP=t,this.Initialized=!1,this.InitializedCustom=!1,this.cache={},this.taggedItemsCache=[]}return AccessControlService.prototype.initializeIdentity=function(e){this.Identity=e,this.Initialized=!0},AccessControlService.prototype.initializeCustomPermissions=function(e){for(var t=0;t<e.length;t++)if(e[t].key.length>1)return void console.error("[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.");this.taggedItemsCache=e,this.InitializedCustom=!0},AccessControlService.prototype.isLoggedIn=function(){return!!this.Identity},AccessControlService.prototype.hasACExpression=function(expression,absolute){if(void 0===absolute&&(absolute=!1),this.Initialized||console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service"),!expression)return!0;if(!this.Identity)return console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default"),!0;if(this.ACC_DEF_COND&&this.ACC_DEF_COND_OP&&!absolute&&"X:0"!=expression&&"X:1"!=expression&&(expression="("+expression+") "+this.ACC_DEF_COND_OP+" "+this.ACC_DEF_COND),this.cache[expression])return this.cache[expression];var RolesPermissionsRegexp=/.:[^|&()]+/g,matches=expression.match(RolesPermissionsRegexp);if(!matches)throw"Espressione Access Control non valida: "+expression+". Assicurarsi che sia scritta in modo corretto";matches.forEach((function(e){var t=e.split(":");expression="R"==t[0]?expression.replace(e.trim(),"this.hasRole('"+t[1].trim()+"')"):"P"==t[0]?expression.replace(e.trim(),"this.hasPermission('"+t[1].trim()+"')"):expression.replace(e.trim(),"this.hasCustom('"+t[1].trim()+"', '"+t[0].trim()+"')")}));var ret=eval(expression);return this.cache[expression]=ret,ret},AccessControlService.prototype.hasRole=function(e){return this.Identity?this.Identity.Roles&&this.Identity.Roles.length>0&&-1!=this.Identity.Roles.indexOf(e):(console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default"),!0)},AccessControlService.prototype.hasPermission=function(e){return this.Identity?this.Identity.Permissions&&this.Identity.Permissions.length>0&&-1!=this.Identity.Permissions.indexOf(e):(console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default"),!0)},AccessControlService.prototype.hasCustom=function(e,t){var o,i=null===(o=this.taggedItemsCache.find((function(e){return e.key==t})))||void 0===o?void 0:o.items;return!i||0!=i.length&&!!i.find((function(t){return t==e}))},AccessControlService.prototype.has=function(e,t){return void 0===t&&(t=!1),this.hasACExpression(e,t)},AccessControlService}();AccessControlService.decorators=[{type:core.Injectable}],AccessControlService.ctorParameters=function(){return[{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_DEF_COND]}]},{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_DEF_COND_OP]}]}]};var AccessControlRouteGuard=function(){function e(e,t,o,i){this.msgService=e,this.ac=t,this.router=o,this.LoginRoute="login",this.AlwaysAllowedRoots=[],this.Routes=[],this.lc=new localizations.LocalizationService(null!=i?i:"it-IT")}return e.prototype.canActivateChild=function(e,t){var o=e.url.join("/");if(!this.ac.Initialized&&!this.AlwaysAllowedRoots.find((function(e){return-1!=o.indexOf(e)})))return Promise.resolve(!1);for(var i=!1,s=0;s<this.Routes.length;s++){var r=this.Routes[s];if(-1!=o.indexOf(r.route))return i=!0,this.handleMatch(o,r)}if(!i){var n=this.Routes.find((function(e){return"*"==e.route}));if(n)return this.handleMatch(o,n);console.log("Navigaizone avvenuta su route sconosciuta: "+o)}return Promise.resolve(!0)},e.prototype.handleMatch=function(e,t){var o=this.ac.Identity;return this.ac.has(t.permission)||!(!this.ac.Initialized||o.Roles&&0!=o.Roles.length||o.Permissions&&0!=o.Permissions.length)?Promise.resolve(!0):window.history.length>2&&this.ac.isLoggedIn()?(this.msgService.simpleError(this.lc.loc("You don't have the required permissions to view this page. The navigation has been blocked")),Promise.resolve(!1)):(this.onRedirectInProgress(),void this.router.navigate([this.LoginRoute,{fromUrl:e}]))},e.prototype.onRedirectInProgress=function(){},e}();AccessControlRouteGuard.decorators=[{type:core.Injectable}],AccessControlRouteGuard.ctorParameters=function(){return[{type:extensions.MessageService},{type:AccessControlService},{type:router.Router},{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_LOCALE]}]}]};var AccessControlDirective=function(){function e(e,t,o){this.templateRef=e,this.viewContainer=t,this._ac=o,this.ac=null,this.acAbsolute=!1}return e.prototype.ngOnInit=function(){this._ac.has(this.ac,this.acAbsolute)?this.viewContainer.createEmbeddedView(this.templateRef):this.viewContainer.clear()},e}();AccessControlDirective.decorators=[{type:core.Directive,args:[{selector:"[ac]"}]}],AccessControlDirective.ctorParameters=function(){return[{type:core.TemplateRef},{type:core.ViewContainerRef},{type:AccessControlService}]},AccessControlDirective.propDecorators={ac:[{type:core.Input}],acAbsolute:[{type:core.Input}]};var ComponentContext=function(){};ComponentContext.decorators=[{type:core.Injectable}];var ContextAwareDirective=function(e,t,o,i){this.context=t,this.ac=o,this.ACC_CUSTOMKEY=i,!this.context||!this.context.name||!this.ACC_CUSTOMKEY||this.ac.has(this.ACC_CUSTOMKEY+":"+this.context.name)||e.nativeElement.setAttribute("enabled","true")};ContextAwareDirective.decorators=[{type:core.Directive,args:[{selector:"[contextAware]"}]}],ContextAwareDirective.ctorParameters=function(){return[{type:core.ElementRef},{type:ComponentContext,decorators:[{type:core.Optional}]},{type:AccessControlService},{type:String,decorators:[{type:core.Optional},{type:core.Inject,args:[ACC_CUSTOMKEY]}]}]};var AccessControlModule=function(){function e(){}return e.forRoot=function(t){return{ngModule:e,providers:[AccessControlService,AccessControlRouteGuard,{provide:ACC_LOCALE,useValue:(null==t?void 0:t.locale)||"it-IT"},{provide:ACC_CUSTOMKEY,useValue:(null==t?void 0:t.customKey)||null},{provide:ACC_DEF_COND,useValue:(null==t?void 0:t.defaultCondition)||null},{provide:ACC_DEF_COND_OP,useValue:(null==t?void 0:t.defaultConditionLogicalOperator)||"||"}]}},e}();AccessControlModule.decorators=[{type:core.NgModule,args:[{imports:[localizations.LocalizationModule],declarations:[AccessControlDirective,ContextAwareDirective],exports:[AccessControlDirective,ContextAwareDirective]}]}];var AccessControlModuleConfig=function(){};exports.ACC_CUSTOMKEY=ACC_CUSTOMKEY,exports.ACC_DEF_COND=ACC_DEF_COND,exports.ACC_DEF_COND_OP=ACC_DEF_COND_OP,exports.ACC_LOCALE=ACC_LOCALE,exports.AccessControlDirective=AccessControlDirective,exports.AccessControlModule=AccessControlModule,exports.AccessControlModuleConfig=AccessControlModuleConfig,exports.AccessControlRouteGuard=AccessControlRouteGuard,exports.AccessControlService=AccessControlService,exports.ComponentContext=ComponentContext,exports.ɵa=ContextAwareDirective,Object.defineProperty(exports,"__esModule",{value:!0})}));
2
2
  //# sourceMappingURL=esfaenza-access-control.umd.min.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../projects/access-control/src/lib/tokens.ts","../../../projects/access-control/src/lib/access-control.service.ts","../../../projects/access-control/src/lib/AccessControlRouteGuard.ts","../../../projects/access-control/src/lib/access-control.directive.ts","../../../projects/access-control/src/lib/models/ComponentContext.ts","../../../projects/access-control/src/lib/context-aware.directive.ts","../../../projects/access-control/src/lib/access-control.module.ts","../../../projects/access-control/src/lib/models/AccessControlModuleConfig.ts"],"names":["ACC_LOCALE","InjectionToken","ACC_CUSTOMKEY","ACC_DEF_COND","ACC_DEF_COND_OP","AccessControlService","this","Initialized","InitializedCustom","cache","taggedItemsCache","prototype","initializeIdentity","identity","Identity","initializeCustomPermissions","customPermissions","i","length","key","console","error","isLoggedIn","hasACExpression","expression","warn","RolesPermissionsRegexp","matches","match","forEach","t","splits","split","replace","trim","ret","eval","hasRole","role","Roles","indexOf","hasPermission","permission","Permissions","hasCustom","value","tag","items","_a","find","has","expr","Injectable","Optional","type","Inject","args","AccessControlRouteGuard","msgService","ac","router","LOCALE","LoginRoute","AlwaysAllowedRoots","Routes","lc","LocalizationService","canActivateChild","route","_","url","join","r","Promise","resolve","routeMatched","handleMatch","wildcardRoute","log","fromurl","window","history","simpleError","loc","onRedirectInProgress","navigate","fromUrl","MessageService","Router","AccessControlDirective","templateRef","viewContainer","_ac","Object","defineProperty","createEmbeddedView","clear","Directive","selector","TemplateRef","ViewContainerRef","Input","element","context","name","nativeElement","setAttribute","ElementRef","ComponentContext","decorators","AccessControlModule","forRoot","config","ngModule","providers","provide","useValue","locale","customKey","defaultCondition","defaultConditionLogicalOperator","NgModule","imports","LocalizationModule","declarations","ContextAwareDirective","exports"],"mappings":"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","sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Token che racchiude il locale scelto per l'applicazione */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');\r\n\r\n/** Token che indica la condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND');\r\n\r\n/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND_OP: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND_OP');","// Angular\r\nimport { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { ACC_DEF_COND, ACC_DEF_COND_OP } from \"./tokens\";\r\n\r\n/**\r\n * Entrypoint di tutte le operazioni esposte dalla libreria access-control\r\n */\r\n@Injectable()\r\nexport class AccessControlService {\r\n\r\n /**\r\n * Indica se l'Identity è stata inizializzata\r\n */\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Indica se sono state effettuate inizializzazioni di Custom Permissions\r\n */\r\n public InitializedCustom: boolean = false;\r\n\r\n /** @ignore */\r\n private cache: {} = {};\r\n\r\n /** @ignore */\r\n private taggedItemsCache: { key: string, items: string[] }[] = [];\r\n\r\n /**\r\n * Identity associata a quest'istanza del Servizio Access Control, utile se si vuole avere accesso a Ruoli e Permessi direttamente da qui, per qualsivoglia motivo\r\n */\r\n public Identity: { Roles: string[], Permissions: string[] };\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(ACC_DEF_COND) private ACC_DEF_COND: string, @Optional() @Inject(ACC_DEF_COND_OP) private ACC_DEF_COND_OP: string,) { }\r\n\r\n /**\r\n * Inizializza l'Identity del servizio con il modello specificato\r\n * \r\n * @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi\r\n */\r\n public initializeIdentity(identity: { Roles: string[], Permissions: string[] }) {\r\n this.Identity = identity;\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Inizializza i permessi Custom del servizio con il modello specificato\r\n * \r\n * @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom\r\n */\r\n public initializeCustomPermissions(customPermissions: { key: string, items: string[] }[]) {\r\n for (let i = 0; i < customPermissions.length; i++) {\r\n if (customPermissions[i].key.length > 1) {\r\n console.error(\"[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.\");\r\n return;\r\n }\r\n }\r\n\r\n this.taggedItemsCache = customPermissions;\r\n this.InitializedCustom = true;\r\n }\r\n\r\n /**\r\n * Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity\r\n */\r\n public isLoggedIn() {\r\n return !!this.Identity;\r\n }\r\n\r\n /**\r\n * Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)\r\n * Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P\r\n * \r\n * @ignore\r\n */\r\n private hasACExpression(expression: string): boolean {\r\n if (!this.Initialized)\r\n console.error(\"Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service\");\r\n\r\n if (!expression)\r\n return true;\r\n\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n\r\n if(this.ACC_DEF_COND && this.ACC_DEF_COND_OP)\r\n expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;\r\n \r\n //Espressione già valutata, non serve rivalutarla\r\n if (this.cache[expression])\r\n return this.cache[expression];\r\n\r\n var RolesPermissionsRegexp = /.:[^|&()]+/g;\r\n\r\n var matches = expression.match(RolesPermissionsRegexp);\r\n \r\n if (!matches)\r\n throw \"Espressione Access Control non valida: \" + expression + \". Assicurarsi che sia scritta in modo corretto\";\r\n\r\n matches.forEach(t => {\r\n var splits = t.split(':');\r\n if (splits[0] == \"R\")\r\n expression = expression.replace(t.trim(), \"this.hasRole('\" + splits[1].trim() + \"')\");\r\n else if (splits[0] == \"P\")\r\n expression = expression.replace(t.trim(), \"this.hasPermission('\" + splits[1].trim() + \"')\");\r\n else\r\n expression = expression.replace(t.trim(), \"this.hasCustom('\" + splits[1].trim() + \"', '\" + splits[0].trim() + \"')\");\r\n });\r\n\r\n var ret = <boolean>eval(expression);\r\n // Cache valore\r\n this.cache[expression] = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasRole(role: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasPermission(permission: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasCustom(value: string, tag: string): boolean {\r\n var items = this.taggedItemsCache.find(t => t.key == tag)?.items;\r\n if (!items)\r\n return true;\r\n else if (items.length == 0)\r\n return false;\r\n else\r\n return !!items.find(t => t == value);\r\n }\r\n\r\n /**\r\n * Entry point che controlla un'espressione identificante un permesso, ad esempio \"P:visualizzazione\" controlla che l'utente collegato abbia un permesso che si chiama \"visualizzazione\"\r\n */\r\n public has(expr: string) {\r\n return this.hasACExpression(expr);\r\n }\r\n}","//Angular\r\nimport { ActivatedRouteSnapshot, CanActivateChild, RouterStateSnapshot } from \"@angular/router\";\r\nimport { Injectable, Optional, Inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n//Libs\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n//Models\r\nimport { ACC_LOCALE } from \"./tokens\";\r\nimport { AccessControlService } from './access-control.service';\r\n\r\n/**\r\n * Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe\r\n * che la ereditavalorizzare la variabile Routes con le route permesse dal modulo e il permesso per cui si vuole riservare l'accesso. Ad esempio:\r\n * \r\n * ```typescript\r\n * @Injectable()\r\n * export class HasAuthGuardComponent extends BaseRouterGuard {\r\n * constructor(acc: AccessControlService, router: Router, ms: MessageService, ts: BaseTokenService) {\r\n * super(ms, acc, router, ts);\r\n * this.Routes = [\r\n * { route: \"page_route\", permission: \"P:perm_one\" },\r\n * { route: \"*\", permission: \"R:role_one\" }\r\n * ]\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class AccessControlRouteGuard implements CanActivateChild {\r\n /**\r\n * @ignore\r\n */\r\n private lc: LocalizationService;\r\n\r\n /**\r\n * Route di login che serve per reindirizzare alla pagina di login in caso di fallimento del controllo sui Permessi\r\n * \r\n * @default\r\n */\r\n protected LoginRoute : string = \"login\";\r\n\r\n /**\r\n * Permette di specificare delle Route sempre consentite, anche a livello di \"Radice\". Ad esempio la Root \"test\" permetterà\r\n * l'accesso a tutte le route che anche solo iniziano per \"test\"\r\n */\r\n protected AlwaysAllowedRoots: string[] = [];\r\n \r\n /**\r\n * Lista di Route con la loro espressione di controllo per valutare i permessi\r\n */\r\n protected Routes: { route: any; permission: string; }[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(private msgService : MessageService, private ac: AccessControlService, private router: Router, @Optional() @Inject(ACC_LOCALE) LOCALE: string) {\r\n this.lc = new LocalizationService(LOCALE ?? 'it-IT');\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n canActivateChild(route: ActivatedRouteSnapshot, _: RouterStateSnapshot): Promise<boolean> {\r\n var url = route.url.join('/');\r\n //Se l'applicazione non è pronta e non sto navigando nelle pagine consentite\r\n if (!this.ac.Initialized && !this.AlwaysAllowedRoots.find(r => url.indexOf(r) != -1))\r\n return Promise.resolve(false);\r\n \r\n var routeMatched: boolean = false;\r\n for (let i = 0; i < this.Routes.length; i++) {\r\n let r = this.Routes[i];\r\n //Se faccio match con la route significa che ho navigato in una delle route conosciute, altrimenti avverto ma lascio andare\r\n if (url.indexOf(r.route) != -1) {\r\n routeMatched = true;\r\n return this.handleMatch(url, r);\r\n }\r\n }\r\n //Se non faccio nessun match ma ho una route wildcard (*) prendo quella e controllo su quella\r\n if (!routeMatched) {\r\n var wildcardRoute = this.Routes.find(r => r.route == \"*\");\r\n if (wildcardRoute)\r\n return this.handleMatch(url, wildcardRoute);\r\n else\r\n console.log(\"Navigaizone avvenuta su route sconosciuta: \" + url);\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private handleMatch(fromurl: string, r: any) {\r\n let identity = this.ac.Identity;\r\n\r\n if (this.ac.has(r.permission) ||\r\n (\r\n // Considero anche la possibilità di avere l'access control inizializzato ma che l'account scope non sia ancora presente\r\n // in questo caso suppongo sia un hard refresh e mi fido del fatto che l'utente possa entrarci\r\n // TODO: Fixare meglio concatenando una promise che va a prendere l'account scope se serve\r\n this.ac.Initialized &&\r\n (!identity.Roles || identity.Roles.length == 0) &&\r\n (!identity.Permissions || identity.Permissions.length == 0)\r\n ))\r\n return Promise.resolve(true);\r\n else {\r\n //Se sono nel sito originale (non ho aperto un newtab) blocco la navigazione\r\n //Se ho aperto una nuova tab invece rispedisco al login\r\n if (window.history.length > 2 && this.ac.isLoggedIn()) {\r\n this.msgService.simpleError(this.lc.loc(\"You don't have the required permissions to view this page. The navigation has been blocked\"));\r\n return Promise.resolve(false);\r\n }\r\n else {\r\n this.onRedirectInProgress();\r\n this.router.navigate([this.LoginRoute, { fromUrl: fromurl }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Callback che viene eseguito prima che la Guard reindirizzi al login\r\n */\r\n protected onRedirectInProgress() {\r\n }\r\n}","// Angular\r\nimport { Directive, Input, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\n\r\n/**\r\n * Direttiva che permette di gestire il controllo accessi su componenti HTML. \r\n * \r\n * Per gli esempi di utilizzo fare riferimento al README.\r\n */\r\n@Directive({\r\n selector: '[ac]',\r\n})\r\nexport class AccessControlDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef, private _ac: AccessControlService) { }\r\n\r\n /**\r\n * Input autoreferenziale per la direttiva\r\n * \r\n * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}\r\n * \r\n * Le {Chiave} disponibili sono di default \"R\" per i ruoli e \"P\" per i permessi. È possibile espanderle con le Custom Permissions\r\n */\r\n @Input() set ac(expression: string) {\r\n var allow = this._ac.has(expression);\r\n\r\n //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template\r\n\r\n if (allow) this.viewContainer.createEmbeddedView(this.templateRef);\r\n else this.viewContainer.clear();\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Token da iniettare per ogni singolo componente per cui si vuole disattivare/attivare massivamente degli input in maniera contestuale\r\n */\r\n@Injectable()\r\nexport class ComponentContext{\r\n /**\r\n * Nome del Contesto assegnato al Componente\r\n */\r\n name : string;\r\n}","// Angular\r\nimport { Directive, ElementRef, Optional, Inject } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\nimport { ACC_CUSTOMKEY } from \"./tokens\"\r\n\r\n// Classi\r\nimport { ComponentContext } from \"./models/ComponentContext\";\r\n\r\n/**\r\n * Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.\r\n * \r\n * Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext\r\n */\r\n@Directive({\r\n selector: '[contextAware]',\r\n})\r\nexport class ContextAwareDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(element: ElementRef, @Optional() private context: ComponentContext, private ac: AccessControlService, @Optional() @Inject(ACC_CUSTOMKEY) private ACC_CUSTOMKEY: string) {\r\n var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + \":\" + this.context.name,);\r\n\r\n if (!allow)\r\n element.nativeElement.setAttribute(\"enabled\", \"true\");\r\n }\r\n}","import { LocalizationModule } from '@esfaenza/localizations';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\n\r\nimport { ACC_LOCALE, ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP } from './tokens';\r\n\r\nimport { AccessControlModuleConfig } from './models/AccessControlModuleConfig';\r\nimport { AccessControlService } from './access-control.service';\r\nimport { AccessControlRouteGuard } from './AccessControlRouteGuard';\r\nimport { AccessControlDirective } from './access-control.directive';\r\nimport { ContextAwareDirective } from './context-aware.directive';\r\n\r\n@NgModule({\r\n imports: [LocalizationModule],\r\n declarations: [AccessControlDirective, ContextAwareDirective],\r\n exports:[AccessControlDirective, ContextAwareDirective]\r\n})\r\nexport class AccessControlModule {\r\n static forRoot(config?: AccessControlModuleConfig): ModuleWithProviders<AccessControlModule> {\r\n return {\r\n ngModule: AccessControlModule,\r\n providers: [\r\n AccessControlService,\r\n AccessControlRouteGuard,\r\n { provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },\r\n { provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },\r\n { provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },\r\n { provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'\r\n */\r\nexport class AccessControlModuleConfig {\r\n\r\n /**\r\n * locale dell'applicazione in forma standard, ad esempio \"it-IT\", \"en-US\", etc...\r\n * \r\n * Attualmente si supportano solo le lingue Italiano e Inglese\r\n */\r\n locale: string;\r\n\r\n /** Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno */\r\n customKey: string;\r\n\r\n /** Condizione di default da aggiungere a ogni condizione utente. Es: 'R:Jace Admin' */\r\n defaultCondition?: string;\r\n\r\n /** Relazione logica fra la condizione di default e la condizione utente. Es: '||'. Di default viene utilizzato l'OR logico */\r\n defaultConditionLogicalOperator?: string;\r\n}"]}
1
+ {"version":3,"sources":["../../../projects/access-control/src/lib/tokens.ts","../../../projects/access-control/src/lib/access-control.service.ts","../../../projects/access-control/src/lib/AccessControlRouteGuard.ts","../../../projects/access-control/src/lib/access-control.directive.ts","../../../projects/access-control/src/lib/models/ComponentContext.ts","../../../projects/access-control/src/lib/context-aware.directive.ts","../../../projects/access-control/src/lib/access-control.module.ts","../../../projects/access-control/src/lib/models/AccessControlModuleConfig.ts"],"names":["ACC_LOCALE","InjectionToken","ACC_CUSTOMKEY","ACC_DEF_COND","ACC_DEF_COND_OP","AccessControlService","this","Initialized","InitializedCustom","cache","taggedItemsCache","prototype","initializeIdentity","identity","Identity","initializeCustomPermissions","customPermissions","i","length","key","console","error","isLoggedIn","hasACExpression","expression","absolute","warn","RolesPermissionsRegexp","matches","match","forEach","t","splits","split","replace","trim","ret","eval","hasRole","role","Roles","indexOf","hasPermission","permission","Permissions","hasCustom","value","tag","items","_a","find","has","expr","Injectable","Optional","type","Inject","args","AccessControlRouteGuard","msgService","ac","router","LOCALE","LoginRoute","AlwaysAllowedRoots","Routes","lc","LocalizationService","canActivateChild","route","_","url","join","r","Promise","resolve","routeMatched","handleMatch","wildcardRoute","log","fromurl","window","history","simpleError","loc","onRedirectInProgress","navigate","fromUrl","MessageService","Router","AccessControlDirective","templateRef","viewContainer","_ac","acAbsolute","ngOnInit","createEmbeddedView","clear","Directive","selector","TemplateRef","ViewContainerRef","Input","element","context","name","nativeElement","setAttribute","ElementRef","ComponentContext","decorators","AccessControlModule","forRoot","config","ngModule","providers","provide","useValue","locale","customKey","defaultCondition","defaultConditionLogicalOperator","NgModule","imports","LocalizationModule","declarations","ContextAwareDirective","exports"],"mappings":"qmBAGaA,WAAqC,IAAIC,KAAAA,eAAuB,cAGhEC,cAAwC,IAAID,KAAAA,eAAuB,iBAGnEE,aAAuC,IAAIF,KAAAA,eAAuB,gBAGlEG,gBAA0C,IAAIH,KAAAA,eAAuB,mDCoBhF,SAAAI,qBAAsDF,EAAmEC,GAAnEE,KAAAH,aAAAA,EAAmEG,KAAAF,gBAAAA,EAnBlHE,KAAAC,aAAuB,EAKvBD,KAAAE,mBAA6B,EAG5BF,KAAAG,MAAY,GAGZH,KAAAI,iBAAuD,UAexDL,qBAAAM,UAAAC,mBAAA,SAAmBC,GACxBP,KAAKQ,SAAWD,EAChBP,KAAKC,aAAc,GAQdF,qBAAAM,UAAAI,4BAAA,SAA4BC,GACjC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAkBE,OAAQD,IAC5C,GAAID,EAAkBC,GAAGE,IAAID,OAAS,EAEpC,YADAE,QAAQC,MAAM,4HAKlBf,KAAKI,iBAAmBM,EACxBV,KAAKE,mBAAoB,GAMpBH,qBAAAM,UAAAW,WAAA,WACL,QAAShB,KAAKQ,UASRT,qBAAAM,UAAAY,gBAAA,SAAgBC,WAAoBC,UAI1C,QAJ0C,IAAAA,WAAAA,UAAA,GACrCnB,KAAKC,aACRa,QAAQC,MAAM,0HAEXG,WACH,OAAO,EAET,IAAKlB,KAAKQ,SAER,OADAM,QAAQM,KAAK,qGACN,EAST,GAJGpB,KAAKH,cAAgBG,KAAKF,kBAAoBqB,UAA0B,OAAdD,YAAqC,OAAdA,aAClFA,WAAa,IAAIA,WAAU,KAAKlB,KAAKF,gBAAe,IAAIE,KAAKH,cAG3DG,KAAKG,MAAMe,YACb,OAAOlB,KAAKG,MAAMe,YAEpB,IAAIG,uBAAyB,cAEzBC,QAAUJ,WAAWK,MAAMF,wBAE/B,IAAKC,QACH,KAAM,0CAA4CJ,WAAa,iDAEjEI,QAAQE,SAAQ,SAAAC,GACd,IAAIC,EAASD,EAAEE,MAAM,KAEnBT,WADe,KAAbQ,EAAO,GACIR,WAAWU,QAAQH,EAAEI,OAAQ,iBAAmBH,EAAO,GAAGG,OAAS,MAC5D,KAAbH,EAAO,GACDR,WAAWU,QAAQH,EAAEI,OAAQ,uBAAyBH,EAAO,GAAGG,OAAS,MAEzEX,WAAWU,QAAQH,EAAEI,OAAQ,mBAAqBH,EAAO,GAAGG,OAAS,OAASH,EAAO,GAAGG,OAAS,SAGlH,IAAIC,IAAeC,KAAKb,YAGxB,OADAlB,KAAKG,MAAMe,YAAcY,IAClBA,KAQD/B,qBAAAM,UAAA2B,QAAA,SAAQC,GACd,OAAKjC,KAAKQ,SAIHR,KAAKQ,SAAS0B,OAASlC,KAAKQ,SAAS0B,MAAMtB,OAAS,IAA2C,GAAtCZ,KAAKQ,SAAS0B,MAAMC,QAAQF,IAH1FnB,QAAQM,KAAK,qGACN,IAUHrB,qBAAAM,UAAA+B,cAAA,SAAcC,GACpB,OAAKrC,KAAKQ,SAIHR,KAAKQ,SAAS8B,aAAetC,KAAKQ,SAAS8B,YAAY1B,OAAS,IAAuD,GAAlDZ,KAAKQ,SAAS8B,YAAYH,QAAQE,IAH5GvB,QAAQM,KAAK,qGACN,IAUHrB,qBAAAM,UAAAkC,UAAA,SAAUC,EAAeC,SAC3BC,EAAqD,QAAhDC,EAAG3C,KAAKI,iBAAiBwC,MAAK,SAAAnB,GAAK,OAAAA,EAAEZ,KAAO4B,YAAI,IAAAE,OAAA,EAAAA,EAAED,MAC3D,OAAKA,GAEoB,GAAhBA,EAAM9B,UAGJ8B,EAAME,MAAK,SAAAnB,GAAK,OAAAA,GAAKe,MAM3BzC,qBAAAM,UAAAwC,IAAA,SAAIC,EAAc3B,GACvB,YADuB,IAAAA,IAAAA,GAAA,GAChBnB,KAAKiB,gBAAgB6B,EAAM3B,mEA5JrC4B,KAAAA,kGAyBcC,KAAAA,UAAQ,CAAAC,KAAIC,KAAAA,OAAMC,KAAA,CAACtD,gDAA6CmD,KAAAA,UAAQ,CAAAC,KAAIC,KAAAA,OAAMC,KAAA,CAACrD,6DC0B9F,SAAAsD,EAAoBC,EAAqCC,EAAkCC,EAAgDC,GAAvHxD,KAAAqD,WAAAA,EAAqCrD,KAAAsD,GAAAA,EAAkCtD,KAAAuD,OAAAA,EAhBjFvD,KAAAyD,WAAsB,QAMtBzD,KAAA0D,mBAA+B,GAK/B1D,KAAA2D,OAAgD,GAMtD3D,KAAK4D,GAAK,IAAIC,cAAAA,oBAAoBL,MAAAA,EAAAA,EAAU,gBAMhDJ,EAAA/C,UAAAyD,iBAAA,SAAiBC,EAA+BC,GAC5C,IAAIC,EAAMF,EAAME,IAAIC,KAAK,KAEzB,IAAKlE,KAAKsD,GAAGrD,cAAgBD,KAAK0D,mBAAmBd,MAAK,SAAAuB,GAAK,OAAmB,GAAnBF,EAAI9B,QAAQgC,MACvE,OAAOC,QAAQC,SAAQ,GAG3B,IADA,IAAIC,GAAwB,EACnB3D,EAAI,EAAGA,EAAIX,KAAK2D,OAAO/C,OAAQD,IAAK,CACzC,IAAIwD,EAAInE,KAAK2D,OAAOhD,GAEpB,IAA6B,GAAzBsD,EAAI9B,QAAQgC,EAAEJ,OAEd,OADAO,GAAe,EACRtE,KAAKuE,YAAYN,EAAKE,GAIrC,IAAKG,EAAc,CACf,IAAIE,EAAgBxE,KAAK2D,OAAOf,MAAK,SAAAuB,GAAK,MAAW,KAAXA,EAAEJ,SAC5C,GAAIS,EACA,OAAOxE,KAAKuE,YAAYN,EAAKO,GAE7B1D,QAAQ2D,IAAI,8CAAgDR,GAEpE,OAAOG,QAAQC,SAAQ,IAMnBjB,EAAA/C,UAAAkE,YAAA,SAAYG,EAAiBP,GACjC,IAAI5D,EAAWP,KAAKsD,GAAG9C,SAEvB,OAAIR,KAAKsD,GAAGT,IAAIsB,EAAE9B,gBAKVrC,KAAKsD,GAAGrD,aACNM,EAAS2B,OAAkC,GAAzB3B,EAAS2B,MAAMtB,QACjCL,EAAS+B,aAA8C,GAA/B/B,EAAS+B,YAAY1B,QAE5CwD,QAAQC,SAAQ,GAInBM,OAAOC,QAAQhE,OAAS,GAAKZ,KAAKsD,GAAGtC,cACrChB,KAAKqD,WAAWwB,YAAY7E,KAAK4D,GAAGkB,IAAI,+FACjCV,QAAQC,SAAQ,KAGvBrE,KAAK+E,4BACL/E,KAAKuD,OAAOyB,SAAS,CAAChF,KAAKyD,WAAY,CAAEwB,QAASP,OAQpDtB,EAAA/C,UAAA0E,qBAAA,4DA9FbhC,KAAAA,4EAvBQmC,WAAAA,sBAIAnF,4BARAoF,OAAAA,uCAuDuGnC,KAAAA,UAAQ,CAAAC,KAAIC,KAAAA,OAAMC,KAAA,CAACzD,uDCzB/H,SAAA0F,EAAoBC,EAAuCC,EAAyCC,GAAhFvF,KAAAqF,YAAAA,EAAuCrF,KAAAsF,cAAAA,EAAyCtF,KAAAuF,IAAAA,EAV3FvF,KAAAsD,GAAc,KAGdtD,KAAAwF,YAAsB,SAU/BJ,EAAA/E,UAAAoF,SAAA,WACgBzF,KAAKuF,IAAI1C,IAAI7C,KAAKsD,GAAItD,KAAKwF,YAI5BxF,KAAKsF,cAAcI,mBAAmB1F,KAAKqF,aACjDrF,KAAKsF,cAAcK,uDA/B/BC,KAAAA,UAASzC,KAAA,CAAC,CACP0C,SAAU,yEAXaC,KAAAA,mBAAaC,KAAAA,wBAG/BhG,yEAmBJiG,KAAAA,0BAGAA,KAAAA,8BCpBL,gDADCjD,KAAAA,uCCoBG,SAAYkD,EAAyCC,EAAmC5C,EAAqE1D,GAAxGI,KAAAkG,QAAAA,EAAmClG,KAAAsD,GAAAA,EAAqEtD,KAAAJ,cAAAA,GAC5II,KAAKkG,UAAYlG,KAAKkG,QAAQC,OAASnG,KAAKJ,eAAiBI,KAAKsD,GAAGT,IAAI7C,KAAKJ,cAAgB,IAAMI,KAAKkG,QAAQC,OAG1HF,EAAQG,cAAcC,aAAa,UAAW,iDAdzDT,KAAAA,UAASzC,KAAA,CAAC,CACP0C,SAAU,kFAfMS,KAAAA,kBAOXC,iBAAgBC,WAAA,CAAA,CAAAvD,KAiBaD,KAAAA,kBArB7BjD,qDAqB8GiD,KAAAA,UAAQ,CAAAC,KAAIC,KAAAA,OAAMC,KAAA,CAACvD,uDCT1I,SAAA6G,YACSA,EAAAC,QAAP,SAAeC,GACb,MAAO,CACLC,SAAUH,EACVI,UAAW,CACT9G,qBACAqD,wBACA,CAAE0D,QAASpH,WAAYqH,UAAUJ,MAAAA,OAAM,EAANA,EAAQK,SAAU,SACnD,CAAEF,QAASlH,cAAemH,UAAUJ,MAAAA,OAAM,EAANA,EAAQM,YAAa,MACzD,CAAEH,QAASjH,aAAckH,UAAUJ,MAAAA,OAAM,EAANA,EAAQO,mBAAoB,MAC/D,CAAEJ,QAAShH,gBAAiBiH,UAAUJ,MAAAA,OAAM,EAANA,EAAQQ,kCAAmC,oDAfxFC,KAAAA,SAAQjE,KAAA,CAAC,CACRkE,QAAS,CAACC,cAAAA,oBACVC,aAAc,CAACnC,uBAAwBoC,uBACvCC,QAAQ,CAACrC,uBAAwBoC,yDCXnC","sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Token che racchiude il locale scelto per l'applicazione */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');\r\n\r\n/** Token che indica la condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND');\r\n\r\n/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND_OP: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND_OP');","// Angular\r\nimport { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { ACC_DEF_COND, ACC_DEF_COND_OP } from \"./tokens\";\r\n\r\n/**\r\n * Entrypoint di tutte le operazioni esposte dalla libreria access-control\r\n */\r\n@Injectable()\r\nexport class AccessControlService {\r\n\r\n /**\r\n * Indica se l'Identity è stata inizializzata\r\n */\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Indica se sono state effettuate inizializzazioni di Custom Permissions\r\n */\r\n public InitializedCustom: boolean = false;\r\n\r\n /** @ignore */\r\n private cache: {} = {};\r\n\r\n /** @ignore */\r\n private taggedItemsCache: { key: string, items: string[] }[] = [];\r\n\r\n /**\r\n * Identity associata a quest'istanza del Servizio Access Control, utile se si vuole avere accesso a Ruoli e Permessi direttamente da qui, per qualsivoglia motivo\r\n */\r\n public Identity: { Roles: string[], Permissions: string[] };\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(ACC_DEF_COND) private ACC_DEF_COND: string, @Optional() @Inject(ACC_DEF_COND_OP) private ACC_DEF_COND_OP: string,) { }\r\n\r\n /**\r\n * Inizializza l'Identity del servizio con il modello specificato\r\n * \r\n * @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi\r\n */\r\n public initializeIdentity(identity: { Roles: string[], Permissions: string[] }) {\r\n this.Identity = identity;\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Inizializza i permessi Custom del servizio con il modello specificato\r\n * \r\n * @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom\r\n */\r\n public initializeCustomPermissions(customPermissions: { key: string, items: string[] }[]) {\r\n for (let i = 0; i < customPermissions.length; i++) {\r\n if (customPermissions[i].key.length > 1) {\r\n console.error(\"[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.\");\r\n return;\r\n }\r\n }\r\n\r\n this.taggedItemsCache = customPermissions;\r\n this.InitializedCustom = true;\r\n }\r\n\r\n /**\r\n * Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity\r\n */\r\n public isLoggedIn() {\r\n return !!this.Identity;\r\n }\r\n\r\n /**\r\n * Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)\r\n * Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P\r\n * \r\n * @ignore\r\n */\r\n private hasACExpression(expression: string, absolute: boolean = false): boolean {\r\n if (!this.Initialized)\r\n console.error(\"Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service\");\r\n\r\n if (!expression)\r\n return true;\r\n\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n\r\n // Per le espressioni di visibilità \"dirette\" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche\r\n // Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo \"sono Jace Admin\"\r\n if(this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')\r\n expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;\r\n \r\n // Espressione già valutata, non serve rivalutarla\r\n if (this.cache[expression])\r\n return this.cache[expression];\r\n\r\n var RolesPermissionsRegexp = /.:[^|&()]+/g;\r\n\r\n var matches = expression.match(RolesPermissionsRegexp);\r\n \r\n if (!matches)\r\n throw \"Espressione Access Control non valida: \" + expression + \". Assicurarsi che sia scritta in modo corretto\";\r\n\r\n matches.forEach(t => {\r\n var splits = t.split(':');\r\n if (splits[0] == \"R\")\r\n expression = expression.replace(t.trim(), \"this.hasRole('\" + splits[1].trim() + \"')\");\r\n else if (splits[0] == \"P\")\r\n expression = expression.replace(t.trim(), \"this.hasPermission('\" + splits[1].trim() + \"')\");\r\n else\r\n expression = expression.replace(t.trim(), \"this.hasCustom('\" + splits[1].trim() + \"', '\" + splits[0].trim() + \"')\");\r\n });\r\n\r\n var ret = <boolean>eval(expression);\r\n // Cache valore\r\n this.cache[expression] = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasRole(role: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasPermission(permission: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasCustom(value: string, tag: string): boolean {\r\n var items = this.taggedItemsCache.find(t => t.key == tag)?.items;\r\n if (!items)\r\n return true;\r\n else if (items.length == 0)\r\n return false;\r\n else\r\n return !!items.find(t => t == value);\r\n }\r\n\r\n /**\r\n * Entry point che controlla un'espressione identificante un permesso, ad esempio \"P:visualizzazione\" controlla che l'utente collegato abbia un permesso che si chiama \"visualizzazione\"\r\n */\r\n public has(expr: string, absolute: boolean = false) {\r\n return this.hasACExpression(expr, absolute);\r\n }\r\n}","//Angular\r\nimport { ActivatedRouteSnapshot, CanActivateChild, RouterStateSnapshot } from \"@angular/router\";\r\nimport { Injectable, Optional, Inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n//Libs\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n//Models\r\nimport { ACC_LOCALE } from \"./tokens\";\r\nimport { AccessControlService } from './access-control.service';\r\n\r\n/**\r\n * Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe\r\n * che la ereditavalorizzare la variabile Routes con le route permesse dal modulo e il permesso per cui si vuole riservare l'accesso. Ad esempio:\r\n * \r\n * ```typescript\r\n * @Injectable()\r\n * export class HasAuthGuardComponent extends BaseRouterGuard {\r\n * constructor(acc: AccessControlService, router: Router, ms: MessageService, ts: BaseTokenService) {\r\n * super(ms, acc, router, ts);\r\n * this.Routes = [\r\n * { route: \"page_route\", permission: \"P:perm_one\" },\r\n * { route: \"*\", permission: \"R:role_one\" }\r\n * ]\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class AccessControlRouteGuard implements CanActivateChild {\r\n /**\r\n * @ignore\r\n */\r\n private lc: LocalizationService;\r\n\r\n /**\r\n * Route di login che serve per reindirizzare alla pagina di login in caso di fallimento del controllo sui Permessi\r\n * \r\n * @default\r\n */\r\n protected LoginRoute : string = \"login\";\r\n\r\n /**\r\n * Permette di specificare delle Route sempre consentite, anche a livello di \"Radice\". Ad esempio la Root \"test\" permetterà\r\n * l'accesso a tutte le route che anche solo iniziano per \"test\"\r\n */\r\n protected AlwaysAllowedRoots: string[] = [];\r\n \r\n /**\r\n * Lista di Route con la loro espressione di controllo per valutare i permessi\r\n */\r\n protected Routes: { route: any; permission: string; }[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(private msgService : MessageService, private ac: AccessControlService, private router: Router, @Optional() @Inject(ACC_LOCALE) LOCALE: string) {\r\n this.lc = new LocalizationService(LOCALE ?? 'it-IT');\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n canActivateChild(route: ActivatedRouteSnapshot, _: RouterStateSnapshot): Promise<boolean> {\r\n var url = route.url.join('/');\r\n //Se l'applicazione non è pronta e non sto navigando nelle pagine consentite\r\n if (!this.ac.Initialized && !this.AlwaysAllowedRoots.find(r => url.indexOf(r) != -1))\r\n return Promise.resolve(false);\r\n \r\n var routeMatched: boolean = false;\r\n for (let i = 0; i < this.Routes.length; i++) {\r\n let r = this.Routes[i];\r\n //Se faccio match con la route significa che ho navigato in una delle route conosciute, altrimenti avverto ma lascio andare\r\n if (url.indexOf(r.route) != -1) {\r\n routeMatched = true;\r\n return this.handleMatch(url, r);\r\n }\r\n }\r\n //Se non faccio nessun match ma ho una route wildcard (*) prendo quella e controllo su quella\r\n if (!routeMatched) {\r\n var wildcardRoute = this.Routes.find(r => r.route == \"*\");\r\n if (wildcardRoute)\r\n return this.handleMatch(url, wildcardRoute);\r\n else\r\n console.log(\"Navigaizone avvenuta su route sconosciuta: \" + url);\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private handleMatch(fromurl: string, r: any) {\r\n let identity = this.ac.Identity;\r\n\r\n if (this.ac.has(r.permission) ||\r\n (\r\n // Considero anche la possibilità di avere l'access control inizializzato ma che l'account scope non sia ancora presente\r\n // in questo caso suppongo sia un hard refresh e mi fido del fatto che l'utente possa entrarci\r\n // TODO: Fixare meglio concatenando una promise che va a prendere l'account scope se serve\r\n this.ac.Initialized &&\r\n (!identity.Roles || identity.Roles.length == 0) &&\r\n (!identity.Permissions || identity.Permissions.length == 0)\r\n ))\r\n return Promise.resolve(true);\r\n else {\r\n //Se sono nel sito originale (non ho aperto un newtab) blocco la navigazione\r\n //Se ho aperto una nuova tab invece rispedisco al login\r\n if (window.history.length > 2 && this.ac.isLoggedIn()) {\r\n this.msgService.simpleError(this.lc.loc(\"You don't have the required permissions to view this page. The navigation has been blocked\"));\r\n return Promise.resolve(false);\r\n }\r\n else {\r\n this.onRedirectInProgress();\r\n this.router.navigate([this.LoginRoute, { fromUrl: fromurl }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Callback che viene eseguito prima che la Guard reindirizzi al login\r\n */\r\n protected onRedirectInProgress() {\r\n }\r\n}","// Angular\r\nimport { Directive, Input, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\n\r\n/**\r\n * Direttiva che permette di gestire il controllo accessi su componenti HTML. \r\n * \r\n * Per gli esempi di utilizzo fare riferimento al README.\r\n */\r\n@Directive({\r\n selector: '[ac]',\r\n})\r\nexport class AccessControlDirective {\r\n \r\n /** \r\n * Espressione da processare scritta come {Chiave}:{Valore}\r\n * \r\n * Le {Chiave} disponibili sono di default \"R\" per i ruoli e \"P\" per i permessi. È possibile espanderle con le Custom Permissions.\r\n * \r\n * Nelle ultime versioni del template è anche presente di default la custom permission \"X\" che indica se l'applicaizone è Esterna o no\r\n */\r\n @Input() ac : string = null;\r\n\r\n /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */\r\n @Input() acAbsolute: boolean = false;\r\n\r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef, private _ac: AccessControlService) { }\r\n\r\n\r\n ngOnInit(){\r\n var allow = this._ac.has(this.ac, this.acAbsolute);\r\n\r\n //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template\r\n\r\n if (allow) this.viewContainer.createEmbeddedView(this.templateRef);\r\n else this.viewContainer.clear();\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Token da iniettare per ogni singolo componente per cui si vuole disattivare/attivare massivamente degli input in maniera contestuale\r\n */\r\n@Injectable()\r\nexport class ComponentContext{\r\n /**\r\n * Nome del Contesto assegnato al Componente\r\n */\r\n name : string;\r\n}","// Angular\r\nimport { Directive, ElementRef, Optional, Inject } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\nimport { ACC_CUSTOMKEY } from \"./tokens\"\r\n\r\n// Classi\r\nimport { ComponentContext } from \"./models/ComponentContext\";\r\n\r\n/**\r\n * Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.\r\n * \r\n * Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext\r\n */\r\n@Directive({\r\n selector: '[contextAware]',\r\n})\r\nexport class ContextAwareDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(element: ElementRef, @Optional() private context: ComponentContext, private ac: AccessControlService, @Optional() @Inject(ACC_CUSTOMKEY) private ACC_CUSTOMKEY: string) {\r\n var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + \":\" + this.context.name,);\r\n\r\n if (!allow)\r\n element.nativeElement.setAttribute(\"enabled\", \"true\");\r\n }\r\n}","import { LocalizationModule } from '@esfaenza/localizations';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\n\r\nimport { ACC_LOCALE, ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP } from './tokens';\r\n\r\nimport { AccessControlModuleConfig } from './models/AccessControlModuleConfig';\r\nimport { AccessControlService } from './access-control.service';\r\nimport { AccessControlRouteGuard } from './AccessControlRouteGuard';\r\nimport { AccessControlDirective } from './access-control.directive';\r\nimport { ContextAwareDirective } from './context-aware.directive';\r\n\r\n@NgModule({\r\n imports: [LocalizationModule],\r\n declarations: [AccessControlDirective, ContextAwareDirective],\r\n exports:[AccessControlDirective, ContextAwareDirective]\r\n})\r\nexport class AccessControlModule {\r\n static forRoot(config?: AccessControlModuleConfig): ModuleWithProviders<AccessControlModule> {\r\n return {\r\n ngModule: AccessControlModule,\r\n providers: [\r\n AccessControlService,\r\n AccessControlRouteGuard,\r\n { provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },\r\n { provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },\r\n { provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },\r\n { provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'\r\n */\r\nexport class AccessControlModuleConfig {\r\n\r\n /**\r\n * locale dell'applicazione in forma standard, ad esempio \"it-IT\", \"en-US\", etc...\r\n * \r\n * Attualmente si supportano solo le lingue Italiano e Inglese\r\n */\r\n locale: string;\r\n\r\n /** Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno */\r\n customKey: string;\r\n\r\n /** Condizione di default da aggiungere a ogni condizione utente. Es: 'R:Jace Admin' */\r\n defaultCondition?: string;\r\n\r\n /** Relazione logica fra la condizione di default e la condizione utente. Es: '||'. Di default viene utilizzato l'OR logico */\r\n defaultConditionLogicalOperator?: string;\r\n}"]}
@@ -1 +1 @@
1
- {"__symbolic":"module","version":4,"metadata":{"AccessControlModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":11,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@esfaenza/localizations","name":"LocalizationModule","line":12,"character":12}],"declarations":[{"__symbolic":"reference","name":"AccessControlDirective"},{"__symbolic":"reference","name":"ɵa"}],"exports":[{"__symbolic":"reference","name":"AccessControlDirective"},{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{},"statics":{"forRoot":{"__symbolic":"function","parameters":["config"],"value":{"ngModule":{"__symbolic":"reference","name":"AccessControlModule"},"providers":[{"__symbolic":"reference","name":"AccessControlService"},{"__symbolic":"reference","name":"AccessControlRouteGuard"},{"provide":{"__symbolic":"reference","name":"ACC_LOCALE"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"locale"},"right":"it-IT"}},{"provide":{"__symbolic":"reference","name":"ACC_CUSTOMKEY"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"customKey"},"right":null}},{"provide":{"__symbolic":"reference","name":"ACC_DEF_COND"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"defaultCondition"},"right":null}},{"provide":{"__symbolic":"reference","name":"ACC_DEF_COND_OP"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"defaultConditionLogicalOperator"},"right":"||"}}]}}}},"AccessControlService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":7,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":32,"character":15}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":32,"character":27},"arguments":[{"__symbolic":"reference","name":"ACC_DEF_COND"}]}],[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":32,"character":79}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":32,"character":91},"arguments":[{"__symbolic":"reference","name":"ACC_DEF_COND_OP"}]}]],"parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"initializeIdentity":[{"__symbolic":"method"}],"initializeCustomPermissions":[{"__symbolic":"method"}],"isLoggedIn":[{"__symbolic":"method"}],"hasACExpression":[{"__symbolic":"method"}],"hasRole":[{"__symbolic":"method"}],"hasPermission":[{"__symbolic":"method"}],"hasCustom":[{"__symbolic":"method"}],"has":[{"__symbolic":"method"}]}},"AccessControlDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":11,"character":1},"arguments":[{"selector":"[ac]"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"TemplateRef","module":"@angular/core","arguments":[{"__symbolic":"reference","name":"any"}]},{"__symbolic":"reference","module":"@angular/core","name":"ViewContainerRef","line":21,"character":78},{"__symbolic":"reference","name":"AccessControlService"}]}],"ac":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":30,"character":5}}]}]}},"AccessControlModuleConfig":{"__symbolic":"class","members":{}},"AccessControlRouteGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":30,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":58,"character":112}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":58,"character":124},"arguments":[{"__symbolic":"reference","name":"ACC_LOCALE"}]}]],"parameters":[{"__symbolic":"reference","module":"@esfaenza/extensions","name":"MessageService","line":58,"character":37},{"__symbolic":"reference","name":"AccessControlService"},{"__symbolic":"reference","module":"@angular/router","name":"Router","line":58,"character":103},{"__symbolic":"reference","name":"string"}]}],"canActivateChild":[{"__symbolic":"method"}],"handleMatch":[{"__symbolic":"method"}],"onRedirectInProgress":[{"__symbolic":"method"}]}},"ACC_LOCALE":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":3,"character":54},"arguments":["ACC_LOCALE"]},"ACC_CUSTOMKEY":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":6,"character":57},"arguments":["ACC_CUSTOMKEY"]},"ACC_DEF_COND":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":9,"character":56},"arguments":["ACC_DEF_COND"]},"ACC_DEF_COND_OP":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":12,"character":59},"arguments":["ACC_DEF_COND_OP"]},"ComponentContext":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":5,"character":1}}],"members":{}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":15,"character":1},"arguments":[{"selector":"[contextAware]"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":25,"character":38}}],null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":25,"character":119}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":25,"character":131},"arguments":[{"__symbolic":"reference","name":"ACC_CUSTOMKEY"}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":25,"character":25},{"__symbolic":"reference","name":"ComponentContext"},{"__symbolic":"reference","name":"AccessControlService"},{"__symbolic":"reference","name":"string"}]}]}}},"origins":{"AccessControlModule":"./lib/access-control.module","AccessControlService":"./lib/access-control.service","AccessControlDirective":"./lib/access-control.directive","AccessControlModuleConfig":"./lib/models/AccessControlModuleConfig","AccessControlRouteGuard":"./lib/AccessControlRouteGuard","ACC_LOCALE":"./lib/tokens","ACC_CUSTOMKEY":"./lib/tokens","ACC_DEF_COND":"./lib/tokens","ACC_DEF_COND_OP":"./lib/tokens","ComponentContext":"./lib/models/ComponentContext","ɵa":"./lib/context-aware.directive"},"importAs":"@esfaenza/access-control"}
1
+ {"__symbolic":"module","version":4,"metadata":{"AccessControlModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":11,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@esfaenza/localizations","name":"LocalizationModule","line":12,"character":12}],"declarations":[{"__symbolic":"reference","name":"AccessControlDirective"},{"__symbolic":"reference","name":"ɵa"}],"exports":[{"__symbolic":"reference","name":"AccessControlDirective"},{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{},"statics":{"forRoot":{"__symbolic":"function","parameters":["config"],"value":{"ngModule":{"__symbolic":"reference","name":"AccessControlModule"},"providers":[{"__symbolic":"reference","name":"AccessControlService"},{"__symbolic":"reference","name":"AccessControlRouteGuard"},{"provide":{"__symbolic":"reference","name":"ACC_LOCALE"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"locale"},"right":"it-IT"}},{"provide":{"__symbolic":"reference","name":"ACC_CUSTOMKEY"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"customKey"},"right":null}},{"provide":{"__symbolic":"reference","name":"ACC_DEF_COND"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"defaultCondition"},"right":null}},{"provide":{"__symbolic":"reference","name":"ACC_DEF_COND_OP"},"useValue":{"__symbolic":"binop","operator":"||","left":{"__symbolic":"select","expression":{"__symbolic":"reference","name":"config"},"member":"defaultConditionLogicalOperator"},"right":"||"}}]}}}},"AccessControlService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":7,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":32,"character":15}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":32,"character":27},"arguments":[{"__symbolic":"reference","name":"ACC_DEF_COND"}]}],[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":32,"character":79}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":32,"character":91},"arguments":[{"__symbolic":"reference","name":"ACC_DEF_COND_OP"}]}]],"parameters":[{"__symbolic":"reference","name":"string"},{"__symbolic":"reference","name":"string"}]}],"initializeIdentity":[{"__symbolic":"method"}],"initializeCustomPermissions":[{"__symbolic":"method"}],"isLoggedIn":[{"__symbolic":"method"}],"hasACExpression":[{"__symbolic":"method"}],"hasRole":[{"__symbolic":"method"}],"hasPermission":[{"__symbolic":"method"}],"hasCustom":[{"__symbolic":"method"}],"has":[{"__symbolic":"method"}]}},"AccessControlDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":11,"character":1},"arguments":[{"selector":"[ac]"}]}],"members":{"ac":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":23,"character":5}}]}],"acAbsolute":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":26,"character":5}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"TemplateRef","module":"@angular/core","arguments":[{"__symbolic":"reference","name":"any"}]},{"__symbolic":"reference","module":"@angular/core","name":"ViewContainerRef","line":33,"character":78},{"__symbolic":"reference","name":"AccessControlService"}]}],"ngOnInit":[{"__symbolic":"method"}]}},"AccessControlModuleConfig":{"__symbolic":"class","members":{}},"AccessControlRouteGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":30,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":58,"character":112}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":58,"character":124},"arguments":[{"__symbolic":"reference","name":"ACC_LOCALE"}]}]],"parameters":[{"__symbolic":"reference","module":"@esfaenza/extensions","name":"MessageService","line":58,"character":37},{"__symbolic":"reference","name":"AccessControlService"},{"__symbolic":"reference","module":"@angular/router","name":"Router","line":58,"character":103},{"__symbolic":"reference","name":"string"}]}],"canActivateChild":[{"__symbolic":"method"}],"handleMatch":[{"__symbolic":"method"}],"onRedirectInProgress":[{"__symbolic":"method"}]}},"ACC_LOCALE":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":3,"character":54},"arguments":["ACC_LOCALE"]},"ACC_CUSTOMKEY":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":6,"character":57},"arguments":["ACC_CUSTOMKEY"]},"ACC_DEF_COND":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":9,"character":56},"arguments":["ACC_DEF_COND"]},"ACC_DEF_COND_OP":{"__symbolic":"new","expression":{"__symbolic":"reference","module":"@angular/core","name":"InjectionToken","line":12,"character":59},"arguments":["ACC_DEF_COND_OP"]},"ComponentContext":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":5,"character":1}}],"members":{}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":15,"character":1},"arguments":[{"selector":"[contextAware]"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":25,"character":38}}],null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":25,"character":119}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":25,"character":131},"arguments":[{"__symbolic":"reference","name":"ACC_CUSTOMKEY"}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":25,"character":25},{"__symbolic":"reference","name":"ComponentContext"},{"__symbolic":"reference","name":"AccessControlService"},{"__symbolic":"reference","name":"string"}]}]}}},"origins":{"AccessControlModule":"./lib/access-control.module","AccessControlService":"./lib/access-control.service","AccessControlDirective":"./lib/access-control.directive","AccessControlModuleConfig":"./lib/models/AccessControlModuleConfig","AccessControlRouteGuard":"./lib/AccessControlRouteGuard","ACC_LOCALE":"./lib/tokens","ACC_CUSTOMKEY":"./lib/tokens","ACC_DEF_COND":"./lib/tokens","ACC_DEF_COND_OP":"./lib/tokens","ComponentContext":"./lib/models/ComponentContext","ɵa":"./lib/context-aware.directive"},"importAs":"@esfaenza/access-control"}
@@ -17,16 +17,19 @@ export class AccessControlDirective {
17
17
  this.templateRef = templateRef;
18
18
  this.viewContainer = viewContainer;
19
19
  this._ac = _ac;
20
+ /**
21
+ * Espressione da processare scritta come {Chiave}:{Valore}
22
+ *
23
+ * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions.
24
+ *
25
+ * Nelle ultime versioni del template è anche presente di default la custom permission "X" che indica se l'applicaizone è Esterna o no
26
+ */
27
+ this.ac = null;
28
+ /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */
29
+ this.acAbsolute = false;
20
30
  }
21
- /**
22
- * Input autoreferenziale per la direttiva
23
- *
24
- * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}
25
- *
26
- * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions
27
- */
28
- set ac(expression) {
29
- var allow = this._ac.has(expression);
31
+ ngOnInit() {
32
+ var allow = this._ac.has(this.ac, this.acAbsolute);
30
33
  //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template
31
34
  if (allow)
32
35
  this.viewContainer.createEmbeddedView(this.templateRef);
@@ -45,6 +48,7 @@ AccessControlDirective.ctorParameters = () => [
45
48
  { type: AccessControlService }
46
49
  ];
47
50
  AccessControlDirective.propDecorators = {
48
- ac: [{ type: Input }]
51
+ ac: [{ type: Input }],
52
+ acAbsolute: [{ type: Input }]
49
53
  };
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNjZXNzLWNvbnRyb2wvc3JjL2xpYi9hY2Nlc3MtY29udHJvbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFaEU7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxzQkFBc0I7SUFFL0I7Ozs7T0FJRztJQUNILFlBQW9CLFdBQTZCLEVBQVUsYUFBK0IsRUFBVSxHQUF5QjtRQUF6RyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFzQjtJQUFJLENBQUM7SUFFbEk7Ozs7OztPQU1HO0lBQ0gsSUFBYSxFQUFFLENBQUMsVUFBa0I7UUFDOUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFckMscUZBQXFGO1FBRXJGLElBQUksS0FBSztZQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDOztZQUM5RCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3BDLENBQUM7OztZQTFCSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLE1BQU07YUFDbkI7OztZQVowQixXQUFXO1lBQUUsZ0JBQWdCO1lBRy9DLG9CQUFvQjs7O2lCQTBCeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gQ29uZmlndXJhemlvbmlcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tIFwiLi9hY2Nlc3MtY29udHJvbC5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogRGlyZXR0aXZhIGNoZSBwZXJtZXR0ZSBkaSBnZXN0aXJlIGlsIGNvbnRyb2xsbyBhY2Nlc3NpIHN1IGNvbXBvbmVudGkgSFRNTC4gXHJcbiAqIFxyXG4gKiBQZXIgZ2xpIGVzZW1waSBkaSB1dGlsaXp6byBmYXJlIHJpZmVyaW1lbnRvIGFsIFJFQURNRS5cclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbYWNdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFjY2Vzc0NvbnRyb2xEaXJlY3RpdmUge1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvc3RydXR0b3JlIFxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBfYWM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElucHV0IGF1dG9yZWZlcmVuemlhbGUgcGVyIGxhIGRpcmV0dGl2YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiAgZXNwcmVzc2lvbmUgZGEgcHJvY2Vzc2FyZSBzY3JpdHRhIGNvbWUge0NoaWF2ZX06e1ZhbG9yZX1cclxuICAgICAqIFxyXG4gICAgICogTGUge0NoaWF2ZX0gZGlzcG9uaWJpbGkgc29ubyBkaSBkZWZhdWx0IFwiUlwiIHBlciBpIHJ1b2xpIGUgXCJQXCIgcGVyIGkgcGVybWVzc2kuIMOIIHBvc3NpYmlsZSBlc3BhbmRlcmxlIGNvbiBsZSBDdXN0b20gUGVybWlzc2lvbnNcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgc2V0IGFjKGV4cHJlc3Npb246IHN0cmluZykge1xyXG4gICAgICAgIHZhciBhbGxvdyA9IHRoaXMuX2FjLmhhcyhleHByZXNzaW9uKTtcclxuXHJcbiAgICAgICAgLy9TZSBobyBpIHBlcm1lc3NpLCBwcm9zZWd1byBjcmVhbmRvIGxhIHZpc3RhIG5lbCBET00sIGFsdHJpbWVudGkgcmltdW92byBpbCB0ZW1wbGF0ZVxyXG5cclxuICAgICAgICBpZiAoYWxsb3cpIHRoaXMudmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy50ZW1wbGF0ZVJlZik7XHJcbiAgICAgICAgZWxzZSB0aGlzLnZpZXdDb250YWluZXIuY2xlYXIoKTtcclxuICAgIH1cclxufSJdfQ==
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNjZXNzLWNvbnRyb2wvc3JjL2xpYi9hY2Nlc3MtY29udHJvbC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsVUFBVTtBQUNWLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRixpQkFBaUI7QUFDakIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFaEU7Ozs7R0FJRztBQUlILE1BQU0sT0FBTyxzQkFBc0I7SUFjL0I7Ozs7T0FJRztJQUNILFlBQW9CLFdBQTZCLEVBQVUsYUFBK0IsRUFBVSxHQUF5QjtRQUF6RyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFzQjtRQWpCN0g7Ozs7OztXQU1HO1FBQ00sT0FBRSxHQUFZLElBQUksQ0FBQztRQUU1QixtSkFBbUo7UUFDMUksZUFBVSxHQUFZLEtBQUssQ0FBQztJQU80RixDQUFDO0lBR2xJLFFBQVE7UUFDSixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVuRCxxRkFBcUY7UUFFckYsSUFBSSxLQUFLO1lBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7O1lBQzlELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEMsQ0FBQzs7O1lBaENKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsTUFBTTthQUNuQjs7O1lBWjBCLFdBQVc7WUFBRSxnQkFBZ0I7WUFHL0Msb0JBQW9COzs7aUJBbUJ4QixLQUFLO3lCQUdMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlIH0gZnJvbSBcIi4vYWNjZXNzLWNvbnRyb2wuc2VydmljZVwiO1xyXG5cclxuLyoqXHJcbiAqIERpcmV0dGl2YSBjaGUgcGVybWV0dGUgZGkgZ2VzdGlyZSBpbCBjb250cm9sbG8gYWNjZXNzaSBzdSBjb21wb25lbnRpIEhUTUwuIFxyXG4gKiBcclxuICogUGVyIGdsaSBlc2VtcGkgZGkgdXRpbGl6em8gZmFyZSByaWZlcmltZW50byBhbCBSRUFETUUuXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW2FjXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY2Nlc3NDb250cm9sRGlyZWN0aXZlIHtcclxuICAgIFxyXG4gICAgLyoqIFxyXG4gICAgICogRXNwcmVzc2lvbmUgZGEgcHJvY2Vzc2FyZSBzY3JpdHRhIGNvbWUge0NoaWF2ZX06e1ZhbG9yZX1cclxuICAgICAqIFxyXG4gICAgICogTGUge0NoaWF2ZX0gZGlzcG9uaWJpbGkgc29ubyBkaSBkZWZhdWx0IFwiUlwiIHBlciBpIHJ1b2xpIGUgXCJQXCIgcGVyIGkgcGVybWVzc2kuIMOIIHBvc3NpYmlsZSBlc3BhbmRlcmxlIGNvbiBsZSBDdXN0b20gUGVybWlzc2lvbnMuXHJcbiAgICAgKiBcclxuICAgICAqIE5lbGxlIHVsdGltZSB2ZXJzaW9uaSBkZWwgdGVtcGxhdGUgw6ggYW5jaGUgcHJlc2VudGUgZGkgZGVmYXVsdCBsYSBjdXN0b20gcGVybWlzc2lvbiBcIlhcIiBjaGUgaW5kaWNhIHNlIGwnYXBwbGljYWl6b25lIMOoIEVzdGVybmEgbyBub1xyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBhYyA6IHN0cmluZyA9IG51bGw7XHJcblxyXG4gICAgLyoqIEluZGljYSBjaGUgbCdlc3BvcmVzc2lvbmUgKiphYyoqIMOoIGFzc29sdXRhLCBjaW/DqCBjaGUgbm9uIHB1w7IgZXNzZXJlIG1vZGlmaWNhdGEgaW50ZXJuYW1lbnRlIGFkIGVzZW1waW8gcGVyIGFnZ2l1bmdlcmUgY29uZGl6aW9uaSBkaSBkZWZhdWx0ICovXHJcbiAgICBASW5wdXQoKSBhY0Fic29sdXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb3N0cnV0dG9yZSBcclxuICAgICAqIFxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCBwcml2YXRlIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgX2FjOiBBY2Nlc3NDb250cm9sU2VydmljZSkgeyB9XHJcblxyXG5cclxuICAgIG5nT25Jbml0KCl7XHJcbiAgICAgICAgdmFyIGFsbG93ID0gdGhpcy5fYWMuaGFzKHRoaXMuYWMsIHRoaXMuYWNBYnNvbHV0ZSk7XHJcblxyXG4gICAgICAgIC8vU2UgaG8gaSBwZXJtZXNzaSwgcHJvc2VndW8gY3JlYW5kbyBsYSB2aXN0YSBuZWwgRE9NLCBhbHRyaW1lbnRpIHJpbXVvdm8gaWwgdGVtcGxhdGVcclxuXHJcbiAgICAgICAgaWYgKGFsbG93KSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMudGVtcGxhdGVSZWYpO1xyXG4gICAgICAgIGVsc2UgdGhpcy52aWV3Q29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG59Il19
@@ -58,7 +58,7 @@ export class AccessControlService {
58
58
  *
59
59
  * @ignore
60
60
  */
61
- hasACExpression(expression) {
61
+ hasACExpression(expression, absolute = false) {
62
62
  if (!this.Initialized)
63
63
  console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
64
64
  if (!expression)
@@ -67,9 +67,11 @@ export class AccessControlService {
67
67
  console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
68
68
  return true;
69
69
  }
70
- if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP)
70
+ // Per le espressioni di visibilità "dirette" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche
71
+ // Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo "sono Jace Admin"
72
+ if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')
71
73
  expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;
72
- //Espressione già valutata, non serve rivalutarla
74
+ // Espressione già valutata, non serve rivalutarla
73
75
  if (this.cache[expression])
74
76
  return this.cache[expression];
75
77
  var RolesPermissionsRegexp = /.:[^|&()]+/g;
@@ -91,7 +93,7 @@ export class AccessControlService {
91
93
  return ret;
92
94
  }
93
95
  /**
94
- * Utilizzato da hasACExpression
96
+ * Utilizzato da hasACExpression dentro eval
95
97
  *
96
98
  * @ignore
97
99
  */
@@ -103,7 +105,7 @@ export class AccessControlService {
103
105
  return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
104
106
  }
105
107
  /**
106
- * Utilizzato da hasACExpression
108
+ * Utilizzato da hasACExpression dentro eval
107
109
  *
108
110
  * @ignore
109
111
  */
@@ -115,7 +117,7 @@ export class AccessControlService {
115
117
  return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
116
118
  }
117
119
  /**
118
- * Utilizzato da hasACExpression
120
+ * Utilizzato da hasACExpression dentro eval
119
121
  *
120
122
  * @ignore
121
123
  */
@@ -132,8 +134,8 @@ export class AccessControlService {
132
134
  /**
133
135
  * Entry point che controlla un'espressione identificante un permesso, ad esempio "P:visualizzazione" controlla che l'utente collegato abbia un permesso che si chiama "visualizzazione"
134
136
  */
135
- has(expr) {
136
- return this.hasACExpression(expr);
137
+ has(expr, absolute = false) {
138
+ return this.hasACExpression(expr, absolute);
137
139
  }
138
140
  }
139
141
  AccessControlService.decorators = [
@@ -143,4 +145,4 @@ AccessControlService.ctorParameters = () => [
143
145
  { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ACC_DEF_COND,] }] },
144
146
  { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ACC_DEF_COND_OP,] }] }
145
147
  ];
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FjY2Vzcy1jb250cm9sL3NyYy9saWIvYWNjZXNzLWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpEOztHQUVHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQXVCL0IsY0FBYztJQUNkLFlBQXNELFlBQW9CLEVBQStDLGVBQXVCO1FBQTFGLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQStDLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBdEJoSjs7V0FFRztRQUNJLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRXBDOztXQUVHO1FBQ0ksc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRTFDLGNBQWM7UUFDTixVQUFLLEdBQU8sRUFBRSxDQUFDO1FBRXZCLGNBQWM7UUFDTixxQkFBZ0IsR0FBdUMsRUFBRSxDQUFDO0lBUW1GLENBQUM7SUFFdEo7Ozs7T0FJRztJQUNJLGtCQUFrQixDQUFDLFFBQW9EO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMkJBQTJCLENBQUMsaUJBQXFEO1FBQ3RGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkMs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QVU7Ozt5Q0F5QkksUUFBUSxZQUFJLE1BQU0sU0FBQyxZQUFZO3lDQUFpQyxRQUFRLFlBQUksTUFBTSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBQ0NfREVGX0NPTkQsIEFDQ19ERUZfQ09ORF9PUCB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5cclxuLyoqXHJcbiAqIEVudHJ5cG9pbnQgZGkgdHV0dGUgbGUgb3BlcmF6aW9uaSBlc3Bvc3RlIGRhbGxhIGxpYnJlcmlhIGFjY2Vzcy1jb250cm9sXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBY2Nlc3NDb250cm9sU2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzZSBsJ0lkZW50aXR5IMOoIHN0YXRhIGluaXppYWxpenphdGFcclxuICAgKi9cclxuICBwdWJsaWMgSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhIHNlIHNvbm8gc3RhdGUgZWZmZXR0dWF0ZSBpbml6aWFsaXp6YXppb25pIGRpIEN1c3RvbSBQZXJtaXNzaW9uc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBJbml0aWFsaXplZEN1c3RvbTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY2FjaGU6IHt9ID0ge307XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSB0YWdnZWRJdGVtc0NhY2hlOiB7IGtleTogc3RyaW5nLCBpdGVtczogc3RyaW5nW10gfVtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIElkZW50aXR5IGFzc29jaWF0YSBhIHF1ZXN0J2lzdGFuemEgZGVsIFNlcnZpemlvIEFjY2VzcyBDb250cm9sLCB1dGlsZSBzZSBzaSB2dW9sZSBhdmVyZSBhY2Nlc3NvIGEgUnVvbGkgZSBQZXJtZXNzaSBkaXJldHRhbWVudGUgZGEgcXVpLCBwZXIgcXVhbHNpdm9nbGlhIG1vdGl2b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBJZGVudGl0eTogeyBSb2xlczogc3RyaW5nW10sIFBlcm1pc3Npb25zOiBzdHJpbmdbXSB9O1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoQUNDX0RFRl9DT05EKSBwcml2YXRlIEFDQ19ERUZfQ09ORDogc3RyaW5nLCBAT3B0aW9uYWwoKSBASW5qZWN0KEFDQ19ERUZfQ09ORF9PUCkgcHJpdmF0ZSBBQ0NfREVGX0NPTkRfT1A6IHN0cmluZywpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml6aWFsaXp6YSBsJ0lkZW50aXR5IGRlbCBzZXJ2aXppbyBjb24gaWwgbW9kZWxsbyBzcGVjaWZpY2F0b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbXMge3sgUm9sZXM6IHN0cmluZ1tdLCBQZXJtaXNzaW9uczogc3RyaW5nW10gfX0gaWRlbnRpdHkgSWRlbnRpdMOgIGFwcGxpY2F0aXZhIGNvbiBydW9saSBlIHBlcm1lc3NpXHJcbiAgICovXHJcbiAgcHVibGljIGluaXRpYWxpemVJZGVudGl0eShpZGVudGl0eTogeyBSb2xlczogc3RyaW5nW10sIFBlcm1pc3Npb25zOiBzdHJpbmdbXSB9KSB7XHJcbiAgICB0aGlzLklkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICB0aGlzLkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXppYWxpenphIGkgcGVybWVzc2kgQ3VzdG9tIGRlbCBzZXJ2aXppbyBjb24gaWwgbW9kZWxsbyBzcGVjaWZpY2F0b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7eyBrZXk6IHN0cmluZywgaXRlbXM6IHN0cmluZ1tdIH1bXX0gY3VzdG9tUGVybWlzc2lvbnMgUGVybWVzc2kgQ3VzdG9tXHJcbiAgICovXHJcbiAgcHVibGljIGluaXRpYWxpemVDdXN0b21QZXJtaXNzaW9ucyhjdXN0b21QZXJtaXNzaW9uczogeyBrZXk6IHN0cmluZywgaXRlbXM6IHN0cmluZ1tdIH1bXSkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXN0b21QZXJtaXNzaW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoY3VzdG9tUGVybWlzc2lvbnNbaV0ua2V5Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0Blc2ZhZW56YS9hY2Nlc3MtY29udHJvbF0gQ3VzdG9tIHBlcm1pc3Npb24gaW5pdGlhbGl6ZWQgd2l0aCBrZXlzIGxvbmdlciB0aGFuIGEgc2luZ2xlIGNoYXJhY3RlcnMuIElnbm9yaW5nIEVWRVJZVEhJTkcuXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnZ2VkSXRlbXNDYWNoZSA9IGN1c3RvbVBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy5Jbml0aWFsaXplZEN1c3RvbSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2UgbmVsbGEgc2Vzc2lvbmUgYXR0dWFsZSBlc2lzdGUgdW4gdXRlbnRlIGxvZ2dhdG8uIEZhIHVuIHNlbXBsaWNlIGNvbnRyb2xsbyBkaSBwcmVzZW56YSBzdWxsJ0lkZW50aXR5XHJcbiAgICovXHJcbiAgcHVibGljIGlzTG9nZ2VkSW4oKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLklkZW50aXR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwcmVzc2lvbiDDqCBzY3JpdHRhIHRpcG8gLS0+IFI6Um9sZTEgJiYgUDpQZXJtaXNzaW9uMSB8fCAoUjpSb2xlMiAmJiBQOlBlcm1pc3Npb24xKVxyXG4gICAqIFF1aW5kaSBwaXV0dG9zdG8gY2hlIGltcGxlbWVudGFyc2kgdW4gcGFyc2VyIGRlbGxhIG1hZG9ubmEgaW4gc3RpbGUgQWxlc3NhbmRybyBwcmVuZG8gbGEgc3RyYWRhIHN0cm9uemEgZSB2ZWxvY2UgY29uIGwnZXZhbCA6UFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0FDRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5Jbml0aWFsaXplZClcclxuICAgICAgY29uc29sZS5lcnJvcihcIkFjY2VzcyBDb250cm9sIFN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENhbGwgdGhpcy5hY2Nlc3NDb250cm9sLmluaXRpYWxpemUoLi4uLCAuLi4pIGJlZm9yZSB1c2luZyB0aGUgc2VydmljZVwiKTtcclxuXHJcbiAgICBpZiAoIWV4cHJlc3Npb24pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5BQ0NfREVGX0NPTkQgJiYgdGhpcy5BQ0NfREVGX0NPTkRfT1ApXHJcbiAgICAgIGV4cHJlc3Npb24gPSBgKCR7ZXhwcmVzc2lvbn0pICR7dGhpcy5BQ0NfREVGX0NPTkRfT1B9ICR7dGhpcy5BQ0NfREVGX0NPTkR9YDtcclxuICAgICAgXHJcbiAgICAvL0VzcHJlc3Npb25lIGdpw6AgdmFsdXRhdGEsIG5vbiBzZXJ2ZSByaXZhbHV0YXJsYVxyXG4gICAgaWYgKHRoaXMuY2FjaGVbZXhwcmVzc2lvbl0pXHJcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW2V4cHJlc3Npb25dO1xyXG5cclxuICAgIHZhciBSb2xlc1Blcm1pc3Npb25zUmVnZXhwID0gLy46W158JigpXSsvZztcclxuXHJcbiAgICB2YXIgbWF0Y2hlcyA9IGV4cHJlc3Npb24ubWF0Y2goUm9sZXNQZXJtaXNzaW9uc1JlZ2V4cCk7XHJcbiAgICBcclxuICAgIGlmICghbWF0Y2hlcylcclxuICAgICAgdGhyb3cgXCJFc3ByZXNzaW9uZSBBY2Nlc3MgQ29udHJvbCBub24gdmFsaWRhOiBcIiArIGV4cHJlc3Npb24gKyBcIi4gQXNzaWN1cmFyc2kgY2hlIHNpYSBzY3JpdHRhIGluIG1vZG8gY29ycmV0dG9cIjtcclxuXHJcbiAgICBtYXRjaGVzLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBzcGxpdHMgPSB0LnNwbGl0KCc6Jyk7XHJcbiAgICAgIGlmIChzcGxpdHNbMF0gPT0gXCJSXCIpXHJcbiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgXCJ0aGlzLmhhc1JvbGUoJ1wiICsgc3BsaXRzWzFdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICAgIGVsc2UgaWYgKHNwbGl0c1swXSA9PSBcIlBcIilcclxuICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKHQudHJpbSgpLCBcInRoaXMuaGFzUGVybWlzc2lvbignXCIgKyBzcGxpdHNbMV0udHJpbSgpICsgXCInKVwiKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UodC50cmltKCksIFwidGhpcy5oYXNDdXN0b20oJ1wiICsgc3BsaXRzWzFdLnRyaW0oKSArIFwiJywgJ1wiICsgc3BsaXRzWzBdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgcmV0ID0gPGJvb2xlYW4+ZXZhbChleHByZXNzaW9uKTtcclxuICAgIC8vIENhY2hlIHZhbG9yZVxyXG4gICAgdGhpcy5jYWNoZVtleHByZXNzaW9uXSA9IHJldDtcclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVdGlsaXp6YXRvIGRhIGhhc0FDRXhwcmVzc2lvblxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc1JvbGUocm9sZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuSWRlbnRpdHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRWxlbWVudG8gSWRlbnRpdHkgbm9uIHNwZWNpZmljYXRvIGluIEFjY2VzcyBDb250cm9sLiBHbGkgYWNjZXNzaSBzYXJhbm5vIHR1dHRpIGxpYmVyaSBkaSBkZWZhdWx0XCIpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuSWRlbnRpdHkuUm9sZXMgJiYgdGhpcy5JZGVudGl0eS5Sb2xlcy5sZW5ndGggPiAwICYmIHRoaXMuSWRlbnRpdHkuUm9sZXMuaW5kZXhPZihyb2xlKSAhPSAtMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFV0aWxpenphdG8gZGEgaGFzQUNFeHByZXNzaW9uXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5JZGVudGl0eS5QZXJtaXNzaW9ucyAmJiB0aGlzLklkZW50aXR5LlBlcm1pc3Npb25zLmxlbmd0aCA+IDAgJiYgdGhpcy5JZGVudGl0eS5QZXJtaXNzaW9ucy5pbmRleE9mKHBlcm1pc3Npb24pICE9IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXRpbGl6emF0byBkYSBoYXNBQ0V4cHJlc3Npb25cclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNDdXN0b20odmFsdWU6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHZhciBpdGVtcyA9IHRoaXMudGFnZ2VkSXRlbXNDYWNoZS5maW5kKHQgPT4gdC5rZXkgPT0gdGFnKT8uaXRlbXM7XHJcbiAgICBpZiAoIWl0ZW1zKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiAhIWl0ZW1zLmZpbmQodCA9PiB0ID09IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVudHJ5IHBvaW50IGNoZSBjb250cm9sbGEgdW4nZXNwcmVzc2lvbmUgaWRlbnRpZmljYW50ZSB1biBwZXJtZXNzbywgYWQgZXNlbXBpbyBcIlA6dmlzdWFsaXp6YXppb25lXCIgY29udHJvbGxhIGNoZSBsJ3V0ZW50ZSBjb2xsZWdhdG8gYWJiaWEgdW4gcGVybWVzc28gY2hlIHNpIGNoaWFtYSBcInZpc3VhbGl6emF6aW9uZVwiXHJcbiAgICovXHJcbiAgcHVibGljIGhhcyhleHByOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0FDRXhwcmVzc2lvbihleHByKTtcclxuICB9XHJcbn0iXX0=
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FjY2Vzcy1jb250cm9sL3NyYy9saWIvYWNjZXNzLWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpEOztHQUVHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQXVCL0IsY0FBYztJQUNkLFlBQXNELFlBQW9CLEVBQStDLGVBQXVCO1FBQTFGLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQStDLG9CQUFlLEdBQWYsZUFBZSxDQUFRO1FBdEJoSjs7V0FFRztRQUNJLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRXBDOztXQUVHO1FBQ0ksc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRTFDLGNBQWM7UUFDTixVQUFLLEdBQU8sRUFBRSxDQUFDO1FBRXZCLGNBQWM7UUFDTixxQkFBZ0IsR0FBdUMsRUFBRSxDQUFDO0lBUW1GLENBQUM7SUFFdEo7Ozs7T0FJRztJQUNJLGtCQUFrQixDQUFDLFFBQW9EO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMkJBQTJCLENBQUMsaUJBQXFEO1FBQ3RGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkMs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QUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFDLElBQVksRUFBRSxXQUFvQixLQUFLO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7O1lBN0pGLFVBQVU7Ozt5Q0F5QkksUUFBUSxZQUFJLE1BQU0sU0FBQyxZQUFZO3lDQUFpQyxRQUFRLFlBQUksTUFBTSxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBBQ0NfREVGX0NPTkQsIEFDQ19ERUZfQ09ORF9PUCB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5cclxuLyoqXHJcbiAqIEVudHJ5cG9pbnQgZGkgdHV0dGUgbGUgb3BlcmF6aW9uaSBlc3Bvc3RlIGRhbGxhIGxpYnJlcmlhIGFjY2Vzcy1jb250cm9sXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBY2Nlc3NDb250cm9sU2VydmljZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIEluZGljYSBzZSBsJ0lkZW50aXR5IMOoIHN0YXRhIGluaXppYWxpenphdGFcclxuICAgKi9cclxuICBwdWJsaWMgSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhIHNlIHNvbm8gc3RhdGUgZWZmZXR0dWF0ZSBpbml6aWFsaXp6YXppb25pIGRpIEN1c3RvbSBQZXJtaXNzaW9uc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBJbml0aWFsaXplZEN1c3RvbTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIHByaXZhdGUgY2FjaGU6IHt9ID0ge307XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSB0YWdnZWRJdGVtc0NhY2hlOiB7IGtleTogc3RyaW5nLCBpdGVtczogc3RyaW5nW10gfVtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIElkZW50aXR5IGFzc29jaWF0YSBhIHF1ZXN0J2lzdGFuemEgZGVsIFNlcnZpemlvIEFjY2VzcyBDb250cm9sLCB1dGlsZSBzZSBzaSB2dW9sZSBhdmVyZSBhY2Nlc3NvIGEgUnVvbGkgZSBQZXJtZXNzaSBkaXJldHRhbWVudGUgZGEgcXVpLCBwZXIgcXVhbHNpdm9nbGlhIG1vdGl2b1xyXG4gICAqL1xyXG4gIHB1YmxpYyBJZGVudGl0eTogeyBSb2xlczogc3RyaW5nW10sIFBlcm1pc3Npb25zOiBzdHJpbmdbXSB9O1xyXG5cclxuICAvKiogQGlnbm9yZSAqL1xyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoQUNDX0RFRl9DT05EKSBwcml2YXRlIEFDQ19ERUZfQ09ORDogc3RyaW5nLCBAT3B0aW9uYWwoKSBASW5qZWN0KEFDQ19ERUZfQ09ORF9PUCkgcHJpdmF0ZSBBQ0NfREVGX0NPTkRfT1A6IHN0cmluZywpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml6aWFsaXp6YSBsJ0lkZW50aXR5IGRlbCBzZXJ2aXppbyBjb24gaWwgbW9kZWxsbyBzcGVjaWZpY2F0b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbXMge3sgUm9sZXM6IHN0cmluZ1tdLCBQZXJtaXNzaW9uczogc3RyaW5nW10gfX0gaWRlbnRpdHkgSWRlbnRpdMOgIGFwcGxpY2F0aXZhIGNvbiBydW9saSBlIHBlcm1lc3NpXHJcbiAgICovXHJcbiAgcHVibGljIGluaXRpYWxpemVJZGVudGl0eShpZGVudGl0eTogeyBSb2xlczogc3RyaW5nW10sIFBlcm1pc3Npb25zOiBzdHJpbmdbXSB9KSB7XHJcbiAgICB0aGlzLklkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICB0aGlzLkluaXRpYWxpemVkID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXppYWxpenphIGkgcGVybWVzc2kgQ3VzdG9tIGRlbCBzZXJ2aXppbyBjb24gaWwgbW9kZWxsbyBzcGVjaWZpY2F0b1xyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB7eyBrZXk6IHN0cmluZywgaXRlbXM6IHN0cmluZ1tdIH1bXX0gY3VzdG9tUGVybWlzc2lvbnMgUGVybWVzc2kgQ3VzdG9tXHJcbiAgICovXHJcbiAgcHVibGljIGluaXRpYWxpemVDdXN0b21QZXJtaXNzaW9ucyhjdXN0b21QZXJtaXNzaW9uczogeyBrZXk6IHN0cmluZywgaXRlbXM6IHN0cmluZ1tdIH1bXSkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXN0b21QZXJtaXNzaW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoY3VzdG9tUGVybWlzc2lvbnNbaV0ua2V5Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0Blc2ZhZW56YS9hY2Nlc3MtY29udHJvbF0gQ3VzdG9tIHBlcm1pc3Npb24gaW5pdGlhbGl6ZWQgd2l0aCBrZXlzIGxvbmdlciB0aGFuIGEgc2luZ2xlIGNoYXJhY3RlcnMuIElnbm9yaW5nIEVWRVJZVEhJTkcuXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnZ2VkSXRlbXNDYWNoZSA9IGN1c3RvbVBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy5Jbml0aWFsaXplZEN1c3RvbSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2UgbmVsbGEgc2Vzc2lvbmUgYXR0dWFsZSBlc2lzdGUgdW4gdXRlbnRlIGxvZ2dhdG8uIEZhIHVuIHNlbXBsaWNlIGNvbnRyb2xsbyBkaSBwcmVzZW56YSBzdWxsJ0lkZW50aXR5XHJcbiAgICovXHJcbiAgcHVibGljIGlzTG9nZ2VkSW4oKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLklkZW50aXR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwcmVzc2lvbiDDqCBzY3JpdHRhIHRpcG8gLS0+IFI6Um9sZTEgJiYgUDpQZXJtaXNzaW9uMSB8fCAoUjpSb2xlMiAmJiBQOlBlcm1pc3Npb24xKVxyXG4gICAqIFF1aW5kaSBwaXV0dG9zdG8gY2hlIGltcGxlbWVudGFyc2kgdW4gcGFyc2VyIGRlbGxhIG1hZG9ubmEgaW4gc3RpbGUgQWxlc3NhbmRybyBwcmVuZG8gbGEgc3RyYWRhIHN0cm9uemEgZSB2ZWxvY2UgY29uIGwnZXZhbCA6UFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0FDRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5Jbml0aWFsaXplZClcclxuICAgICAgY29uc29sZS5lcnJvcihcIkFjY2VzcyBDb250cm9sIFN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENhbGwgdGhpcy5hY2Nlc3NDb250cm9sLmluaXRpYWxpemUoLi4uLCAuLi4pIGJlZm9yZSB1c2luZyB0aGUgc2VydmljZVwiKTtcclxuXHJcbiAgICBpZiAoIWV4cHJlc3Npb24pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGVyIGxlIGVzcHJlc3Npb25pIGRpIHZpc2liaWxpdMOgIFwiZGlyZXR0ZVwiIHN1bGxhIFggaWdub3JvIGxlIGNvbmRpemlvbmkgZGkgZGVmYXVsdCBwZXJjaMOpIHNvbm8gY29uZGl6aW9uaSBmaXNpY2hlIHBpdXR0b3N0byBjaGUgbG9naWNoZVxyXG4gICAgLy8gU2lnbmlmaWNhIGNoZSBzaWFtbyBvIGRlbnRybyBvIGZ1b3JpIGRhIHVuIGlmcmFtZSBlIHF1ZXN0byBvdnZpYW1lbnRlIHZhIGEgc29wcmFzc2VkZXJlIGV2ZW50dWFsaSBjb25kaXppb25pIGxvZ2ljaGUgZGVsIHRpcG8gXCJzb25vIEphY2UgQWRtaW5cIlxyXG4gICAgaWYodGhpcy5BQ0NfREVGX0NPTkQgJiYgdGhpcy5BQ0NfREVGX0NPTkRfT1AgJiYgIWFic29sdXRlICYmIGV4cHJlc3Npb24gIT0gJ1g6MCcgJiYgZXhwcmVzc2lvbiAhPSAnWDoxJylcclxuICAgICAgZXhwcmVzc2lvbiA9IGAoJHtleHByZXNzaW9ufSkgJHt0aGlzLkFDQ19ERUZfQ09ORF9PUH0gJHt0aGlzLkFDQ19ERUZfQ09ORH1gO1xyXG4gICAgICBcclxuICAgIC8vIEVzcHJlc3Npb25lIGdpw6AgdmFsdXRhdGEsIG5vbiBzZXJ2ZSByaXZhbHV0YXJsYVxyXG4gICAgaWYgKHRoaXMuY2FjaGVbZXhwcmVzc2lvbl0pXHJcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlW2V4cHJlc3Npb25dO1xyXG5cclxuICAgIHZhciBSb2xlc1Blcm1pc3Npb25zUmVnZXhwID0gLy46W158JigpXSsvZztcclxuXHJcbiAgICB2YXIgbWF0Y2hlcyA9IGV4cHJlc3Npb24ubWF0Y2goUm9sZXNQZXJtaXNzaW9uc1JlZ2V4cCk7XHJcbiAgICBcclxuICAgIGlmICghbWF0Y2hlcylcclxuICAgICAgdGhyb3cgXCJFc3ByZXNzaW9uZSBBY2Nlc3MgQ29udHJvbCBub24gdmFsaWRhOiBcIiArIGV4cHJlc3Npb24gKyBcIi4gQXNzaWN1cmFyc2kgY2hlIHNpYSBzY3JpdHRhIGluIG1vZG8gY29ycmV0dG9cIjtcclxuXHJcbiAgICBtYXRjaGVzLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBzcGxpdHMgPSB0LnNwbGl0KCc6Jyk7XHJcbiAgICAgIGlmIChzcGxpdHNbMF0gPT0gXCJSXCIpXHJcbiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgXCJ0aGlzLmhhc1JvbGUoJ1wiICsgc3BsaXRzWzFdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICAgIGVsc2UgaWYgKHNwbGl0c1swXSA9PSBcIlBcIilcclxuICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKHQudHJpbSgpLCBcInRoaXMuaGFzUGVybWlzc2lvbignXCIgKyBzcGxpdHNbMV0udHJpbSgpICsgXCInKVwiKTtcclxuICAgICAgZWxzZVxyXG4gICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uLnJlcGxhY2UodC50cmltKCksIFwidGhpcy5oYXNDdXN0b20oJ1wiICsgc3BsaXRzWzFdLnRyaW0oKSArIFwiJywgJ1wiICsgc3BsaXRzWzBdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICB9KTtcclxuXHJcbiAgICB2YXIgcmV0ID0gPGJvb2xlYW4+ZXZhbChleHByZXNzaW9uKTtcclxuICAgIC8vIENhY2hlIHZhbG9yZVxyXG4gICAgdGhpcy5jYWNoZVtleHByZXNzaW9uXSA9IHJldDtcclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVdGlsaXp6YXRvIGRhIGhhc0FDRXhwcmVzc2lvbiBkZW50cm8gZXZhbFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc1JvbGUocm9sZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuSWRlbnRpdHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRWxlbWVudG8gSWRlbnRpdHkgbm9uIHNwZWNpZmljYXRvIGluIEFjY2VzcyBDb250cm9sLiBHbGkgYWNjZXNzaSBzYXJhbm5vIHR1dHRpIGxpYmVyaSBkaSBkZWZhdWx0XCIpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuSWRlbnRpdHkuUm9sZXMgJiYgdGhpcy5JZGVudGl0eS5Sb2xlcy5sZW5ndGggPiAwICYmIHRoaXMuSWRlbnRpdHkuUm9sZXMuaW5kZXhPZihyb2xlKSAhPSAtMTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFV0aWxpenphdG8gZGEgaGFzQUNFeHByZXNzaW9uIGRlbnRybyBldmFsXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzUGVybWlzc2lvbihwZXJtaXNzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5JZGVudGl0eS5QZXJtaXNzaW9ucyAmJiB0aGlzLklkZW50aXR5LlBlcm1pc3Npb25zLmxlbmd0aCA+IDAgJiYgdGhpcy5JZGVudGl0eS5QZXJtaXNzaW9ucy5pbmRleE9mKHBlcm1pc3Npb24pICE9IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXRpbGl6emF0byBkYSBoYXNBQ0V4cHJlc3Npb24gZGVudHJvIGV2YWxcclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNDdXN0b20odmFsdWU6IHN0cmluZywgdGFnOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHZhciBpdGVtcyA9IHRoaXMudGFnZ2VkSXRlbXNDYWNoZS5maW5kKHQgPT4gdC5rZXkgPT0gdGFnKT8uaXRlbXM7XHJcbiAgICBpZiAoIWl0ZW1zKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIGVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiAhIWl0ZW1zLmZpbmQodCA9PiB0ID09IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVudHJ5IHBvaW50IGNoZSBjb250cm9sbGEgdW4nZXNwcmVzc2lvbmUgaWRlbnRpZmljYW50ZSB1biBwZXJtZXNzbywgYWQgZXNlbXBpbyBcIlA6dmlzdWFsaXp6YXppb25lXCIgY29udHJvbGxhIGNoZSBsJ3V0ZW50ZSBjb2xsZWdhdG8gYWJiaWEgdW4gcGVybWVzc28gY2hlIHNpIGNoaWFtYSBcInZpc3VhbGl6emF6aW9uZVwiXHJcbiAgICovXHJcbiAgcHVibGljIGhhcyhleHByOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmhhc0FDRXhwcmVzc2lvbihleHByLCBhYnNvbHV0ZSk7XHJcbiAgfVxyXG59Il19
@@ -70,7 +70,7 @@ class AccessControlService {
70
70
  *
71
71
  * @ignore
72
72
  */
73
- hasACExpression(expression) {
73
+ hasACExpression(expression, absolute = false) {
74
74
  if (!this.Initialized)
75
75
  console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
76
76
  if (!expression)
@@ -79,9 +79,11 @@ class AccessControlService {
79
79
  console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
80
80
  return true;
81
81
  }
82
- if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP)
82
+ // Per le espressioni di visibilità "dirette" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche
83
+ // Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo "sono Jace Admin"
84
+ if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')
83
85
  expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;
84
- //Espressione già valutata, non serve rivalutarla
86
+ // Espressione già valutata, non serve rivalutarla
85
87
  if (this.cache[expression])
86
88
  return this.cache[expression];
87
89
  var RolesPermissionsRegexp = /.:[^|&()]+/g;
@@ -103,7 +105,7 @@ class AccessControlService {
103
105
  return ret;
104
106
  }
105
107
  /**
106
- * Utilizzato da hasACExpression
108
+ * Utilizzato da hasACExpression dentro eval
107
109
  *
108
110
  * @ignore
109
111
  */
@@ -115,7 +117,7 @@ class AccessControlService {
115
117
  return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
116
118
  }
117
119
  /**
118
- * Utilizzato da hasACExpression
120
+ * Utilizzato da hasACExpression dentro eval
119
121
  *
120
122
  * @ignore
121
123
  */
@@ -127,7 +129,7 @@ class AccessControlService {
127
129
  return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
128
130
  }
129
131
  /**
130
- * Utilizzato da hasACExpression
132
+ * Utilizzato da hasACExpression dentro eval
131
133
  *
132
134
  * @ignore
133
135
  */
@@ -144,8 +146,8 @@ class AccessControlService {
144
146
  /**
145
147
  * Entry point che controlla un'espressione identificante un permesso, ad esempio "P:visualizzazione" controlla che l'utente collegato abbia un permesso che si chiama "visualizzazione"
146
148
  */
147
- has(expr) {
148
- return this.hasACExpression(expr);
149
+ has(expr, absolute = false) {
150
+ return this.hasACExpression(expr, absolute);
149
151
  }
150
152
  }
151
153
  AccessControlService.decorators = [
@@ -284,16 +286,19 @@ class AccessControlDirective {
284
286
  this.templateRef = templateRef;
285
287
  this.viewContainer = viewContainer;
286
288
  this._ac = _ac;
289
+ /**
290
+ * Espressione da processare scritta come {Chiave}:{Valore}
291
+ *
292
+ * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions.
293
+ *
294
+ * Nelle ultime versioni del template è anche presente di default la custom permission "X" che indica se l'applicaizone è Esterna o no
295
+ */
296
+ this.ac = null;
297
+ /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */
298
+ this.acAbsolute = false;
287
299
  }
288
- /**
289
- * Input autoreferenziale per la direttiva
290
- *
291
- * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}
292
- *
293
- * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions
294
- */
295
- set ac(expression) {
296
- var allow = this._ac.has(expression);
300
+ ngOnInit() {
301
+ var allow = this._ac.has(this.ac, this.acAbsolute);
297
302
  //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template
298
303
  if (allow)
299
304
  this.viewContainer.createEmbeddedView(this.templateRef);
@@ -312,7 +317,8 @@ AccessControlDirective.ctorParameters = () => [
312
317
  { type: AccessControlService }
313
318
  ];
314
319
  AccessControlDirective.propDecorators = {
315
- ac: [{ type: Input }]
320
+ ac: [{ type: Input }],
321
+ acAbsolute: [{ type: Input }]
316
322
  };
317
323
 
318
324
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-access-control.js","sources":["../../../projects/access-control/src/lib/tokens.ts","../../../projects/access-control/src/lib/access-control.service.ts","../../../projects/access-control/src/lib/AccessControlRouteGuard.ts","../../../projects/access-control/src/lib/access-control.directive.ts","../../../projects/access-control/src/lib/models/ComponentContext.ts","../../../projects/access-control/src/lib/context-aware.directive.ts","../../../projects/access-control/src/lib/access-control.module.ts","../../../projects/access-control/src/lib/models/AccessControlModuleConfig.ts","../../../projects/access-control/src/public-api.ts","../../../projects/access-control/src/esfaenza-access-control.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Token che racchiude il locale scelto per l'applicazione */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');\r\n\r\n/** Token che indica la condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND');\r\n\r\n/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND_OP: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND_OP');","// Angular\r\nimport { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { ACC_DEF_COND, ACC_DEF_COND_OP } from \"./tokens\";\r\n\r\n/**\r\n * Entrypoint di tutte le operazioni esposte dalla libreria access-control\r\n */\r\n@Injectable()\r\nexport class AccessControlService {\r\n\r\n /**\r\n * Indica se l'Identity è stata inizializzata\r\n */\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Indica se sono state effettuate inizializzazioni di Custom Permissions\r\n */\r\n public InitializedCustom: boolean = false;\r\n\r\n /** @ignore */\r\n private cache: {} = {};\r\n\r\n /** @ignore */\r\n private taggedItemsCache: { key: string, items: string[] }[] = [];\r\n\r\n /**\r\n * Identity associata a quest'istanza del Servizio Access Control, utile se si vuole avere accesso a Ruoli e Permessi direttamente da qui, per qualsivoglia motivo\r\n */\r\n public Identity: { Roles: string[], Permissions: string[] };\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(ACC_DEF_COND) private ACC_DEF_COND: string, @Optional() @Inject(ACC_DEF_COND_OP) private ACC_DEF_COND_OP: string,) { }\r\n\r\n /**\r\n * Inizializza l'Identity del servizio con il modello specificato\r\n * \r\n * @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi\r\n */\r\n public initializeIdentity(identity: { Roles: string[], Permissions: string[] }) {\r\n this.Identity = identity;\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Inizializza i permessi Custom del servizio con il modello specificato\r\n * \r\n * @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom\r\n */\r\n public initializeCustomPermissions(customPermissions: { key: string, items: string[] }[]) {\r\n for (let i = 0; i < customPermissions.length; i++) {\r\n if (customPermissions[i].key.length > 1) {\r\n console.error(\"[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.\");\r\n return;\r\n }\r\n }\r\n\r\n this.taggedItemsCache = customPermissions;\r\n this.InitializedCustom = true;\r\n }\r\n\r\n /**\r\n * Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity\r\n */\r\n public isLoggedIn() {\r\n return !!this.Identity;\r\n }\r\n\r\n /**\r\n * Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)\r\n * Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P\r\n * \r\n * @ignore\r\n */\r\n private hasACExpression(expression: string): boolean {\r\n if (!this.Initialized)\r\n console.error(\"Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service\");\r\n\r\n if (!expression)\r\n return true;\r\n\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n\r\n if(this.ACC_DEF_COND && this.ACC_DEF_COND_OP)\r\n expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;\r\n \r\n //Espressione già valutata, non serve rivalutarla\r\n if (this.cache[expression])\r\n return this.cache[expression];\r\n\r\n var RolesPermissionsRegexp = /.:[^|&()]+/g;\r\n\r\n var matches = expression.match(RolesPermissionsRegexp);\r\n \r\n if (!matches)\r\n throw \"Espressione Access Control non valida: \" + expression + \". Assicurarsi che sia scritta in modo corretto\";\r\n\r\n matches.forEach(t => {\r\n var splits = t.split(':');\r\n if (splits[0] == \"R\")\r\n expression = expression.replace(t.trim(), \"this.hasRole('\" + splits[1].trim() + \"')\");\r\n else if (splits[0] == \"P\")\r\n expression = expression.replace(t.trim(), \"this.hasPermission('\" + splits[1].trim() + \"')\");\r\n else\r\n expression = expression.replace(t.trim(), \"this.hasCustom('\" + splits[1].trim() + \"', '\" + splits[0].trim() + \"')\");\r\n });\r\n\r\n var ret = <boolean>eval(expression);\r\n // Cache valore\r\n this.cache[expression] = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasRole(role: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasPermission(permission: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression\r\n * \r\n * @ignore\r\n */\r\n private hasCustom(value: string, tag: string): boolean {\r\n var items = this.taggedItemsCache.find(t => t.key == tag)?.items;\r\n if (!items)\r\n return true;\r\n else if (items.length == 0)\r\n return false;\r\n else\r\n return !!items.find(t => t == value);\r\n }\r\n\r\n /**\r\n * Entry point che controlla un'espressione identificante un permesso, ad esempio \"P:visualizzazione\" controlla che l'utente collegato abbia un permesso che si chiama \"visualizzazione\"\r\n */\r\n public has(expr: string) {\r\n return this.hasACExpression(expr);\r\n }\r\n}","//Angular\r\nimport { ActivatedRouteSnapshot, CanActivateChild, RouterStateSnapshot } from \"@angular/router\";\r\nimport { Injectable, Optional, Inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n//Libs\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n//Models\r\nimport { ACC_LOCALE } from \"./tokens\";\r\nimport { AccessControlService } from './access-control.service';\r\n\r\n/**\r\n * Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe\r\n * che la ereditavalorizzare la variabile Routes con le route permesse dal modulo e il permesso per cui si vuole riservare l'accesso. Ad esempio:\r\n * \r\n * ```typescript\r\n * @Injectable()\r\n * export class HasAuthGuardComponent extends BaseRouterGuard {\r\n * constructor(acc: AccessControlService, router: Router, ms: MessageService, ts: BaseTokenService) {\r\n * super(ms, acc, router, ts);\r\n * this.Routes = [\r\n * { route: \"page_route\", permission: \"P:perm_one\" },\r\n * { route: \"*\", permission: \"R:role_one\" }\r\n * ]\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class AccessControlRouteGuard implements CanActivateChild {\r\n /**\r\n * @ignore\r\n */\r\n private lc: LocalizationService;\r\n\r\n /**\r\n * Route di login che serve per reindirizzare alla pagina di login in caso di fallimento del controllo sui Permessi\r\n * \r\n * @default\r\n */\r\n protected LoginRoute : string = \"login\";\r\n\r\n /**\r\n * Permette di specificare delle Route sempre consentite, anche a livello di \"Radice\". Ad esempio la Root \"test\" permetterà\r\n * l'accesso a tutte le route che anche solo iniziano per \"test\"\r\n */\r\n protected AlwaysAllowedRoots: string[] = [];\r\n \r\n /**\r\n * Lista di Route con la loro espressione di controllo per valutare i permessi\r\n */\r\n protected Routes: { route: any; permission: string; }[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(private msgService : MessageService, private ac: AccessControlService, private router: Router, @Optional() @Inject(ACC_LOCALE) LOCALE: string) {\r\n this.lc = new LocalizationService(LOCALE ?? 'it-IT');\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n canActivateChild(route: ActivatedRouteSnapshot, _: RouterStateSnapshot): Promise<boolean> {\r\n var url = route.url.join('/');\r\n //Se l'applicazione non è pronta e non sto navigando nelle pagine consentite\r\n if (!this.ac.Initialized && !this.AlwaysAllowedRoots.find(r => url.indexOf(r) != -1))\r\n return Promise.resolve(false);\r\n \r\n var routeMatched: boolean = false;\r\n for (let i = 0; i < this.Routes.length; i++) {\r\n let r = this.Routes[i];\r\n //Se faccio match con la route significa che ho navigato in una delle route conosciute, altrimenti avverto ma lascio andare\r\n if (url.indexOf(r.route) != -1) {\r\n routeMatched = true;\r\n return this.handleMatch(url, r);\r\n }\r\n }\r\n //Se non faccio nessun match ma ho una route wildcard (*) prendo quella e controllo su quella\r\n if (!routeMatched) {\r\n var wildcardRoute = this.Routes.find(r => r.route == \"*\");\r\n if (wildcardRoute)\r\n return this.handleMatch(url, wildcardRoute);\r\n else\r\n console.log(\"Navigaizone avvenuta su route sconosciuta: \" + url);\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private handleMatch(fromurl: string, r: any) {\r\n let identity = this.ac.Identity;\r\n\r\n if (this.ac.has(r.permission) ||\r\n (\r\n // Considero anche la possibilità di avere l'access control inizializzato ma che l'account scope non sia ancora presente\r\n // in questo caso suppongo sia un hard refresh e mi fido del fatto che l'utente possa entrarci\r\n // TODO: Fixare meglio concatenando una promise che va a prendere l'account scope se serve\r\n this.ac.Initialized &&\r\n (!identity.Roles || identity.Roles.length == 0) &&\r\n (!identity.Permissions || identity.Permissions.length == 0)\r\n ))\r\n return Promise.resolve(true);\r\n else {\r\n //Se sono nel sito originale (non ho aperto un newtab) blocco la navigazione\r\n //Se ho aperto una nuova tab invece rispedisco al login\r\n if (window.history.length > 2 && this.ac.isLoggedIn()) {\r\n this.msgService.simpleError(this.lc.loc(\"You don't have the required permissions to view this page. The navigation has been blocked\"));\r\n return Promise.resolve(false);\r\n }\r\n else {\r\n this.onRedirectInProgress();\r\n this.router.navigate([this.LoginRoute, { fromUrl: fromurl }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Callback che viene eseguito prima che la Guard reindirizzi al login\r\n */\r\n protected onRedirectInProgress() {\r\n }\r\n}","// Angular\r\nimport { Directive, Input, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\n\r\n/**\r\n * Direttiva che permette di gestire il controllo accessi su componenti HTML. \r\n * \r\n * Per gli esempi di utilizzo fare riferimento al README.\r\n */\r\n@Directive({\r\n selector: '[ac]',\r\n})\r\nexport class AccessControlDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef, private _ac: AccessControlService) { }\r\n\r\n /**\r\n * Input autoreferenziale per la direttiva\r\n * \r\n * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}\r\n * \r\n * Le {Chiave} disponibili sono di default \"R\" per i ruoli e \"P\" per i permessi. È possibile espanderle con le Custom Permissions\r\n */\r\n @Input() set ac(expression: string) {\r\n var allow = this._ac.has(expression);\r\n\r\n //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template\r\n\r\n if (allow) this.viewContainer.createEmbeddedView(this.templateRef);\r\n else this.viewContainer.clear();\r\n }\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Token da iniettare per ogni singolo componente per cui si vuole disattivare/attivare massivamente degli input in maniera contestuale\r\n */\r\n@Injectable()\r\nexport class ComponentContext{\r\n /**\r\n * Nome del Contesto assegnato al Componente\r\n */\r\n name : string;\r\n}","// Angular\r\nimport { Directive, ElementRef, Optional, Inject } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\nimport { ACC_CUSTOMKEY } from \"./tokens\"\r\n\r\n// Classi\r\nimport { ComponentContext } from \"./models/ComponentContext\";\r\n\r\n/**\r\n * Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.\r\n * \r\n * Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext\r\n */\r\n@Directive({\r\n selector: '[contextAware]',\r\n})\r\nexport class ContextAwareDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(element: ElementRef, @Optional() private context: ComponentContext, private ac: AccessControlService, @Optional() @Inject(ACC_CUSTOMKEY) private ACC_CUSTOMKEY: string) {\r\n var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + \":\" + this.context.name,);\r\n\r\n if (!allow)\r\n element.nativeElement.setAttribute(\"enabled\", \"true\");\r\n }\r\n}","import { LocalizationModule } from '@esfaenza/localizations';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\n\r\nimport { ACC_LOCALE, ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP } from './tokens';\r\n\r\nimport { AccessControlModuleConfig } from './models/AccessControlModuleConfig';\r\nimport { AccessControlService } from './access-control.service';\r\nimport { AccessControlRouteGuard } from './AccessControlRouteGuard';\r\nimport { AccessControlDirective } from './access-control.directive';\r\nimport { ContextAwareDirective } from './context-aware.directive';\r\n\r\n@NgModule({\r\n imports: [LocalizationModule],\r\n declarations: [AccessControlDirective, ContextAwareDirective],\r\n exports:[AccessControlDirective, ContextAwareDirective]\r\n})\r\nexport class AccessControlModule {\r\n static forRoot(config?: AccessControlModuleConfig): ModuleWithProviders<AccessControlModule> {\r\n return {\r\n ngModule: AccessControlModule,\r\n providers: [\r\n AccessControlService,\r\n AccessControlRouteGuard,\r\n { provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },\r\n { provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },\r\n { provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },\r\n { provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'\r\n */\r\nexport class AccessControlModuleConfig {\r\n\r\n /**\r\n * locale dell'applicazione in forma standard, ad esempio \"it-IT\", \"en-US\", etc...\r\n * \r\n * Attualmente si supportano solo le lingue Italiano e Inglese\r\n */\r\n locale: string;\r\n\r\n /** Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno */\r\n customKey: string;\r\n\r\n /** Condizione di default da aggiungere a ogni condizione utente. Es: 'R:Jace Admin' */\r\n defaultCondition?: string;\r\n\r\n /** Relazione logica fra la condizione di default e la condizione utente. Es: '||'. Di default viene utilizzato l'OR logico */\r\n defaultConditionLogicalOperator?: string;\r\n}","/*\r\n * Public API Surface of access-control\r\n */\r\n\r\nexport * from './lib/access-control.module';\r\nexport * from './lib/access-control.service';\r\nexport * from './lib/access-control.directive'\r\nexport * from \"./lib/models/AccessControlModuleConfig\";\r\nexport * from \"./lib/AccessControlRouteGuard\";\r\nexport * from \"./lib/tokens\";\r\nexport * from \"./lib/models/ComponentContext\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {ContextAwareDirective as ɵa} from './lib/context-aware.directive';"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-access-control.js","sources":["../../../projects/access-control/src/lib/tokens.ts","../../../projects/access-control/src/lib/access-control.service.ts","../../../projects/access-control/src/lib/AccessControlRouteGuard.ts","../../../projects/access-control/src/lib/access-control.directive.ts","../../../projects/access-control/src/lib/models/ComponentContext.ts","../../../projects/access-control/src/lib/context-aware.directive.ts","../../../projects/access-control/src/lib/access-control.module.ts","../../../projects/access-control/src/lib/models/AccessControlModuleConfig.ts","../../../projects/access-control/src/public-api.ts","../../../projects/access-control/src/esfaenza-access-control.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Token che racchiude il locale scelto per l'applicazione */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');\r\n\r\n/** Token che indica la condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND');\r\n\r\n/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */\r\nexport const ACC_DEF_COND_OP: InjectionToken<string> = new InjectionToken<string>('ACC_DEF_COND_OP');","// Angular\r\nimport { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { ACC_DEF_COND, ACC_DEF_COND_OP } from \"./tokens\";\r\n\r\n/**\r\n * Entrypoint di tutte le operazioni esposte dalla libreria access-control\r\n */\r\n@Injectable()\r\nexport class AccessControlService {\r\n\r\n /**\r\n * Indica se l'Identity è stata inizializzata\r\n */\r\n public Initialized: boolean = false;\r\n\r\n /**\r\n * Indica se sono state effettuate inizializzazioni di Custom Permissions\r\n */\r\n public InitializedCustom: boolean = false;\r\n\r\n /** @ignore */\r\n private cache: {} = {};\r\n\r\n /** @ignore */\r\n private taggedItemsCache: { key: string, items: string[] }[] = [];\r\n\r\n /**\r\n * Identity associata a quest'istanza del Servizio Access Control, utile se si vuole avere accesso a Ruoli e Permessi direttamente da qui, per qualsivoglia motivo\r\n */\r\n public Identity: { Roles: string[], Permissions: string[] };\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(ACC_DEF_COND) private ACC_DEF_COND: string, @Optional() @Inject(ACC_DEF_COND_OP) private ACC_DEF_COND_OP: string,) { }\r\n\r\n /**\r\n * Inizializza l'Identity del servizio con il modello specificato\r\n * \r\n * @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi\r\n */\r\n public initializeIdentity(identity: { Roles: string[], Permissions: string[] }) {\r\n this.Identity = identity;\r\n this.Initialized = true;\r\n }\r\n\r\n /**\r\n * Inizializza i permessi Custom del servizio con il modello specificato\r\n * \r\n * @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom\r\n */\r\n public initializeCustomPermissions(customPermissions: { key: string, items: string[] }[]) {\r\n for (let i = 0; i < customPermissions.length; i++) {\r\n if (customPermissions[i].key.length > 1) {\r\n console.error(\"[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.\");\r\n return;\r\n }\r\n }\r\n\r\n this.taggedItemsCache = customPermissions;\r\n this.InitializedCustom = true;\r\n }\r\n\r\n /**\r\n * Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity\r\n */\r\n public isLoggedIn() {\r\n return !!this.Identity;\r\n }\r\n\r\n /**\r\n * Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)\r\n * Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P\r\n * \r\n * @ignore\r\n */\r\n private hasACExpression(expression: string, absolute: boolean = false): boolean {\r\n if (!this.Initialized)\r\n console.error(\"Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service\");\r\n\r\n if (!expression)\r\n return true;\r\n\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n\r\n // Per le espressioni di visibilità \"dirette\" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche\r\n // Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo \"sono Jace Admin\"\r\n if(this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')\r\n expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;\r\n \r\n // Espressione già valutata, non serve rivalutarla\r\n if (this.cache[expression])\r\n return this.cache[expression];\r\n\r\n var RolesPermissionsRegexp = /.:[^|&()]+/g;\r\n\r\n var matches = expression.match(RolesPermissionsRegexp);\r\n \r\n if (!matches)\r\n throw \"Espressione Access Control non valida: \" + expression + \". Assicurarsi che sia scritta in modo corretto\";\r\n\r\n matches.forEach(t => {\r\n var splits = t.split(':');\r\n if (splits[0] == \"R\")\r\n expression = expression.replace(t.trim(), \"this.hasRole('\" + splits[1].trim() + \"')\");\r\n else if (splits[0] == \"P\")\r\n expression = expression.replace(t.trim(), \"this.hasPermission('\" + splits[1].trim() + \"')\");\r\n else\r\n expression = expression.replace(t.trim(), \"this.hasCustom('\" + splits[1].trim() + \"', '\" + splits[0].trim() + \"')\");\r\n });\r\n\r\n var ret = <boolean>eval(expression);\r\n // Cache valore\r\n this.cache[expression] = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasRole(role: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasPermission(permission: string): boolean {\r\n if (!this.Identity) {\r\n console.warn(\"Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default\")\r\n return true;\r\n }\r\n return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;\r\n }\r\n\r\n /**\r\n * Utilizzato da hasACExpression dentro eval\r\n * \r\n * @ignore\r\n */\r\n private hasCustom(value: string, tag: string): boolean {\r\n var items = this.taggedItemsCache.find(t => t.key == tag)?.items;\r\n if (!items)\r\n return true;\r\n else if (items.length == 0)\r\n return false;\r\n else\r\n return !!items.find(t => t == value);\r\n }\r\n\r\n /**\r\n * Entry point che controlla un'espressione identificante un permesso, ad esempio \"P:visualizzazione\" controlla che l'utente collegato abbia un permesso che si chiama \"visualizzazione\"\r\n */\r\n public has(expr: string, absolute: boolean = false) {\r\n return this.hasACExpression(expr, absolute);\r\n }\r\n}","//Angular\r\nimport { ActivatedRouteSnapshot, CanActivateChild, RouterStateSnapshot } from \"@angular/router\";\r\nimport { Injectable, Optional, Inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\n\r\n//Libs\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n//Models\r\nimport { ACC_LOCALE } from \"./tokens\";\r\nimport { AccessControlService } from './access-control.service';\r\n\r\n/**\r\n * Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe\r\n * che la ereditavalorizzare la variabile Routes con le route permesse dal modulo e il permesso per cui si vuole riservare l'accesso. Ad esempio:\r\n * \r\n * ```typescript\r\n * @Injectable()\r\n * export class HasAuthGuardComponent extends BaseRouterGuard {\r\n * constructor(acc: AccessControlService, router: Router, ms: MessageService, ts: BaseTokenService) {\r\n * super(ms, acc, router, ts);\r\n * this.Routes = [\r\n * { route: \"page_route\", permission: \"P:perm_one\" },\r\n * { route: \"*\", permission: \"R:role_one\" }\r\n * ]\r\n * }\r\n * }\r\n * ```\r\n */\r\n@Injectable()\r\nexport class AccessControlRouteGuard implements CanActivateChild {\r\n /**\r\n * @ignore\r\n */\r\n private lc: LocalizationService;\r\n\r\n /**\r\n * Route di login che serve per reindirizzare alla pagina di login in caso di fallimento del controllo sui Permessi\r\n * \r\n * @default\r\n */\r\n protected LoginRoute : string = \"login\";\r\n\r\n /**\r\n * Permette di specificare delle Route sempre consentite, anche a livello di \"Radice\". Ad esempio la Root \"test\" permetterà\r\n * l'accesso a tutte le route che anche solo iniziano per \"test\"\r\n */\r\n protected AlwaysAllowedRoots: string[] = [];\r\n \r\n /**\r\n * Lista di Route con la loro espressione di controllo per valutare i permessi\r\n */\r\n protected Routes: { route: any; permission: string; }[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(private msgService : MessageService, private ac: AccessControlService, private router: Router, @Optional() @Inject(ACC_LOCALE) LOCALE: string) {\r\n this.lc = new LocalizationService(LOCALE ?? 'it-IT');\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n canActivateChild(route: ActivatedRouteSnapshot, _: RouterStateSnapshot): Promise<boolean> {\r\n var url = route.url.join('/');\r\n //Se l'applicazione non è pronta e non sto navigando nelle pagine consentite\r\n if (!this.ac.Initialized && !this.AlwaysAllowedRoots.find(r => url.indexOf(r) != -1))\r\n return Promise.resolve(false);\r\n \r\n var routeMatched: boolean = false;\r\n for (let i = 0; i < this.Routes.length; i++) {\r\n let r = this.Routes[i];\r\n //Se faccio match con la route significa che ho navigato in una delle route conosciute, altrimenti avverto ma lascio andare\r\n if (url.indexOf(r.route) != -1) {\r\n routeMatched = true;\r\n return this.handleMatch(url, r);\r\n }\r\n }\r\n //Se non faccio nessun match ma ho una route wildcard (*) prendo quella e controllo su quella\r\n if (!routeMatched) {\r\n var wildcardRoute = this.Routes.find(r => r.route == \"*\");\r\n if (wildcardRoute)\r\n return this.handleMatch(url, wildcardRoute);\r\n else\r\n console.log(\"Navigaizone avvenuta su route sconosciuta: \" + url);\r\n }\r\n return Promise.resolve(true);\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private handleMatch(fromurl: string, r: any) {\r\n let identity = this.ac.Identity;\r\n\r\n if (this.ac.has(r.permission) ||\r\n (\r\n // Considero anche la possibilità di avere l'access control inizializzato ma che l'account scope non sia ancora presente\r\n // in questo caso suppongo sia un hard refresh e mi fido del fatto che l'utente possa entrarci\r\n // TODO: Fixare meglio concatenando una promise che va a prendere l'account scope se serve\r\n this.ac.Initialized &&\r\n (!identity.Roles || identity.Roles.length == 0) &&\r\n (!identity.Permissions || identity.Permissions.length == 0)\r\n ))\r\n return Promise.resolve(true);\r\n else {\r\n //Se sono nel sito originale (non ho aperto un newtab) blocco la navigazione\r\n //Se ho aperto una nuova tab invece rispedisco al login\r\n if (window.history.length > 2 && this.ac.isLoggedIn()) {\r\n this.msgService.simpleError(this.lc.loc(\"You don't have the required permissions to view this page. The navigation has been blocked\"));\r\n return Promise.resolve(false);\r\n }\r\n else {\r\n this.onRedirectInProgress();\r\n this.router.navigate([this.LoginRoute, { fromUrl: fromurl }]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Callback che viene eseguito prima che la Guard reindirizzi al login\r\n */\r\n protected onRedirectInProgress() {\r\n }\r\n}","// Angular\r\nimport { Directive, Input, TemplateRef, ViewContainerRef } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\n\r\n/**\r\n * Direttiva che permette di gestire il controllo accessi su componenti HTML. \r\n * \r\n * Per gli esempi di utilizzo fare riferimento al README.\r\n */\r\n@Directive({\r\n selector: '[ac]',\r\n})\r\nexport class AccessControlDirective {\r\n \r\n /** \r\n * Espressione da processare scritta come {Chiave}:{Valore}\r\n * \r\n * Le {Chiave} disponibili sono di default \"R\" per i ruoli e \"P\" per i permessi. È possibile espanderle con le Custom Permissions.\r\n * \r\n * Nelle ultime versioni del template è anche presente di default la custom permission \"X\" che indica se l'applicaizone è Esterna o no\r\n */\r\n @Input() ac : string = null;\r\n\r\n /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */\r\n @Input() acAbsolute: boolean = false;\r\n\r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef, private _ac: AccessControlService) { }\r\n\r\n\r\n ngOnInit(){\r\n var allow = this._ac.has(this.ac, this.acAbsolute);\r\n\r\n //Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template\r\n\r\n if (allow) this.viewContainer.createEmbeddedView(this.templateRef);\r\n else this.viewContainer.clear();\r\n }\r\n\r\n}","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Token da iniettare per ogni singolo componente per cui si vuole disattivare/attivare massivamente degli input in maniera contestuale\r\n */\r\n@Injectable()\r\nexport class ComponentContext{\r\n /**\r\n * Nome del Contesto assegnato al Componente\r\n */\r\n name : string;\r\n}","// Angular\r\nimport { Directive, ElementRef, Optional, Inject } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { AccessControlService } from \"./access-control.service\";\r\nimport { ACC_CUSTOMKEY } from \"./tokens\"\r\n\r\n// Classi\r\nimport { ComponentContext } from \"./models/ComponentContext\";\r\n\r\n/**\r\n * Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.\r\n * \r\n * Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext\r\n */\r\n@Directive({\r\n selector: '[contextAware]',\r\n})\r\nexport class ContextAwareDirective {\r\n \r\n /**\r\n * Costruttore \r\n * \r\n * @ignore\r\n */\r\n constructor(element: ElementRef, @Optional() private context: ComponentContext, private ac: AccessControlService, @Optional() @Inject(ACC_CUSTOMKEY) private ACC_CUSTOMKEY: string) {\r\n var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + \":\" + this.context.name,);\r\n\r\n if (!allow)\r\n element.nativeElement.setAttribute(\"enabled\", \"true\");\r\n }\r\n}","import { LocalizationModule } from '@esfaenza/localizations';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\n\r\nimport { ACC_LOCALE, ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP } from './tokens';\r\n\r\nimport { AccessControlModuleConfig } from './models/AccessControlModuleConfig';\r\nimport { AccessControlService } from './access-control.service';\r\nimport { AccessControlRouteGuard } from './AccessControlRouteGuard';\r\nimport { AccessControlDirective } from './access-control.directive';\r\nimport { ContextAwareDirective } from './context-aware.directive';\r\n\r\n@NgModule({\r\n imports: [LocalizationModule],\r\n declarations: [AccessControlDirective, ContextAwareDirective],\r\n exports:[AccessControlDirective, ContextAwareDirective]\r\n})\r\nexport class AccessControlModule {\r\n static forRoot(config?: AccessControlModuleConfig): ModuleWithProviders<AccessControlModule> {\r\n return {\r\n ngModule: AccessControlModule,\r\n providers: [\r\n AccessControlService,\r\n AccessControlRouteGuard,\r\n { provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },\r\n { provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },\r\n { provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },\r\n { provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }\r\n ]\r\n };\r\n }\r\n}","/**\r\n * Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'\r\n */\r\nexport class AccessControlModuleConfig {\r\n\r\n /**\r\n * locale dell'applicazione in forma standard, ad esempio \"it-IT\", \"en-US\", etc...\r\n * \r\n * Attualmente si supportano solo le lingue Italiano e Inglese\r\n */\r\n locale: string;\r\n\r\n /** Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno */\r\n customKey: string;\r\n\r\n /** Condizione di default da aggiungere a ogni condizione utente. Es: 'R:Jace Admin' */\r\n defaultCondition?: string;\r\n\r\n /** Relazione logica fra la condizione di default e la condizione utente. Es: '||'. Di default viene utilizzato l'OR logico */\r\n defaultConditionLogicalOperator?: string;\r\n}","/*\r\n * Public API Surface of access-control\r\n */\r\n\r\nexport * from './lib/access-control.module';\r\nexport * from './lib/access-control.service';\r\nexport * from './lib/access-control.directive'\r\nexport * from \"./lib/models/AccessControlModuleConfig\";\r\nexport * from \"./lib/AccessControlRouteGuard\";\r\nexport * from \"./lib/tokens\";\r\nexport * from \"./lib/models/ComponentContext\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {ContextAwareDirective as ɵa} from './lib/context-aware.directive';"],"names":[],"mappings":"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"}
@@ -10,17 +10,20 @@ export declare class AccessControlDirective {
10
10
  private viewContainer;
11
11
  private _ac;
12
12
  /**
13
- * Costruttore
13
+ * Espressione da processare scritta come {Chiave}:{Valore}
14
14
  *
15
- * @ignore
15
+ * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions.
16
+ *
17
+ * Nelle ultime versioni del template è anche presente di default la custom permission "X" che indica se l'applicaizone è Esterna o no
16
18
  */
17
- constructor(templateRef: TemplateRef<any>, viewContainer: ViewContainerRef, _ac: AccessControlService);
19
+ ac: string;
20
+ /** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */
21
+ acAbsolute: boolean;
18
22
  /**
19
- * Input autoreferenziale per la direttiva
20
- *
21
- * @param {string} expression espressione da processare scritta come {Chiave}:{Valore}
23
+ * Costruttore
22
24
  *
23
- * Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions
25
+ * @ignore
24
26
  */
25
- set ac(expression: string);
27
+ constructor(templateRef: TemplateRef<any>, viewContainer: ViewContainerRef, _ac: AccessControlService);
28
+ ngOnInit(): void;
26
29
  }
@@ -55,19 +55,19 @@ export declare class AccessControlService {
55
55
  */
56
56
  private hasACExpression;
57
57
  /**
58
- * Utilizzato da hasACExpression
58
+ * Utilizzato da hasACExpression dentro eval
59
59
  *
60
60
  * @ignore
61
61
  */
62
62
  private hasRole;
63
63
  /**
64
- * Utilizzato da hasACExpression
64
+ * Utilizzato da hasACExpression dentro eval
65
65
  *
66
66
  * @ignore
67
67
  */
68
68
  private hasPermission;
69
69
  /**
70
- * Utilizzato da hasACExpression
70
+ * Utilizzato da hasACExpression dentro eval
71
71
  *
72
72
  * @ignore
73
73
  */
@@ -75,5 +75,5 @@ export declare class AccessControlService {
75
75
  /**
76
76
  * Entry point che controlla un'espressione identificante un permesso, ad esempio "P:visualizzazione" controlla che l'utente collegato abbia un permesso che si chiama "visualizzazione"
77
77
  */
78
- has(expr: string): boolean;
78
+ has(expr: string, absolute?: boolean): boolean;
79
79
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/access-control",
3
- "version": "11.2.9",
3
+ "version": "11.2.10",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },