@esfaenza/access-control 13.3.2 → 13.3.4
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.
- package/esm2020/lib/AccessControlRouteGuard.mjs +4 -4
- package/esm2020/lib/access-control.directive.mjs +18 -13
- package/esm2020/lib/access-control.module.mjs +9 -7
- package/esm2020/lib/access-control.service.mjs +37 -14
- package/esm2020/lib/context-aware.directive.mjs +4 -4
- package/esm2020/lib/models/AccessControlModuleConfig.mjs +1 -1
- package/esm2020/lib/models/ComponentContext.mjs +4 -4
- package/esm2020/lib/tokens.mjs +7 -7
- package/fesm2015/esfaenza-access-control.mjs +77 -46
- package/fesm2015/esfaenza-access-control.mjs.map +1 -1
- package/fesm2020/esfaenza-access-control.mjs +75 -46
- package/fesm2020/esfaenza-access-control.mjs.map +1 -1
- package/lib/access-control.directive.d.ts +12 -9
- package/lib/access-control.service.d.ts +8 -6
- package/lib/models/AccessControlModuleConfig.d.ts +5 -3
- package/lib/tokens.d.ts +6 -6
- package/package.json +5 -5
|
@@ -4,14 +4,14 @@ import { InjectionToken, Injectable, Optional, Inject, Directive, Input, NgModul
|
|
|
4
4
|
import * as i1 from '@esfaenza/extensions';
|
|
5
5
|
import * as i3 from '@angular/router';
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Token che racchiude il locale scelto per l'applicazione
|
|
9
|
-
*/
|
|
7
|
+
/** Token che racchiude il locale scelto per l'applicazione */
|
|
10
8
|
const ACC_LOCALE = new InjectionToken('ACC_LOCALE');
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
const
|
|
9
|
+
/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */
|
|
10
|
+
const ACC_CUSTOMKEY = new InjectionToken('ACC_CUSTOMKEY');
|
|
11
|
+
/** Token che indica la condizione di default da aggiungere ai check utente */
|
|
12
|
+
const ACC_DEF_COND = new InjectionToken('ACC_DEF_COND');
|
|
13
|
+
/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */
|
|
14
|
+
const ACC_DEF_COND_OP = new InjectionToken('ACC_DEF_COND_OP');
|
|
15
15
|
|
|
16
16
|
// Angular
|
|
17
17
|
/**
|
|
@@ -19,7 +19,9 @@ const ACC_CUSTOMKEY = new InjectionToken('ACC_CUSTOMKEY');
|
|
|
19
19
|
*/
|
|
20
20
|
class AccessControlService {
|
|
21
21
|
/** @ignore */
|
|
22
|
-
constructor() {
|
|
22
|
+
constructor(ACC_DEF_COND, ACC_DEF_COND_OP) {
|
|
23
|
+
this.ACC_DEF_COND = ACC_DEF_COND;
|
|
24
|
+
this.ACC_DEF_COND_OP = ACC_DEF_COND_OP;
|
|
23
25
|
/**
|
|
24
26
|
* Indica se l'Identity è stata inizializzata
|
|
25
27
|
*/
|
|
@@ -48,6 +50,12 @@ class AccessControlService {
|
|
|
48
50
|
* @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom
|
|
49
51
|
*/
|
|
50
52
|
initializeCustomPermissions(customPermissions) {
|
|
53
|
+
for (let i = 0; i < customPermissions.length; i++) {
|
|
54
|
+
if (customPermissions[i].key.length > 1) {
|
|
55
|
+
console.error("[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
51
59
|
this.taggedItemsCache = customPermissions;
|
|
52
60
|
this.InitializedCustom = true;
|
|
53
61
|
}
|
|
@@ -63,7 +71,7 @@ class AccessControlService {
|
|
|
63
71
|
*
|
|
64
72
|
* @ignore
|
|
65
73
|
*/
|
|
66
|
-
hasACExpression(expression) {
|
|
74
|
+
hasACExpression(expression, absolute = false) {
|
|
67
75
|
if (!this.Initialized)
|
|
68
76
|
console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
|
|
69
77
|
if (!expression)
|
|
@@ -72,7 +80,11 @@ class AccessControlService {
|
|
|
72
80
|
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
73
81
|
return true;
|
|
74
82
|
}
|
|
75
|
-
//
|
|
83
|
+
// Per le espressioni di visibilità "dirette" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche
|
|
84
|
+
// Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo "sono Jace Admin"
|
|
85
|
+
if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')
|
|
86
|
+
expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;
|
|
87
|
+
// Espressione già valutata, non serve rivalutarla
|
|
76
88
|
if (this.cache[expression])
|
|
77
89
|
return this.cache[expression];
|
|
78
90
|
var RolesPermissionsRegexp = /.:[^|&()]+/g;
|
|
@@ -94,7 +106,7 @@ class AccessControlService {
|
|
|
94
106
|
return ret;
|
|
95
107
|
}
|
|
96
108
|
/**
|
|
97
|
-
* Utilizzato da hasACExpression
|
|
109
|
+
* Utilizzato da hasACExpression dentro eval
|
|
98
110
|
*
|
|
99
111
|
* @ignore
|
|
100
112
|
*/
|
|
@@ -106,7 +118,7 @@ class AccessControlService {
|
|
|
106
118
|
return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
|
|
107
119
|
}
|
|
108
120
|
/**
|
|
109
|
-
* Utilizzato da hasACExpression
|
|
121
|
+
* Utilizzato da hasACExpression dentro eval
|
|
110
122
|
*
|
|
111
123
|
* @ignore
|
|
112
124
|
*/
|
|
@@ -118,7 +130,7 @@ class AccessControlService {
|
|
|
118
130
|
return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
|
|
119
131
|
}
|
|
120
132
|
/**
|
|
121
|
-
* Utilizzato da hasACExpression
|
|
133
|
+
* Utilizzato da hasACExpression dentro eval
|
|
122
134
|
*
|
|
123
135
|
* @ignore
|
|
124
136
|
*/
|
|
@@ -135,15 +147,27 @@ class AccessControlService {
|
|
|
135
147
|
/**
|
|
136
148
|
* 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"
|
|
137
149
|
*/
|
|
138
|
-
has(expr) {
|
|
139
|
-
return this.hasACExpression(expr);
|
|
150
|
+
has(expr, absolute = false) {
|
|
151
|
+
return this.hasACExpression(expr, absolute);
|
|
140
152
|
}
|
|
141
153
|
}
|
|
142
|
-
AccessControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
143
|
-
AccessControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
144
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
154
|
+
AccessControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlService, deps: [{ token: ACC_DEF_COND, optional: true }, { token: ACC_DEF_COND_OP, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
155
|
+
AccessControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlService });
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlService, decorators: [{
|
|
145
157
|
type: Injectable
|
|
146
|
-
}], ctorParameters: function () {
|
|
158
|
+
}], ctorParameters: function () {
|
|
159
|
+
return [{ type: undefined, decorators: [{
|
|
160
|
+
type: Optional
|
|
161
|
+
}, {
|
|
162
|
+
type: Inject,
|
|
163
|
+
args: [ACC_DEF_COND]
|
|
164
|
+
}] }, { type: undefined, decorators: [{
|
|
165
|
+
type: Optional
|
|
166
|
+
}, {
|
|
167
|
+
type: Inject,
|
|
168
|
+
args: [ACC_DEF_COND_OP]
|
|
169
|
+
}] }];
|
|
170
|
+
} });
|
|
147
171
|
|
|
148
172
|
/**
|
|
149
173
|
* Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe
|
|
@@ -247,9 +271,9 @@ class AccessControlRouteGuard {
|
|
|
247
271
|
onRedirectInProgress() {
|
|
248
272
|
}
|
|
249
273
|
}
|
|
250
|
-
AccessControlRouteGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
251
|
-
AccessControlRouteGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
252
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
274
|
+
AccessControlRouteGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlRouteGuard, deps: [{ token: i1.MessageService }, { token: AccessControlService }, { token: i3.Router }, { token: ACC_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
275
|
+
AccessControlRouteGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlRouteGuard });
|
|
276
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlRouteGuard, decorators: [{
|
|
253
277
|
type: Injectable
|
|
254
278
|
}], ctorParameters: function () {
|
|
255
279
|
return [{ type: i1.MessageService }, { type: AccessControlService }, { type: i3.Router }, { type: undefined, decorators: [{
|
|
@@ -276,16 +300,19 @@ class AccessControlDirective {
|
|
|
276
300
|
this.templateRef = templateRef;
|
|
277
301
|
this.viewContainer = viewContainer;
|
|
278
302
|
this._ac = _ac;
|
|
303
|
+
/**
|
|
304
|
+
* Espressione da processare scritta come {Chiave}:{Valore}
|
|
305
|
+
*
|
|
306
|
+
* Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions.
|
|
307
|
+
*
|
|
308
|
+
* Nelle ultime versioni del template è anche presente di default la custom permission "X" che indica se l'applicaizone è Esterna o no
|
|
309
|
+
*/
|
|
310
|
+
this.ac = null;
|
|
311
|
+
/** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */
|
|
312
|
+
this.acAbsolute = false;
|
|
279
313
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
*
|
|
283
|
-
* @param {string} expression espressione da processare scritta come {Chiave}:{Valore}
|
|
284
|
-
*
|
|
285
|
-
* Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions
|
|
286
|
-
*/
|
|
287
|
-
set ac(expression) {
|
|
288
|
-
var allow = this._ac.has(expression);
|
|
314
|
+
ngOnInit() {
|
|
315
|
+
var allow = this._ac.has(this.ac, this.acAbsolute);
|
|
289
316
|
//Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template
|
|
290
317
|
if (allow)
|
|
291
318
|
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
@@ -293,15 +320,17 @@ class AccessControlDirective {
|
|
|
293
320
|
this.viewContainer.clear();
|
|
294
321
|
}
|
|
295
322
|
}
|
|
296
|
-
AccessControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
297
|
-
AccessControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.
|
|
298
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
323
|
+
AccessControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AccessControlService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
324
|
+
AccessControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: AccessControlDirective, selector: "[ac]", inputs: { ac: "ac", acAbsolute: "acAbsolute" }, ngImport: i0 });
|
|
325
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlDirective, decorators: [{
|
|
299
326
|
type: Directive,
|
|
300
327
|
args: [{
|
|
301
328
|
selector: '[ac]',
|
|
302
329
|
}]
|
|
303
330
|
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AccessControlService }]; }, propDecorators: { ac: [{
|
|
304
331
|
type: Input
|
|
332
|
+
}], acAbsolute: [{
|
|
333
|
+
type: Input
|
|
305
334
|
}] } });
|
|
306
335
|
|
|
307
336
|
/**
|
|
@@ -309,9 +338,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
|
|
|
309
338
|
*/
|
|
310
339
|
class ComponentContext {
|
|
311
340
|
}
|
|
312
|
-
ComponentContext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
313
|
-
ComponentContext.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
314
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
341
|
+
ComponentContext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ComponentContext, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
342
|
+
ComponentContext.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ComponentContext });
|
|
343
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ComponentContext, decorators: [{
|
|
315
344
|
type: Injectable
|
|
316
345
|
}] });
|
|
317
346
|
|
|
@@ -336,9 +365,9 @@ class ContextAwareDirective {
|
|
|
336
365
|
element.nativeElement.setAttribute("enabled", "true");
|
|
337
366
|
}
|
|
338
367
|
}
|
|
339
|
-
ContextAwareDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
340
|
-
ContextAwareDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.
|
|
341
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
368
|
+
ContextAwareDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ContextAwareDirective, deps: [{ token: i0.ElementRef }, { token: ComponentContext, optional: true }, { token: AccessControlService }, { token: ACC_CUSTOMKEY, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
369
|
+
ContextAwareDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ContextAwareDirective, selector: "[contextAware]", ngImport: i0 });
|
|
370
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ContextAwareDirective, decorators: [{
|
|
342
371
|
type: Directive,
|
|
343
372
|
args: [{
|
|
344
373
|
selector: '[contextAware]',
|
|
@@ -362,15 +391,17 @@ class AccessControlModule {
|
|
|
362
391
|
AccessControlService,
|
|
363
392
|
AccessControlRouteGuard,
|
|
364
393
|
{ provide: ACC_LOCALE, useValue: (config === null || config === void 0 ? void 0 : config.locale) || 'it-IT' },
|
|
365
|
-
{ provide: ACC_CUSTOMKEY, useValue: (config === null || config === void 0 ? void 0 : config.customKey) || null }
|
|
394
|
+
{ provide: ACC_CUSTOMKEY, useValue: (config === null || config === void 0 ? void 0 : config.customKey) || null },
|
|
395
|
+
{ provide: ACC_DEF_COND, useValue: (config === null || config === void 0 ? void 0 : config.defaultCondition) || null },
|
|
396
|
+
{ provide: ACC_DEF_COND_OP, useValue: (config === null || config === void 0 ? void 0 : config.defaultConditionLogicalOperator) || '||' }
|
|
366
397
|
]
|
|
367
398
|
};
|
|
368
399
|
}
|
|
369
400
|
}
|
|
370
|
-
AccessControlModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
371
|
-
AccessControlModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.
|
|
372
|
-
AccessControlModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.
|
|
373
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
401
|
+
AccessControlModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
402
|
+
AccessControlModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, declarations: [AccessControlDirective, ContextAwareDirective], imports: [LocalizationModule], exports: [AccessControlDirective, ContextAwareDirective] });
|
|
403
|
+
AccessControlModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, imports: [[LocalizationModule]] });
|
|
404
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, decorators: [{
|
|
374
405
|
type: NgModule,
|
|
375
406
|
args: [{
|
|
376
407
|
imports: [LocalizationModule],
|
|
@@ -393,5 +424,5 @@ class AccessControlModuleConfig {
|
|
|
393
424
|
* Generated bundle index. Do not edit.
|
|
394
425
|
*/
|
|
395
426
|
|
|
396
|
-
export { ACC_CUSTOMKEY, ACC_LOCALE, AccessControlDirective, AccessControlModule, AccessControlModuleConfig, AccessControlRouteGuard, AccessControlService, ComponentContext, ContextAwareDirective };
|
|
427
|
+
export { ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP, ACC_LOCALE, AccessControlDirective, AccessControlModule, AccessControlModuleConfig, AccessControlRouteGuard, AccessControlService, ComponentContext, ContextAwareDirective };
|
|
397
428
|
//# sourceMappingURL=esfaenza-access-control.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-access-control.mjs","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/**\r\n * Token che racchiude il locale scelto per l'applicazione\r\n */\r\nexport const ACC_LOCALE: InjectionToken<string> = new InjectionToken<string>('ACC_LOCALE');\r\n\r\n/**\r\n * Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext\r\n */\r\nexport const ACC_CUSTOMKEY: InjectionToken<string> = new InjectionToken<string>('ACC_CUSTOMKEY');","// Angular\r\nimport { Injectable } from \"@angular/core\";\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() { }\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 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 //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} 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 ]\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 /**\r\n * Chiave custom su cui la **contextAwareDirective** si basa per controllare se l'elemento è abilitato o meno\r\n */\r\n customKey: 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/context-aware.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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"esfaenza-access-control.mjs","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/context-aware.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"],"names":[],"mappings":"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"}
|
|
@@ -4,14 +4,14 @@ import { InjectionToken, Injectable, Optional, Inject, Directive, Input, NgModul
|
|
|
4
4
|
import * as i1 from '@esfaenza/extensions';
|
|
5
5
|
import * as i3 from '@angular/router';
|
|
6
6
|
|
|
7
|
-
/**
|
|
8
|
-
* Token che racchiude il locale scelto per l'applicazione
|
|
9
|
-
*/
|
|
7
|
+
/** Token che racchiude il locale scelto per l'applicazione */
|
|
10
8
|
const ACC_LOCALE = new InjectionToken('ACC_LOCALE');
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
*/
|
|
14
|
-
const
|
|
9
|
+
/** Token che racchiude la chiave custom da controllare quando si effettuano controlli sul ComponentContext */
|
|
10
|
+
const ACC_CUSTOMKEY = new InjectionToken('ACC_CUSTOMKEY');
|
|
11
|
+
/** Token che indica la condizione di default da aggiungere ai check utente */
|
|
12
|
+
const ACC_DEF_COND = new InjectionToken('ACC_DEF_COND');
|
|
13
|
+
/** Token che indica l'operatore della condizione di default da aggiungere ai check utente */
|
|
14
|
+
const ACC_DEF_COND_OP = new InjectionToken('ACC_DEF_COND_OP');
|
|
15
15
|
|
|
16
16
|
// Angular
|
|
17
17
|
/**
|
|
@@ -19,7 +19,9 @@ const ACC_CUSTOMKEY = new InjectionToken('ACC_CUSTOMKEY');
|
|
|
19
19
|
*/
|
|
20
20
|
class AccessControlService {
|
|
21
21
|
/** @ignore */
|
|
22
|
-
constructor() {
|
|
22
|
+
constructor(ACC_DEF_COND, ACC_DEF_COND_OP) {
|
|
23
|
+
this.ACC_DEF_COND = ACC_DEF_COND;
|
|
24
|
+
this.ACC_DEF_COND_OP = ACC_DEF_COND_OP;
|
|
23
25
|
/**
|
|
24
26
|
* Indica se l'Identity è stata inizializzata
|
|
25
27
|
*/
|
|
@@ -48,6 +50,12 @@ class AccessControlService {
|
|
|
48
50
|
* @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom
|
|
49
51
|
*/
|
|
50
52
|
initializeCustomPermissions(customPermissions) {
|
|
53
|
+
for (let i = 0; i < customPermissions.length; i++) {
|
|
54
|
+
if (customPermissions[i].key.length > 1) {
|
|
55
|
+
console.error("[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
51
59
|
this.taggedItemsCache = customPermissions;
|
|
52
60
|
this.InitializedCustom = true;
|
|
53
61
|
}
|
|
@@ -63,7 +71,7 @@ class AccessControlService {
|
|
|
63
71
|
*
|
|
64
72
|
* @ignore
|
|
65
73
|
*/
|
|
66
|
-
hasACExpression(expression) {
|
|
74
|
+
hasACExpression(expression, absolute = false) {
|
|
67
75
|
if (!this.Initialized)
|
|
68
76
|
console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
|
|
69
77
|
if (!expression)
|
|
@@ -72,7 +80,11 @@ class AccessControlService {
|
|
|
72
80
|
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
73
81
|
return true;
|
|
74
82
|
}
|
|
75
|
-
//
|
|
83
|
+
// Per le espressioni di visibilità "dirette" sulla X ignoro le condizioni di default perché sono condizioni fisiche piuttosto che logiche
|
|
84
|
+
// Significa che siamo o dentro o fuori da un iframe e questo ovviamente va a soprassedere eventuali condizioni logiche del tipo "sono Jace Admin"
|
|
85
|
+
if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute && expression != 'X:0' && expression != 'X:1')
|
|
86
|
+
expression = `(${expression}) ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND}`;
|
|
87
|
+
// Espressione già valutata, non serve rivalutarla
|
|
76
88
|
if (this.cache[expression])
|
|
77
89
|
return this.cache[expression];
|
|
78
90
|
var RolesPermissionsRegexp = /.:[^|&()]+/g;
|
|
@@ -94,7 +106,7 @@ class AccessControlService {
|
|
|
94
106
|
return ret;
|
|
95
107
|
}
|
|
96
108
|
/**
|
|
97
|
-
* Utilizzato da hasACExpression
|
|
109
|
+
* Utilizzato da hasACExpression dentro eval
|
|
98
110
|
*
|
|
99
111
|
* @ignore
|
|
100
112
|
*/
|
|
@@ -106,7 +118,7 @@ class AccessControlService {
|
|
|
106
118
|
return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
|
|
107
119
|
}
|
|
108
120
|
/**
|
|
109
|
-
* Utilizzato da hasACExpression
|
|
121
|
+
* Utilizzato da hasACExpression dentro eval
|
|
110
122
|
*
|
|
111
123
|
* @ignore
|
|
112
124
|
*/
|
|
@@ -118,7 +130,7 @@ class AccessControlService {
|
|
|
118
130
|
return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
|
|
119
131
|
}
|
|
120
132
|
/**
|
|
121
|
-
* Utilizzato da hasACExpression
|
|
133
|
+
* Utilizzato da hasACExpression dentro eval
|
|
122
134
|
*
|
|
123
135
|
* @ignore
|
|
124
136
|
*/
|
|
@@ -134,15 +146,25 @@ class AccessControlService {
|
|
|
134
146
|
/**
|
|
135
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"
|
|
136
148
|
*/
|
|
137
|
-
has(expr) {
|
|
138
|
-
return this.hasACExpression(expr);
|
|
149
|
+
has(expr, absolute = false) {
|
|
150
|
+
return this.hasACExpression(expr, absolute);
|
|
139
151
|
}
|
|
140
152
|
}
|
|
141
|
-
AccessControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
142
|
-
AccessControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
143
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
153
|
+
AccessControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlService, deps: [{ token: ACC_DEF_COND, optional: true }, { token: ACC_DEF_COND_OP, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
154
|
+
AccessControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlService });
|
|
155
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlService, decorators: [{
|
|
144
156
|
type: Injectable
|
|
145
|
-
}], ctorParameters: function () { return [
|
|
157
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
158
|
+
type: Optional
|
|
159
|
+
}, {
|
|
160
|
+
type: Inject,
|
|
161
|
+
args: [ACC_DEF_COND]
|
|
162
|
+
}] }, { type: undefined, decorators: [{
|
|
163
|
+
type: Optional
|
|
164
|
+
}, {
|
|
165
|
+
type: Inject,
|
|
166
|
+
args: [ACC_DEF_COND_OP]
|
|
167
|
+
}] }]; } });
|
|
146
168
|
|
|
147
169
|
/**
|
|
148
170
|
* Router Guard base per proteggere l'accesso alle route dell'applicazione. Per utilizzarla è sufficiente ereditarla e, nel costruttore della classe
|
|
@@ -246,9 +268,9 @@ class AccessControlRouteGuard {
|
|
|
246
268
|
onRedirectInProgress() {
|
|
247
269
|
}
|
|
248
270
|
}
|
|
249
|
-
AccessControlRouteGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
250
|
-
AccessControlRouteGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
251
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
271
|
+
AccessControlRouteGuard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlRouteGuard, deps: [{ token: i1.MessageService }, { token: AccessControlService }, { token: i3.Router }, { token: ACC_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
272
|
+
AccessControlRouteGuard.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlRouteGuard });
|
|
273
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlRouteGuard, decorators: [{
|
|
252
274
|
type: Injectable
|
|
253
275
|
}], ctorParameters: function () { return [{ type: i1.MessageService }, { type: AccessControlService }, { type: i3.Router }, { type: undefined, decorators: [{
|
|
254
276
|
type: Optional
|
|
@@ -273,16 +295,19 @@ class AccessControlDirective {
|
|
|
273
295
|
this.templateRef = templateRef;
|
|
274
296
|
this.viewContainer = viewContainer;
|
|
275
297
|
this._ac = _ac;
|
|
298
|
+
/**
|
|
299
|
+
* Espressione da processare scritta come {Chiave}:{Valore}
|
|
300
|
+
*
|
|
301
|
+
* Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions.
|
|
302
|
+
*
|
|
303
|
+
* Nelle ultime versioni del template è anche presente di default la custom permission "X" che indica se l'applicaizone è Esterna o no
|
|
304
|
+
*/
|
|
305
|
+
this.ac = null;
|
|
306
|
+
/** Indica che l'esporessione **ac** è assoluta, cioè che non può essere modificata internamente ad esempio per aggiungere condizioni di default */
|
|
307
|
+
this.acAbsolute = false;
|
|
276
308
|
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
*
|
|
280
|
-
* @param {string} expression espressione da processare scritta come {Chiave}:{Valore}
|
|
281
|
-
*
|
|
282
|
-
* Le {Chiave} disponibili sono di default "R" per i ruoli e "P" per i permessi. È possibile espanderle con le Custom Permissions
|
|
283
|
-
*/
|
|
284
|
-
set ac(expression) {
|
|
285
|
-
var allow = this._ac.has(expression);
|
|
309
|
+
ngOnInit() {
|
|
310
|
+
var allow = this._ac.has(this.ac, this.acAbsolute);
|
|
286
311
|
//Se ho i permessi, proseguo creando la vista nel DOM, altrimenti rimuovo il template
|
|
287
312
|
if (allow)
|
|
288
313
|
this.viewContainer.createEmbeddedView(this.templateRef);
|
|
@@ -290,15 +315,17 @@ class AccessControlDirective {
|
|
|
290
315
|
this.viewContainer.clear();
|
|
291
316
|
}
|
|
292
317
|
}
|
|
293
|
-
AccessControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
294
|
-
AccessControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.
|
|
295
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
318
|
+
AccessControlDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlDirective, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: AccessControlService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
319
|
+
AccessControlDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: AccessControlDirective, selector: "[ac]", inputs: { ac: "ac", acAbsolute: "acAbsolute" }, ngImport: i0 });
|
|
320
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlDirective, decorators: [{
|
|
296
321
|
type: Directive,
|
|
297
322
|
args: [{
|
|
298
323
|
selector: '[ac]',
|
|
299
324
|
}]
|
|
300
325
|
}], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: AccessControlService }]; }, propDecorators: { ac: [{
|
|
301
326
|
type: Input
|
|
327
|
+
}], acAbsolute: [{
|
|
328
|
+
type: Input
|
|
302
329
|
}] } });
|
|
303
330
|
|
|
304
331
|
/**
|
|
@@ -306,9 +333,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
|
|
|
306
333
|
*/
|
|
307
334
|
class ComponentContext {
|
|
308
335
|
}
|
|
309
|
-
ComponentContext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
310
|
-
ComponentContext.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.
|
|
311
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
336
|
+
ComponentContext.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ComponentContext, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
337
|
+
ComponentContext.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ComponentContext });
|
|
338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ComponentContext, decorators: [{
|
|
312
339
|
type: Injectable
|
|
313
340
|
}] });
|
|
314
341
|
|
|
@@ -333,9 +360,9 @@ class ContextAwareDirective {
|
|
|
333
360
|
element.nativeElement.setAttribute("enabled", "true");
|
|
334
361
|
}
|
|
335
362
|
}
|
|
336
|
-
ContextAwareDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
337
|
-
ContextAwareDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.
|
|
338
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
363
|
+
ContextAwareDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ContextAwareDirective, deps: [{ token: i0.ElementRef }, { token: ComponentContext, optional: true }, { token: AccessControlService }, { token: ACC_CUSTOMKEY, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
|
|
364
|
+
ContextAwareDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ContextAwareDirective, selector: "[contextAware]", ngImport: i0 });
|
|
365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ContextAwareDirective, decorators: [{
|
|
339
366
|
type: Directive,
|
|
340
367
|
args: [{
|
|
341
368
|
selector: '[contextAware]',
|
|
@@ -357,15 +384,17 @@ class AccessControlModule {
|
|
|
357
384
|
AccessControlService,
|
|
358
385
|
AccessControlRouteGuard,
|
|
359
386
|
{ provide: ACC_LOCALE, useValue: config?.locale || 'it-IT' },
|
|
360
|
-
{ provide: ACC_CUSTOMKEY, useValue: config?.customKey || null }
|
|
387
|
+
{ provide: ACC_CUSTOMKEY, useValue: config?.customKey || null },
|
|
388
|
+
{ provide: ACC_DEF_COND, useValue: config?.defaultCondition || null },
|
|
389
|
+
{ provide: ACC_DEF_COND_OP, useValue: config?.defaultConditionLogicalOperator || '||' }
|
|
361
390
|
]
|
|
362
391
|
};
|
|
363
392
|
}
|
|
364
393
|
}
|
|
365
|
-
AccessControlModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.
|
|
366
|
-
AccessControlModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.
|
|
367
|
-
AccessControlModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.
|
|
368
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.
|
|
394
|
+
AccessControlModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
395
|
+
AccessControlModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, declarations: [AccessControlDirective, ContextAwareDirective], imports: [LocalizationModule], exports: [AccessControlDirective, ContextAwareDirective] });
|
|
396
|
+
AccessControlModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, imports: [[LocalizationModule]] });
|
|
397
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AccessControlModule, decorators: [{
|
|
369
398
|
type: NgModule,
|
|
370
399
|
args: [{
|
|
371
400
|
imports: [LocalizationModule],
|
|
@@ -388,5 +417,5 @@ class AccessControlModuleConfig {
|
|
|
388
417
|
* Generated bundle index. Do not edit.
|
|
389
418
|
*/
|
|
390
419
|
|
|
391
|
-
export { ACC_CUSTOMKEY, ACC_LOCALE, AccessControlDirective, AccessControlModule, AccessControlModuleConfig, AccessControlRouteGuard, AccessControlService, ComponentContext, ContextAwareDirective };
|
|
420
|
+
export { ACC_CUSTOMKEY, ACC_DEF_COND, ACC_DEF_COND_OP, ACC_LOCALE, AccessControlDirective, AccessControlModule, AccessControlModuleConfig, AccessControlRouteGuard, AccessControlService, ComponentContext, ContextAwareDirective };
|
|
392
421
|
//# sourceMappingURL=esfaenza-access-control.mjs.map
|