@esfaenza/access-control 15.2.13 → 16.0.1
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 → esm2022}/esfaenza-access-control.mjs +4 -4
- package/{esm2020 → esm2022}/lib/AccessControlRouteGuard.mjs +102 -102
- package/{esm2020 → esm2022}/lib/access-control.directive.mjs +52 -52
- package/{esm2020 → esm2022}/lib/access-control.module.mjs +30 -30
- package/{esm2020 → esm2022}/lib/access-control.pipe.mjs +31 -31
- package/{esm2020 → esm2022}/lib/access-control.service.mjs +197 -197
- package/{esm2020 → esm2022}/lib/context-aware.directive.mjs +42 -42
- package/{esm2020 → esm2022}/lib/models/AccessControlModuleConfig.mjs +5 -5
- package/{esm2020 → esm2022}/lib/models/ComponentContext.mjs +13 -13
- package/{esm2020 → esm2022}/lib/tokens.mjs +9 -9
- package/{esm2020 → esm2022}/public-api.mjs +12 -12
- package/{fesm2020 → fesm2022}/esfaenza-access-control.mjs +445 -445
- package/fesm2022/esfaenza-access-control.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/AccessControlRouteGuard.d.ts +60 -60
- package/lib/access-control.directive.d.ts +32 -32
- package/lib/access-control.module.d.ts +12 -12
- package/lib/access-control.pipe.d.ts +22 -22
- package/lib/access-control.service.d.ts +84 -84
- package/lib/context-aware.directive.d.ts +22 -22
- package/lib/models/AccessControlModuleConfig.d.ts +13 -13
- package/lib/models/ComponentContext.d.ts +12 -12
- package/lib/tokens.d.ts +9 -9
- package/package.json +8 -14
- package/public-api.d.ts +9 -9
- package/fesm2015/esfaenza-access-control.mjs +0 -478
- package/fesm2015/esfaenza-access-control.mjs.map +0 -1
- package/fesm2020/esfaenza-access-control.mjs.map +0 -1
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Inject, Injectable, Optional } from "@angular/core";
|
|
3
|
-
import { ACC_DEF_COND, ACC_DEF_COND_OP } from "./tokens";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@esfaenza/extensions";
|
|
6
|
-
/**
|
|
7
|
-
* Entrypoint di tutte le operazioni esposte dalla libreria access-control
|
|
8
|
-
*/
|
|
9
|
-
export class AccessControlService {
|
|
10
|
-
/** @ignore */
|
|
11
|
-
constructor(ACC_DEF_COND, ACC_DEF_COND_OP, emb) {
|
|
12
|
-
this.ACC_DEF_COND = ACC_DEF_COND;
|
|
13
|
-
this.ACC_DEF_COND_OP = ACC_DEF_COND_OP;
|
|
14
|
-
this.emb = emb;
|
|
15
|
-
/**
|
|
16
|
-
* Indica se l'Identity è stata inizializzata
|
|
17
|
-
*/
|
|
18
|
-
this.Initialized = false;
|
|
19
|
-
/**
|
|
20
|
-
* Indica se sono state effettuate inizializzazioni di Custom Permissions
|
|
21
|
-
*/
|
|
22
|
-
this.InitializedCustom = false;
|
|
23
|
-
/** @ignore */
|
|
24
|
-
this.cache = {};
|
|
25
|
-
/** @ignore */
|
|
26
|
-
this.taggedItemsCache = [];
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Inizializza l'Identity del servizio con il modello specificato
|
|
30
|
-
*
|
|
31
|
-
* @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi
|
|
32
|
-
*/
|
|
33
|
-
initializeIdentity(identity) {
|
|
34
|
-
this.Identity = identity;
|
|
35
|
-
this.Initialized = true;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Inizializza i permessi Custom del servizio con il modello specificato
|
|
39
|
-
*
|
|
40
|
-
* @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom
|
|
41
|
-
*/
|
|
42
|
-
initializeCustomPermissions(customPermissions) {
|
|
43
|
-
for (let i = 0; i < customPermissions.length; i++) {
|
|
44
|
-
if (customPermissions[i].key.length > 1) {
|
|
45
|
-
console.error("[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.");
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// Custom permission sull'embedding aggiunta automaticamente se non presente
|
|
50
|
-
if (!customPermissions.find(t => t.key === "X"))
|
|
51
|
-
customPermissions.push({ key: "X", items: [this.emb.Embedded ? "1" : "0"] });
|
|
52
|
-
this.taggedItemsCache = customPermissions;
|
|
53
|
-
this.InitializedCustom = true;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity
|
|
57
|
-
*/
|
|
58
|
-
isLoggedIn() {
|
|
59
|
-
return !!this.Identity;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)
|
|
63
|
-
* Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P
|
|
64
|
-
*
|
|
65
|
-
* @ignore
|
|
66
|
-
*/
|
|
67
|
-
hasACExpression(expression, absolute = false) {
|
|
68
|
-
if (!this.Initialized)
|
|
69
|
-
console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
|
|
70
|
-
if (!expression)
|
|
71
|
-
return true;
|
|
72
|
-
if (!this.Identity) {
|
|
73
|
-
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
// Espressione già valutata, non serve rivalutarla
|
|
77
|
-
if (this.cache[expression])
|
|
78
|
-
return this.cache[expression];
|
|
79
|
-
var RolesPermissionsRegexp = /!?.:[^|&()]+/g;
|
|
80
|
-
var matches = expression.match(RolesPermissionsRegexp);
|
|
81
|
-
if (!matches)
|
|
82
|
-
throw "Espressione Access Control non valida: " + expression + ". Assicurarsi che sia scritta in modo corretto";
|
|
83
|
-
// Per condizioni dirette sull'embedding si considera sempre che siano operazioni assolute
|
|
84
|
-
if (expression == 'X:0' || expression == 'X:1')
|
|
85
|
-
absolute = true;
|
|
86
|
-
matches.forEach(t => {
|
|
87
|
-
var splits = t.split(':');
|
|
88
|
-
// Per ruoli e permessi, se ho condizioni di default e l'espressione non è assoluta, wrappo ogni elemento con le espressioni di default
|
|
89
|
-
// Per le custom permissions invece, dato che sono cose staccate da ruoli e permessi, non ha mai senso farlo
|
|
90
|
-
if (splits[0] == "R" || splits[0] == "!R") {
|
|
91
|
-
if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute) {
|
|
92
|
-
let tmpReplace = `(${t} ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND})`;
|
|
93
|
-
var matches2 = tmpReplace.match(RolesPermissionsRegexp);
|
|
94
|
-
matches2.forEach(t2 => {
|
|
95
|
-
var splits2 = t2.split(':');
|
|
96
|
-
if (splits2[0] == "R" || splits2[0] == "!R")
|
|
97
|
-
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasRole('" + splits2[1].trim() + "')");
|
|
98
|
-
else if (splits2[0] == "P" || splits2[0] == "!P")
|
|
99
|
-
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasPermission('" + splits2[1].trim() + "')");
|
|
100
|
-
else
|
|
101
|
-
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasCustom('" + splits2[1].trim() + "')");
|
|
102
|
-
});
|
|
103
|
-
expression = expression.replace(t.trim(), tmpReplace);
|
|
104
|
-
}
|
|
105
|
-
else
|
|
106
|
-
expression = expression.replace(t.trim(), (t.startsWith("!") ? '!' : '') + "this.hasRole('" + splits[1].trim() + "')");
|
|
107
|
-
}
|
|
108
|
-
else if (splits[0] == "P" || splits[0] == "!P") {
|
|
109
|
-
if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute) {
|
|
110
|
-
let tmpReplace = `(${t} ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND})`;
|
|
111
|
-
var matches2 = tmpReplace.match(RolesPermissionsRegexp);
|
|
112
|
-
matches2.forEach(t2 => {
|
|
113
|
-
var splits2 = t2.split(':');
|
|
114
|
-
if (splits2[0] == "R" || splits2[0] == "!R")
|
|
115
|
-
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasRole('" + splits2[1].trim() + "')");
|
|
116
|
-
else if (splits2[0] == "P" || splits2[0] == "!P")
|
|
117
|
-
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasPermission('" + splits2[1].trim() + "')");
|
|
118
|
-
else
|
|
119
|
-
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasCustom('" + splits2[1].trim() + "')");
|
|
120
|
-
});
|
|
121
|
-
expression = expression.replace(t.trim(), tmpReplace);
|
|
122
|
-
}
|
|
123
|
-
else
|
|
124
|
-
expression = expression.replace(t.trim(), (t.startsWith("!") ? '!' : '') + "this.hasPermission('" + splits[1].trim() + "')");
|
|
125
|
-
}
|
|
126
|
-
else
|
|
127
|
-
expression = expression.replace(t.trim(), (t.startsWith("!") ? '!' : '') + "this.hasCustom('" + splits[1].trim() + "', '" + ((t.startsWith("!") ? splits[0].trim().charAt(1) : splits[0].trim())) + "')");
|
|
128
|
-
});
|
|
129
|
-
var ret = eval(expression);
|
|
130
|
-
// Cache valore
|
|
131
|
-
this.cache[expression] = ret;
|
|
132
|
-
return ret;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Utilizzato da hasACExpression dentro eval
|
|
136
|
-
*
|
|
137
|
-
* @ignore
|
|
138
|
-
*/
|
|
139
|
-
hasRole(role) {
|
|
140
|
-
if (!this.Identity) {
|
|
141
|
-
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
142
|
-
return true;
|
|
143
|
-
}
|
|
144
|
-
return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Utilizzato da hasACExpression dentro eval
|
|
148
|
-
*
|
|
149
|
-
* @ignore
|
|
150
|
-
*/
|
|
151
|
-
hasPermission(permission) {
|
|
152
|
-
if (!this.Identity) {
|
|
153
|
-
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Utilizzato da hasACExpression dentro eval
|
|
160
|
-
*
|
|
161
|
-
* @ignore
|
|
162
|
-
*/
|
|
163
|
-
hasCustom(value, tag) {
|
|
164
|
-
var items = this.taggedItemsCache.find(t => t.key == tag)?.items;
|
|
165
|
-
if (!items)
|
|
166
|
-
return true;
|
|
167
|
-
else if (items.length == 0)
|
|
168
|
-
return false;
|
|
169
|
-
else {
|
|
170
|
-
var found = items.find(t => t == value);
|
|
171
|
-
return found != null && found != undefined;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* 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"
|
|
176
|
-
*/
|
|
177
|
-
has(expr, absolute = false) {
|
|
178
|
-
return this.hasACExpression(expr, absolute);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
184
|
-
type: Injectable,
|
|
185
|
-
args: [{ providedIn: "root" }]
|
|
186
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
187
|
-
type: Optional
|
|
188
|
-
}, {
|
|
189
|
-
type: Inject,
|
|
190
|
-
args: [ACC_DEF_COND]
|
|
191
|
-
}] }, { type: undefined, decorators: [{
|
|
192
|
-
type: Optional
|
|
193
|
-
}, {
|
|
194
|
-
type: Inject,
|
|
195
|
-
args: [ACC_DEF_COND_OP]
|
|
196
|
-
}] }, { type: i1.AppEmbeddingExtensions }]; } });
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FjY2Vzcy1jb250cm9sL3NyYy9saWIvYWNjZXNzLWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFJekQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBdUIvQixjQUFjO0lBQ2QsWUFBc0QsWUFBb0IsRUFBK0MsZUFBdUIsRUFBVSxHQUEyQjtRQUEvSCxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUErQyxvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQXdCO1FBdEJyTDs7V0FFRztRQUNJLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRXBDOztXQUVHO1FBQ0ksc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRTFDLGNBQWM7UUFDTixVQUFLLEdBQU8sRUFBRSxDQUFDO1FBRXZCLGNBQWM7UUFDTixxQkFBZ0IsR0FBdUMsRUFBRSxDQUFDO0lBUXVILENBQUM7SUFFMUw7Ozs7T0FJRztJQUNJLGtCQUFrQixDQUFDLFFBQW9EO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMkJBQTJCLENBQUMsaUJBQXFEO1FBQ3RGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FB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Q0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsSSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFNBQVMsQ0FBQyxLQUFhLEVBQUUsR0FBVztRQUMxQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUs7WUFDUixPQUFPLElBQUksQ0FBQzthQUNULElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ3hCLE9BQU8sS0FBSyxDQUFDO2FBQ1Y7WUFDSCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBO1lBQ3ZDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksU0FBUyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFDLElBQVksRUFBRSxXQUFvQixLQUFLO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7aUhBck1VLG9CQUFvQixrQkF3QkMsWUFBWSw2QkFBb0QsZUFBZTtxSEF4QnBHLG9CQUFvQixjQURSLE1BQU07MkZBQ2xCLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OzBCQXlCakIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxZQUFZOzswQkFBaUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQUNDX0RFRl9DT05ELCBBQ0NfREVGX0NPTkRfT1AgfSBmcm9tIFwiLi90b2tlbnNcIjtcclxuXHJcbmltcG9ydCB7IEFwcEVtYmVkZGluZ0V4dGVuc2lvbnMgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbi8qKlxyXG4gKiBFbnRyeXBvaW50IGRpIHR1dHRlIGxlIG9wZXJhemlvbmkgZXNwb3N0ZSBkYWxsYSBsaWJyZXJpYSBhY2Nlc3MtY29udHJvbFxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIEFjY2Vzc0NvbnRyb2xTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhIHNlIGwnSWRlbnRpdHkgw6ggc3RhdGEgaW5pemlhbGl6emF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2Ugc29ubyBzdGF0ZSBlZmZldHR1YXRlIGluaXppYWxpenphemlvbmkgZGkgQ3VzdG9tIFBlcm1pc3Npb25zXHJcbiAgICovXHJcbiAgcHVibGljIEluaXRpYWxpemVkQ3VzdG9tOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBjYWNoZToge30gPSB7fTtcclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIHRhZ2dlZEl0ZW1zQ2FjaGU6IHsga2V5OiBzdHJpbmcsIGl0ZW1zOiBzdHJpbmdbXSB9W10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogSWRlbnRpdHkgYXNzb2NpYXRhIGEgcXVlc3QnaXN0YW56YSBkZWwgU2Vydml6aW8gQWNjZXNzIENvbnRyb2wsIHV0aWxlIHNlIHNpIHZ1b2xlIGF2ZXJlIGFjY2Vzc28gYSBSdW9saSBlIFBlcm1lc3NpIGRpcmV0dGFtZW50ZSBkYSBxdWksIHBlciBxdWFsc2l2b2dsaWEgbW90aXZvXHJcbiAgICovXHJcbiAgcHVibGljIElkZW50aXR5OiB7IFJvbGVzOiBzdHJpbmdbXSwgUGVybWlzc2lvbnM6IHN0cmluZ1tdIH07XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChBQ0NfREVGX0NPTkQpIHByaXZhdGUgQUNDX0RFRl9DT05EOiBzdHJpbmcsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNDX0RFRl9DT05EX09QKSBwcml2YXRlIEFDQ19ERUZfQ09ORF9PUDogc3RyaW5nLCBwcml2YXRlIGVtYjogQXBwRW1iZWRkaW5nRXh0ZW5zaW9ucykgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXppYWxpenphIGwnSWRlbnRpdHkgZGVsIHNlcnZpemlvIGNvbiBpbCBtb2RlbGxvIHNwZWNpZmljYXRvXHJcbiAgICogXHJcbiAgICogQHBhcmFtcyB7eyBSb2xlczogc3RyaW5nW10sIFBlcm1pc3Npb25zOiBzdHJpbmdbXSB9fSBpZGVudGl0eSBJZGVudGl0w6AgYXBwbGljYXRpdmEgY29uIHJ1b2xpIGUgcGVybWVzc2lcclxuICAgKi9cclxuICBwdWJsaWMgaW5pdGlhbGl6ZUlkZW50aXR5KGlkZW50aXR5OiB7IFJvbGVzOiBzdHJpbmdbXSwgUGVybWlzc2lvbnM6IHN0cmluZ1tdIH0pIHtcclxuICAgIHRoaXMuSWRlbnRpdHkgPSBpZGVudGl0eTtcclxuICAgIHRoaXMuSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pemlhbGl6emEgaSBwZXJtZXNzaSBDdXN0b20gZGVsIHNlcnZpemlvIGNvbiBpbCBtb2RlbGxvIHNwZWNpZmljYXRvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHt7IGtleTogc3RyaW5nLCBpdGVtczogc3RyaW5nW10gfVtdfSBjdXN0b21QZXJtaXNzaW9ucyBQZXJtZXNzaSBDdXN0b21cclxuICAgKi9cclxuICBwdWJsaWMgaW5pdGlhbGl6ZUN1c3RvbVBlcm1pc3Npb25zKGN1c3RvbVBlcm1pc3Npb25zOiB7IGtleTogc3RyaW5nLCBpdGVtczogc3RyaW5nW10gfVtdKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1c3RvbVBlcm1pc3Npb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChjdXN0b21QZXJtaXNzaW9uc1tpXS5rZXkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXSBDdXN0b20gcGVybWlzc2lvbiBpbml0aWFsaXplZCB3aXRoIGtleXMgbG9uZ2VyIHRoYW4gYSBzaW5nbGUgY2hhcmFjdGVycy4gSWdub3JpbmcgRVZFUllUSElORy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3VzdG9tIHBlcm1pc3Npb24gc3VsbCdlbWJlZGRpbmcgYWdnaXVudGEgYXV0b21hdGljYW1lbnRlIHNlIG5vbiBwcmVzZW50ZVxyXG4gICAgaWYoIWN1c3RvbVBlcm1pc3Npb25zLmZpbmQodCA9PiB0LmtleSA9PT0gXCJYXCIpKVxyXG4gICAgICBjdXN0b21QZXJtaXNzaW9ucy5wdXNoKHsga2V5OiBcIlhcIiwgaXRlbXM6IFt0aGlzLmVtYi5FbWJlZGRlZCA/IFwiMVwiIDogXCIwXCJdIH0pO1xyXG5cclxuICAgIHRoaXMudGFnZ2VkSXRlbXNDYWNoZSA9IGN1c3RvbVBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy5Jbml0aWFsaXplZEN1c3RvbSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2UgbmVsbGEgc2Vzc2lvbmUgYXR0dWFsZSBlc2lzdGUgdW4gdXRlbnRlIGxvZ2dhdG8uIEZhIHVuIHNlbXBsaWNlIGNvbnRyb2xsbyBkaSBwcmVzZW56YSBzdWxsJ0lkZW50aXR5XHJcbiAgICovXHJcbiAgcHVibGljIGlzTG9nZ2VkSW4oKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLklkZW50aXR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwcmVzc2lvbiDDqCBzY3JpdHRhIHRpcG8gLS0+IFI6Um9sZTEgJiYgUDpQZXJtaXNzaW9uMSB8fCAoUjpSb2xlMiAmJiBQOlBlcm1pc3Npb24xKVxyXG4gICAqIFF1aW5kaSBwaXV0dG9zdG8gY2hlIGltcGxlbWVudGFyc2kgdW4gcGFyc2VyIGRlbGxhIG1hZG9ubmEgaW4gc3RpbGUgQWxlc3NhbmRybyBwcmVuZG8gbGEgc3RyYWRhIHN0cm9uemEgZSB2ZWxvY2UgY29uIGwnZXZhbCA6UFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0FDRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5Jbml0aWFsaXplZClcclxuICAgICAgY29uc29sZS5lcnJvcihcIkFjY2VzcyBDb250cm9sIFN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENhbGwgdGhpcy5hY2Nlc3NDb250cm9sLmluaXRpYWxpemUoLi4uLCAuLi4pIGJlZm9yZSB1c2luZyB0aGUgc2VydmljZVwiKTtcclxuXHJcbiAgICBpZiAoIWV4cHJlc3Npb24pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXNwcmVzc2lvbmUgZ2nDoCB2YWx1dGF0YSwgbm9uIHNlcnZlIHJpdmFsdXRhcmxhXHJcbiAgICBpZiAodGhpcy5jYWNoZVtleHByZXNzaW9uXSlcclxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVbZXhwcmVzc2lvbl07XHJcblxyXG4gICAgdmFyIFJvbGVzUGVybWlzc2lvbnNSZWdleHAgPSAvIT8uOltefCYoKV0rL2c7XHJcblxyXG4gICAgdmFyIG1hdGNoZXMgPSBleHByZXNzaW9uLm1hdGNoKFJvbGVzUGVybWlzc2lvbnNSZWdleHApO1xyXG5cclxuICAgIGlmICghbWF0Y2hlcylcclxuICAgICAgdGhyb3cgXCJFc3ByZXNzaW9uZSBBY2Nlc3MgQ29udHJvbCBub24gdmFsaWRhOiBcIiArIGV4cHJlc3Npb24gKyBcIi4gQXNzaWN1cmFyc2kgY2hlIHNpYSBzY3JpdHRhIGluIG1vZG8gY29ycmV0dG9cIjtcclxuXHJcbiAgICAvLyBQZXIgY29uZGl6aW9uaSBkaXJldHRlIHN1bGwnZW1iZWRkaW5nIHNpIGNvbnNpZGVyYSBzZW1wcmUgY2hlIHNpYW5vIG9wZXJhemlvbmkgYXNzb2x1dGVcclxuICAgIGlmIChleHByZXNzaW9uID09ICdYOjAnIHx8IGV4cHJlc3Npb24gPT0gJ1g6MScpXHJcbiAgICAgIGFic29sdXRlID0gdHJ1ZTtcclxuXHJcbiAgICBtYXRjaGVzLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBzcGxpdHMgPSB0LnNwbGl0KCc6Jyk7XHJcbiAgICAgIC8vIFBlciBydW9saSBlIHBlcm1lc3NpLCBzZSBobyBjb25kaXppb25pIGRpIGRlZmF1bHQgZSBsJ2VzcHJlc3Npb25lIG5vbiDDqCBhc3NvbHV0YSwgd3JhcHBvIG9nbmkgZWxlbWVudG8gY29uIGxlIGVzcHJlc3Npb25pIGRpIGRlZmF1bHRcclxuICAgICAgLy8gUGVyIGxlIGN1c3RvbSBwZXJtaXNzaW9ucyBpbnZlY2UsIGRhdG8gY2hlIHNvbm8gY29zZSBzdGFjY2F0ZSBkYSBydW9saSBlIHBlcm1lc3NpLCBub24gaGEgbWFpIHNlbnNvIGZhcmxvXHJcbiAgICAgIGlmIChzcGxpdHNbMF0gPT0gXCJSXCIgfHwgc3BsaXRzWzBdID09IFwiIVJcIikge1xyXG4gICAgICAgIGlmICh0aGlzLkFDQ19ERUZfQ09ORCAmJiB0aGlzLkFDQ19ERUZfQ09ORF9PUCAmJiAhYWJzb2x1dGUpIHtcclxuICAgICAgICAgIGxldCB0bXBSZXBsYWNlID0gYCgke3R9ICR7dGhpcy5BQ0NfREVGX0NPTkRfT1B9ICR7dGhpcy5BQ0NfREVGX0NPTkR9KWBcclxuICAgICAgICAgIHZhciBtYXRjaGVzMiA9IHRtcFJlcGxhY2UubWF0Y2goUm9sZXNQZXJtaXNzaW9uc1JlZ2V4cCk7XHJcblxyXG4gICAgICAgICAgbWF0Y2hlczIuZm9yRWFjaCh0MiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzcGxpdHMyID0gdDIuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgaWYgKHNwbGl0czJbMF0gPT0gXCJSXCIgfHwgc3BsaXRzMlswXSA9PSBcIiFSXCIpIFxyXG4gICAgICAgICAgICAgIHRtcFJlcGxhY2UgPSB0bXBSZXBsYWNlLnJlcGxhY2UodDIudHJpbSgpLCAodDIuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUm9sZSgnXCIgKyBzcGxpdHMyWzFdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICAgICAgICAgIGVsc2UgaWYoc3BsaXRzMlswXSA9PSBcIlBcIiB8fCBzcGxpdHMyWzBdID09IFwiIVBcIilcclxuICAgICAgICAgICAgICB0bXBSZXBsYWNlID0gdG1wUmVwbGFjZS5yZXBsYWNlKHQyLnRyaW0oKSwgKHQyLnN0YXJ0c1dpdGgoXCIhXCIpID8gJyEnIDogJycpICsgXCJ0aGlzLmhhc1Blcm1pc3Npb24oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdG1wUmVwbGFjZSA9IHRtcFJlcGxhY2UucmVwbGFjZSh0Mi50cmltKCksICh0Mi5zdGFydHNXaXRoKFwiIVwiKSA/ICchJyA6ICcnKSArIFwidGhpcy5oYXNDdXN0b20oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKHQudHJpbSgpLCB0bXBSZXBsYWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgKHQuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUm9sZSgnXCIgKyBzcGxpdHNbMV0udHJpbSgpICsgXCInKVwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChzcGxpdHNbMF0gPT0gXCJQXCIgfHwgc3BsaXRzWzBdID09IFwiIVBcIikge1xyXG4gICAgICAgIGlmICh0aGlzLkFDQ19ERUZfQ09ORCAmJiB0aGlzLkFDQ19ERUZfQ09ORF9PUCAmJiAhYWJzb2x1dGUpIHtcclxuICAgICAgICAgIGxldCB0bXBSZXBsYWNlID0gYCgke3R9ICR7dGhpcy5BQ0NfREVGX0NPTkRfT1B9ICR7dGhpcy5BQ0NfREVGX0NPTkR9KWBcclxuICAgICAgICAgIHZhciBtYXRjaGVzMiA9IHRtcFJlcGxhY2UubWF0Y2goUm9sZXNQZXJtaXNzaW9uc1JlZ2V4cCk7XHJcblxyXG4gICAgICAgICAgbWF0Y2hlczIuZm9yRWFjaCh0MiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzcGxpdHMyID0gdDIuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgaWYgKHNwbGl0czJbMF0gPT0gXCJSXCIgfHwgc3BsaXRzMlswXSA9PSBcIiFSXCIpIFxyXG4gICAgICAgICAgICAgIHRtcFJlcGxhY2UgPSB0bXBSZXBsYWNlLnJlcGxhY2UodDIudHJpbSgpLCAodDIuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUm9sZSgnXCIgKyBzcGxpdHMyWzFdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICAgICAgICAgIGVsc2UgaWYoc3BsaXRzMlswXSA9PSBcIlBcIiB8fCBzcGxpdHMyWzBdID09IFwiIVBcIilcclxuICAgICAgICAgICAgICB0bXBSZXBsYWNlID0gdG1wUmVwbGFjZS5yZXBsYWNlKHQyLnRyaW0oKSwgKHQyLnN0YXJ0c1dpdGgoXCIhXCIpID8gJyEnIDogJycpICsgXCJ0aGlzLmhhc1Blcm1pc3Npb24oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdG1wUmVwbGFjZSA9IHRtcFJlcGxhY2UucmVwbGFjZSh0Mi50cmltKCksICh0Mi5zdGFydHNXaXRoKFwiIVwiKSA/ICchJyA6ICcnKSArIFwidGhpcy5oYXNDdXN0b20oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKHQudHJpbSgpLCB0bXBSZXBsYWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgKHQuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUGVybWlzc2lvbignXCIgKyBzcGxpdHNbMV0udHJpbSgpICsgXCInKVwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgKHQuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzQ3VzdG9tKCdcIiArIHNwbGl0c1sxXS50cmltKCkgKyBcIicsICdcIiArICgodC5zdGFydHNXaXRoKFwiIVwiKSA/IHNwbGl0c1swXS50cmltKCkuY2hhckF0KDEpIDogc3BsaXRzWzBdLnRyaW0oKSkpICsgXCInKVwiKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciByZXQgPSA8Ym9vbGVhbj5ldmFsKGV4cHJlc3Npb24pO1xyXG4gICAgLy8gQ2FjaGUgdmFsb3JlXHJcbiAgICB0aGlzLmNhY2hlW2V4cHJlc3Npb25dID0gcmV0O1xyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFV0aWxpenphdG8gZGEgaGFzQUNFeHByZXNzaW9uIGRlbnRybyBldmFsXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5JZGVudGl0eS5Sb2xlcyAmJiB0aGlzLklkZW50aXR5LlJvbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy5JZGVudGl0eS5Sb2xlcy5pbmRleE9mKHJvbGUpICE9IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXRpbGl6emF0byBkYSBoYXNBQ0V4cHJlc3Npb24gZGVudHJvIGV2YWxcclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLklkZW50aXR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkVsZW1lbnRvIElkZW50aXR5IG5vbiBzcGVjaWZpY2F0byBpbiBBY2Nlc3MgQ29udHJvbC4gR2xpIGFjY2Vzc2kgc2FyYW5ubyB0dXR0aSBsaWJlcmkgZGkgZGVmYXVsdFwiKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLklkZW50aXR5LlBlcm1pc3Npb25zICYmIHRoaXMuSWRlbnRpdHkuUGVybWlzc2lvbnMubGVuZ3RoID4gMCAmJiB0aGlzLklkZW50aXR5LlBlcm1pc3Npb25zLmluZGV4T2YocGVybWlzc2lvbikgIT0gLTE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVdGlsaXp6YXRvIGRhIGhhc0FDRXhwcmVzc2lvbiBkZW50cm8gZXZhbFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0N1c3RvbSh2YWx1ZTogc3RyaW5nLCB0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdmFyIGl0ZW1zID0gdGhpcy50YWdnZWRJdGVtc0NhY2hlLmZpbmQodCA9PiB0LmtleSA9PSB0YWcpPy5pdGVtcztcclxuICAgIGlmICghaXRlbXMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgZWxzZSBpZiAoaXRlbXMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB2YXIgZm91bmQgPSBpdGVtcy5maW5kKHQgPT4gdCA9PSB2YWx1ZSlcclxuICAgICAgcmV0dXJuIGZvdW5kICE9IG51bGwgJiYgZm91bmQgIT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW50cnkgcG9pbnQgY2hlIGNvbnRyb2xsYSB1bidlc3ByZXNzaW9uZSBpZGVudGlmaWNhbnRlIHVuIHBlcm1lc3NvLCBhZCBlc2VtcGlvIFwiUDp2aXN1YWxpenphemlvbmVcIiBjb250cm9sbGEgY2hlIGwndXRlbnRlIGNvbGxlZ2F0byBhYmJpYSB1biBwZXJtZXNzbyBjaGUgc2kgY2hpYW1hIFwidmlzdWFsaXp6YXppb25lXCJcclxuICAgKi9cclxuICBwdWJsaWMgaGFzKGV4cHI6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzQUNFeHByZXNzaW9uKGV4cHIsIGFic29sdXRlKTtcclxuICB9XHJcbn0iXX0=
|
|
1
|
+
// Angular
|
|
2
|
+
import { Inject, Injectable, Optional } from "@angular/core";
|
|
3
|
+
import { ACC_DEF_COND, ACC_DEF_COND_OP } from "./tokens";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@esfaenza/extensions";
|
|
6
|
+
/**
|
|
7
|
+
* Entrypoint di tutte le operazioni esposte dalla libreria access-control
|
|
8
|
+
*/
|
|
9
|
+
export class AccessControlService {
|
|
10
|
+
/** @ignore */
|
|
11
|
+
constructor(ACC_DEF_COND, ACC_DEF_COND_OP, emb) {
|
|
12
|
+
this.ACC_DEF_COND = ACC_DEF_COND;
|
|
13
|
+
this.ACC_DEF_COND_OP = ACC_DEF_COND_OP;
|
|
14
|
+
this.emb = emb;
|
|
15
|
+
/**
|
|
16
|
+
* Indica se l'Identity è stata inizializzata
|
|
17
|
+
*/
|
|
18
|
+
this.Initialized = false;
|
|
19
|
+
/**
|
|
20
|
+
* Indica se sono state effettuate inizializzazioni di Custom Permissions
|
|
21
|
+
*/
|
|
22
|
+
this.InitializedCustom = false;
|
|
23
|
+
/** @ignore */
|
|
24
|
+
this.cache = {};
|
|
25
|
+
/** @ignore */
|
|
26
|
+
this.taggedItemsCache = [];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Inizializza l'Identity del servizio con il modello specificato
|
|
30
|
+
*
|
|
31
|
+
* @params {{ Roles: string[], Permissions: string[] }} identity Identità applicativa con ruoli e permessi
|
|
32
|
+
*/
|
|
33
|
+
initializeIdentity(identity) {
|
|
34
|
+
this.Identity = identity;
|
|
35
|
+
this.Initialized = true;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Inizializza i permessi Custom del servizio con il modello specificato
|
|
39
|
+
*
|
|
40
|
+
* @param {{ key: string, items: string[] }[]} customPermissions Permessi Custom
|
|
41
|
+
*/
|
|
42
|
+
initializeCustomPermissions(customPermissions) {
|
|
43
|
+
for (let i = 0; i < customPermissions.length; i++) {
|
|
44
|
+
if (customPermissions[i].key.length > 1) {
|
|
45
|
+
console.error("[@esfaenza/access-control] Custom permission initialized with keys longer than a single characters. Ignoring EVERYTHING.");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Custom permission sull'embedding aggiunta automaticamente se non presente
|
|
50
|
+
if (!customPermissions.find(t => t.key === "X"))
|
|
51
|
+
customPermissions.push({ key: "X", items: [this.emb.Embedded ? "1" : "0"] });
|
|
52
|
+
this.taggedItemsCache = customPermissions;
|
|
53
|
+
this.InitializedCustom = true;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Indica se nella sessione attuale esiste un utente loggato. Fa un semplice controllo di presenza sull'Identity
|
|
57
|
+
*/
|
|
58
|
+
isLoggedIn() {
|
|
59
|
+
return !!this.Identity;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Expression è scritta tipo --> R:Role1 && P:Permission1 || (R:Role2 && P:Permission1)
|
|
63
|
+
* Quindi piuttosto che implementarsi un parser della madonna in stile Alessandro prendo la strada stronza e veloce con l'eval :P
|
|
64
|
+
*
|
|
65
|
+
* @ignore
|
|
66
|
+
*/
|
|
67
|
+
hasACExpression(expression, absolute = false) {
|
|
68
|
+
if (!this.Initialized)
|
|
69
|
+
console.error("Access Control System has not been initialized. Call this.accessControl.initialize(..., ...) before using the service");
|
|
70
|
+
if (!expression)
|
|
71
|
+
return true;
|
|
72
|
+
if (!this.Identity) {
|
|
73
|
+
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
// Espressione già valutata, non serve rivalutarla
|
|
77
|
+
if (this.cache[expression])
|
|
78
|
+
return this.cache[expression];
|
|
79
|
+
var RolesPermissionsRegexp = /!?.:[^|&()]+/g;
|
|
80
|
+
var matches = expression.match(RolesPermissionsRegexp);
|
|
81
|
+
if (!matches)
|
|
82
|
+
throw "Espressione Access Control non valida: " + expression + ". Assicurarsi che sia scritta in modo corretto";
|
|
83
|
+
// Per condizioni dirette sull'embedding si considera sempre che siano operazioni assolute
|
|
84
|
+
if (expression == 'X:0' || expression == 'X:1')
|
|
85
|
+
absolute = true;
|
|
86
|
+
matches.forEach(t => {
|
|
87
|
+
var splits = t.split(':');
|
|
88
|
+
// Per ruoli e permessi, se ho condizioni di default e l'espressione non è assoluta, wrappo ogni elemento con le espressioni di default
|
|
89
|
+
// Per le custom permissions invece, dato che sono cose staccate da ruoli e permessi, non ha mai senso farlo
|
|
90
|
+
if (splits[0] == "R" || splits[0] == "!R") {
|
|
91
|
+
if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute) {
|
|
92
|
+
let tmpReplace = `(${t} ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND})`;
|
|
93
|
+
var matches2 = tmpReplace.match(RolesPermissionsRegexp);
|
|
94
|
+
matches2.forEach(t2 => {
|
|
95
|
+
var splits2 = t2.split(':');
|
|
96
|
+
if (splits2[0] == "R" || splits2[0] == "!R")
|
|
97
|
+
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasRole('" + splits2[1].trim() + "')");
|
|
98
|
+
else if (splits2[0] == "P" || splits2[0] == "!P")
|
|
99
|
+
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasPermission('" + splits2[1].trim() + "')");
|
|
100
|
+
else
|
|
101
|
+
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasCustom('" + splits2[1].trim() + "')");
|
|
102
|
+
});
|
|
103
|
+
expression = expression.replace(t.trim(), tmpReplace);
|
|
104
|
+
}
|
|
105
|
+
else
|
|
106
|
+
expression = expression.replace(t.trim(), (t.startsWith("!") ? '!' : '') + "this.hasRole('" + splits[1].trim() + "')");
|
|
107
|
+
}
|
|
108
|
+
else if (splits[0] == "P" || splits[0] == "!P") {
|
|
109
|
+
if (this.ACC_DEF_COND && this.ACC_DEF_COND_OP && !absolute) {
|
|
110
|
+
let tmpReplace = `(${t} ${this.ACC_DEF_COND_OP} ${this.ACC_DEF_COND})`;
|
|
111
|
+
var matches2 = tmpReplace.match(RolesPermissionsRegexp);
|
|
112
|
+
matches2.forEach(t2 => {
|
|
113
|
+
var splits2 = t2.split(':');
|
|
114
|
+
if (splits2[0] == "R" || splits2[0] == "!R")
|
|
115
|
+
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasRole('" + splits2[1].trim() + "')");
|
|
116
|
+
else if (splits2[0] == "P" || splits2[0] == "!P")
|
|
117
|
+
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasPermission('" + splits2[1].trim() + "')");
|
|
118
|
+
else
|
|
119
|
+
tmpReplace = tmpReplace.replace(t2.trim(), (t2.startsWith("!") ? '!' : '') + "this.hasCustom('" + splits2[1].trim() + "')");
|
|
120
|
+
});
|
|
121
|
+
expression = expression.replace(t.trim(), tmpReplace);
|
|
122
|
+
}
|
|
123
|
+
else
|
|
124
|
+
expression = expression.replace(t.trim(), (t.startsWith("!") ? '!' : '') + "this.hasPermission('" + splits[1].trim() + "')");
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
expression = expression.replace(t.trim(), (t.startsWith("!") ? '!' : '') + "this.hasCustom('" + splits[1].trim() + "', '" + ((t.startsWith("!") ? splits[0].trim().charAt(1) : splits[0].trim())) + "')");
|
|
128
|
+
});
|
|
129
|
+
var ret = eval(expression);
|
|
130
|
+
// Cache valore
|
|
131
|
+
this.cache[expression] = ret;
|
|
132
|
+
return ret;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Utilizzato da hasACExpression dentro eval
|
|
136
|
+
*
|
|
137
|
+
* @ignore
|
|
138
|
+
*/
|
|
139
|
+
hasRole(role) {
|
|
140
|
+
if (!this.Identity) {
|
|
141
|
+
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
return this.Identity.Roles && this.Identity.Roles.length > 0 && this.Identity.Roles.indexOf(role) != -1;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Utilizzato da hasACExpression dentro eval
|
|
148
|
+
*
|
|
149
|
+
* @ignore
|
|
150
|
+
*/
|
|
151
|
+
hasPermission(permission) {
|
|
152
|
+
if (!this.Identity) {
|
|
153
|
+
console.warn("Elemento Identity non specificato in Access Control. Gli accessi saranno tutti liberi di default");
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
return this.Identity.Permissions && this.Identity.Permissions.length > 0 && this.Identity.Permissions.indexOf(permission) != -1;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Utilizzato da hasACExpression dentro eval
|
|
160
|
+
*
|
|
161
|
+
* @ignore
|
|
162
|
+
*/
|
|
163
|
+
hasCustom(value, tag) {
|
|
164
|
+
var items = this.taggedItemsCache.find(t => t.key == tag)?.items;
|
|
165
|
+
if (!items)
|
|
166
|
+
return true;
|
|
167
|
+
else if (items.length == 0)
|
|
168
|
+
return false;
|
|
169
|
+
else {
|
|
170
|
+
var found = items.find(t => t == value);
|
|
171
|
+
return found != null && found != undefined;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* 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"
|
|
176
|
+
*/
|
|
177
|
+
has(expr, absolute = false) {
|
|
178
|
+
return this.hasACExpression(expr, absolute);
|
|
179
|
+
}
|
|
180
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AccessControlService, deps: [{ token: ACC_DEF_COND, optional: true }, { token: ACC_DEF_COND_OP, optional: true }, { token: i1.AppEmbeddingExtensions }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
181
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AccessControlService, providedIn: "root" }); }
|
|
182
|
+
}
|
|
183
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AccessControlService, decorators: [{
|
|
184
|
+
type: Injectable,
|
|
185
|
+
args: [{ providedIn: "root" }]
|
|
186
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
187
|
+
type: Optional
|
|
188
|
+
}, {
|
|
189
|
+
type: Inject,
|
|
190
|
+
args: [ACC_DEF_COND]
|
|
191
|
+
}] }, { type: undefined, decorators: [{
|
|
192
|
+
type: Optional
|
|
193
|
+
}, {
|
|
194
|
+
type: Inject,
|
|
195
|
+
args: [ACC_DEF_COND_OP]
|
|
196
|
+
}] }, { type: i1.AppEmbeddingExtensions }]; } });
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjZXNzLWNvbnRyb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FjY2Vzcy1jb250cm9sL3NyYy9saWIvYWNjZXNzLWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDOzs7QUFJekQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBdUIvQixjQUFjO0lBQ2QsWUFBc0QsWUFBb0IsRUFBK0MsZUFBdUIsRUFBVSxHQUEyQjtRQUEvSCxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUErQyxvQkFBZSxHQUFmLGVBQWUsQ0FBUTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQXdCO1FBdEJyTDs7V0FFRztRQUNJLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRXBDOztXQUVHO1FBQ0ksc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBRTFDLGNBQWM7UUFDTixVQUFLLEdBQU8sRUFBRSxDQUFDO1FBRXZCLGNBQWM7UUFDTixxQkFBZ0IsR0FBdUMsRUFBRSxDQUFDO0lBUXVILENBQUM7SUFFMUw7Ozs7T0FJRztJQUNJLGtCQUFrQixDQUFDLFFBQW9EO1FBQzVFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMkJBQTJCLENBQUMsaUJBQXFEO1FBQ3RGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FB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Q0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsSSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFNBQVMsQ0FBQyxLQUFhLEVBQUUsR0FBVztRQUMxQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDakUsSUFBSSxDQUFDLEtBQUs7WUFDUixPQUFPLElBQUksQ0FBQzthQUNULElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ3hCLE9BQU8sS0FBSyxDQUFDO2FBQ1Y7WUFDSCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBO1lBQ3ZDLE9BQU8sS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksU0FBUyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFDLElBQVksRUFBRSxXQUFvQixLQUFLO1FBQ2hELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQzsrR0FyTVUsb0JBQW9CLGtCQXdCQyxZQUFZLDZCQUFvRCxlQUFlO21IQXhCcEcsb0JBQW9CLGNBRFIsTUFBTTs7NEZBQ2xCLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUM7OzBCQXlCakIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxZQUFZOzswQkFBaUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQUNDX0RFRl9DT05ELCBBQ0NfREVGX0NPTkRfT1AgfSBmcm9tIFwiLi90b2tlbnNcIjtcclxuXHJcbmltcG9ydCB7IEFwcEVtYmVkZGluZ0V4dGVuc2lvbnMgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbi8qKlxyXG4gKiBFbnRyeXBvaW50IGRpIHR1dHRlIGxlIG9wZXJhemlvbmkgZXNwb3N0ZSBkYWxsYSBsaWJyZXJpYSBhY2Nlc3MtY29udHJvbFxyXG4gKi9cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46IFwicm9vdFwifSlcclxuZXhwb3J0IGNsYXNzIEFjY2Vzc0NvbnRyb2xTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogSW5kaWNhIHNlIGwnSWRlbnRpdHkgw6ggc3RhdGEgaW5pemlhbGl6emF0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2Ugc29ubyBzdGF0ZSBlZmZldHR1YXRlIGluaXppYWxpenphemlvbmkgZGkgQ3VzdG9tIFBlcm1pc3Npb25zXHJcbiAgICovXHJcbiAgcHVibGljIEluaXRpYWxpemVkQ3VzdG9tOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgcHJpdmF0ZSBjYWNoZToge30gPSB7fTtcclxuXHJcbiAgLyoqIEBpZ25vcmUgKi9cclxuICBwcml2YXRlIHRhZ2dlZEl0ZW1zQ2FjaGU6IHsga2V5OiBzdHJpbmcsIGl0ZW1zOiBzdHJpbmdbXSB9W10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogSWRlbnRpdHkgYXNzb2NpYXRhIGEgcXVlc3QnaXN0YW56YSBkZWwgU2Vydml6aW8gQWNjZXNzIENvbnRyb2wsIHV0aWxlIHNlIHNpIHZ1b2xlIGF2ZXJlIGFjY2Vzc28gYSBSdW9saSBlIFBlcm1lc3NpIGRpcmV0dGFtZW50ZSBkYSBxdWksIHBlciBxdWFsc2l2b2dsaWEgbW90aXZvXHJcbiAgICovXHJcbiAgcHVibGljIElkZW50aXR5OiB7IFJvbGVzOiBzdHJpbmdbXSwgUGVybWlzc2lvbnM6IHN0cmluZ1tdIH07XHJcblxyXG4gIC8qKiBAaWdub3JlICovXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChBQ0NfREVGX0NPTkQpIHByaXZhdGUgQUNDX0RFRl9DT05EOiBzdHJpbmcsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNDX0RFRl9DT05EX09QKSBwcml2YXRlIEFDQ19ERUZfQ09ORF9PUDogc3RyaW5nLCBwcml2YXRlIGVtYjogQXBwRW1iZWRkaW5nRXh0ZW5zaW9ucykgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXppYWxpenphIGwnSWRlbnRpdHkgZGVsIHNlcnZpemlvIGNvbiBpbCBtb2RlbGxvIHNwZWNpZmljYXRvXHJcbiAgICogXHJcbiAgICogQHBhcmFtcyB7eyBSb2xlczogc3RyaW5nW10sIFBlcm1pc3Npb25zOiBzdHJpbmdbXSB9fSBpZGVudGl0eSBJZGVudGl0w6AgYXBwbGljYXRpdmEgY29uIHJ1b2xpIGUgcGVybWVzc2lcclxuICAgKi9cclxuICBwdWJsaWMgaW5pdGlhbGl6ZUlkZW50aXR5KGlkZW50aXR5OiB7IFJvbGVzOiBzdHJpbmdbXSwgUGVybWlzc2lvbnM6IHN0cmluZ1tdIH0pIHtcclxuICAgIHRoaXMuSWRlbnRpdHkgPSBpZGVudGl0eTtcclxuICAgIHRoaXMuSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pemlhbGl6emEgaSBwZXJtZXNzaSBDdXN0b20gZGVsIHNlcnZpemlvIGNvbiBpbCBtb2RlbGxvIHNwZWNpZmljYXRvXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHt7IGtleTogc3RyaW5nLCBpdGVtczogc3RyaW5nW10gfVtdfSBjdXN0b21QZXJtaXNzaW9ucyBQZXJtZXNzaSBDdXN0b21cclxuICAgKi9cclxuICBwdWJsaWMgaW5pdGlhbGl6ZUN1c3RvbVBlcm1pc3Npb25zKGN1c3RvbVBlcm1pc3Npb25zOiB7IGtleTogc3RyaW5nLCBpdGVtczogc3RyaW5nW10gfVtdKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1c3RvbVBlcm1pc3Npb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChjdXN0b21QZXJtaXNzaW9uc1tpXS5rZXkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXSBDdXN0b20gcGVybWlzc2lvbiBpbml0aWFsaXplZCB3aXRoIGtleXMgbG9uZ2VyIHRoYW4gYSBzaW5nbGUgY2hhcmFjdGVycy4gSWdub3JpbmcgRVZFUllUSElORy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3VzdG9tIHBlcm1pc3Npb24gc3VsbCdlbWJlZGRpbmcgYWdnaXVudGEgYXV0b21hdGljYW1lbnRlIHNlIG5vbiBwcmVzZW50ZVxyXG4gICAgaWYoIWN1c3RvbVBlcm1pc3Npb25zLmZpbmQodCA9PiB0LmtleSA9PT0gXCJYXCIpKVxyXG4gICAgICBjdXN0b21QZXJtaXNzaW9ucy5wdXNoKHsga2V5OiBcIlhcIiwgaXRlbXM6IFt0aGlzLmVtYi5FbWJlZGRlZCA/IFwiMVwiIDogXCIwXCJdIH0pO1xyXG5cclxuICAgIHRoaXMudGFnZ2VkSXRlbXNDYWNoZSA9IGN1c3RvbVBlcm1pc3Npb25zO1xyXG4gICAgdGhpcy5Jbml0aWFsaXplZEN1c3RvbSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmRpY2Egc2UgbmVsbGEgc2Vzc2lvbmUgYXR0dWFsZSBlc2lzdGUgdW4gdXRlbnRlIGxvZ2dhdG8uIEZhIHVuIHNlbXBsaWNlIGNvbnRyb2xsbyBkaSBwcmVzZW56YSBzdWxsJ0lkZW50aXR5XHJcbiAgICovXHJcbiAgcHVibGljIGlzTG9nZ2VkSW4oKSB7XHJcbiAgICByZXR1cm4gISF0aGlzLklkZW50aXR5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwcmVzc2lvbiDDqCBzY3JpdHRhIHRpcG8gLS0+IFI6Um9sZTEgJiYgUDpQZXJtaXNzaW9uMSB8fCAoUjpSb2xlMiAmJiBQOlBlcm1pc3Npb24xKVxyXG4gICAqIFF1aW5kaSBwaXV0dG9zdG8gY2hlIGltcGxlbWVudGFyc2kgdW4gcGFyc2VyIGRlbGxhIG1hZG9ubmEgaW4gc3RpbGUgQWxlc3NhbmRybyBwcmVuZG8gbGEgc3RyYWRhIHN0cm9uemEgZSB2ZWxvY2UgY29uIGwnZXZhbCA6UFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0FDRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIGFic29sdXRlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5Jbml0aWFsaXplZClcclxuICAgICAgY29uc29sZS5lcnJvcihcIkFjY2VzcyBDb250cm9sIFN5c3RlbSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENhbGwgdGhpcy5hY2Nlc3NDb250cm9sLmluaXRpYWxpemUoLi4uLCAuLi4pIGJlZm9yZSB1c2luZyB0aGUgc2VydmljZVwiKTtcclxuXHJcbiAgICBpZiAoIWV4cHJlc3Npb24pXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXNwcmVzc2lvbmUgZ2nDoCB2YWx1dGF0YSwgbm9uIHNlcnZlIHJpdmFsdXRhcmxhXHJcbiAgICBpZiAodGhpcy5jYWNoZVtleHByZXNzaW9uXSlcclxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVbZXhwcmVzc2lvbl07XHJcblxyXG4gICAgdmFyIFJvbGVzUGVybWlzc2lvbnNSZWdleHAgPSAvIT8uOltefCYoKV0rL2c7XHJcblxyXG4gICAgdmFyIG1hdGNoZXMgPSBleHByZXNzaW9uLm1hdGNoKFJvbGVzUGVybWlzc2lvbnNSZWdleHApO1xyXG5cclxuICAgIGlmICghbWF0Y2hlcylcclxuICAgICAgdGhyb3cgXCJFc3ByZXNzaW9uZSBBY2Nlc3MgQ29udHJvbCBub24gdmFsaWRhOiBcIiArIGV4cHJlc3Npb24gKyBcIi4gQXNzaWN1cmFyc2kgY2hlIHNpYSBzY3JpdHRhIGluIG1vZG8gY29ycmV0dG9cIjtcclxuXHJcbiAgICAvLyBQZXIgY29uZGl6aW9uaSBkaXJldHRlIHN1bGwnZW1iZWRkaW5nIHNpIGNvbnNpZGVyYSBzZW1wcmUgY2hlIHNpYW5vIG9wZXJhemlvbmkgYXNzb2x1dGVcclxuICAgIGlmIChleHByZXNzaW9uID09ICdYOjAnIHx8IGV4cHJlc3Npb24gPT0gJ1g6MScpXHJcbiAgICAgIGFic29sdXRlID0gdHJ1ZTtcclxuXHJcbiAgICBtYXRjaGVzLmZvckVhY2godCA9PiB7XHJcbiAgICAgIHZhciBzcGxpdHMgPSB0LnNwbGl0KCc6Jyk7XHJcbiAgICAgIC8vIFBlciBydW9saSBlIHBlcm1lc3NpLCBzZSBobyBjb25kaXppb25pIGRpIGRlZmF1bHQgZSBsJ2VzcHJlc3Npb25lIG5vbiDDqCBhc3NvbHV0YSwgd3JhcHBvIG9nbmkgZWxlbWVudG8gY29uIGxlIGVzcHJlc3Npb25pIGRpIGRlZmF1bHRcclxuICAgICAgLy8gUGVyIGxlIGN1c3RvbSBwZXJtaXNzaW9ucyBpbnZlY2UsIGRhdG8gY2hlIHNvbm8gY29zZSBzdGFjY2F0ZSBkYSBydW9saSBlIHBlcm1lc3NpLCBub24gaGEgbWFpIHNlbnNvIGZhcmxvXHJcbiAgICAgIGlmIChzcGxpdHNbMF0gPT0gXCJSXCIgfHwgc3BsaXRzWzBdID09IFwiIVJcIikge1xyXG4gICAgICAgIGlmICh0aGlzLkFDQ19ERUZfQ09ORCAmJiB0aGlzLkFDQ19ERUZfQ09ORF9PUCAmJiAhYWJzb2x1dGUpIHtcclxuICAgICAgICAgIGxldCB0bXBSZXBsYWNlID0gYCgke3R9ICR7dGhpcy5BQ0NfREVGX0NPTkRfT1B9ICR7dGhpcy5BQ0NfREVGX0NPTkR9KWBcclxuICAgICAgICAgIHZhciBtYXRjaGVzMiA9IHRtcFJlcGxhY2UubWF0Y2goUm9sZXNQZXJtaXNzaW9uc1JlZ2V4cCk7XHJcblxyXG4gICAgICAgICAgbWF0Y2hlczIuZm9yRWFjaCh0MiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzcGxpdHMyID0gdDIuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgaWYgKHNwbGl0czJbMF0gPT0gXCJSXCIgfHwgc3BsaXRzMlswXSA9PSBcIiFSXCIpIFxyXG4gICAgICAgICAgICAgIHRtcFJlcGxhY2UgPSB0bXBSZXBsYWNlLnJlcGxhY2UodDIudHJpbSgpLCAodDIuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUm9sZSgnXCIgKyBzcGxpdHMyWzFdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICAgICAgICAgIGVsc2UgaWYoc3BsaXRzMlswXSA9PSBcIlBcIiB8fCBzcGxpdHMyWzBdID09IFwiIVBcIilcclxuICAgICAgICAgICAgICB0bXBSZXBsYWNlID0gdG1wUmVwbGFjZS5yZXBsYWNlKHQyLnRyaW0oKSwgKHQyLnN0YXJ0c1dpdGgoXCIhXCIpID8gJyEnIDogJycpICsgXCJ0aGlzLmhhc1Blcm1pc3Npb24oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdG1wUmVwbGFjZSA9IHRtcFJlcGxhY2UucmVwbGFjZSh0Mi50cmltKCksICh0Mi5zdGFydHNXaXRoKFwiIVwiKSA/ICchJyA6ICcnKSArIFwidGhpcy5oYXNDdXN0b20oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKHQudHJpbSgpLCB0bXBSZXBsYWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgKHQuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUm9sZSgnXCIgKyBzcGxpdHNbMV0udHJpbSgpICsgXCInKVwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChzcGxpdHNbMF0gPT0gXCJQXCIgfHwgc3BsaXRzWzBdID09IFwiIVBcIikge1xyXG4gICAgICAgIGlmICh0aGlzLkFDQ19ERUZfQ09ORCAmJiB0aGlzLkFDQ19ERUZfQ09ORF9PUCAmJiAhYWJzb2x1dGUpIHtcclxuICAgICAgICAgIGxldCB0bXBSZXBsYWNlID0gYCgke3R9ICR7dGhpcy5BQ0NfREVGX0NPTkRfT1B9ICR7dGhpcy5BQ0NfREVGX0NPTkR9KWBcclxuICAgICAgICAgIHZhciBtYXRjaGVzMiA9IHRtcFJlcGxhY2UubWF0Y2goUm9sZXNQZXJtaXNzaW9uc1JlZ2V4cCk7XHJcblxyXG4gICAgICAgICAgbWF0Y2hlczIuZm9yRWFjaCh0MiA9PiB7XHJcbiAgICAgICAgICAgIHZhciBzcGxpdHMyID0gdDIuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgaWYgKHNwbGl0czJbMF0gPT0gXCJSXCIgfHwgc3BsaXRzMlswXSA9PSBcIiFSXCIpIFxyXG4gICAgICAgICAgICAgIHRtcFJlcGxhY2UgPSB0bXBSZXBsYWNlLnJlcGxhY2UodDIudHJpbSgpLCAodDIuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUm9sZSgnXCIgKyBzcGxpdHMyWzFdLnRyaW0oKSArIFwiJylcIik7XHJcbiAgICAgICAgICAgIGVsc2UgaWYoc3BsaXRzMlswXSA9PSBcIlBcIiB8fCBzcGxpdHMyWzBdID09IFwiIVBcIilcclxuICAgICAgICAgICAgICB0bXBSZXBsYWNlID0gdG1wUmVwbGFjZS5yZXBsYWNlKHQyLnRyaW0oKSwgKHQyLnN0YXJ0c1dpdGgoXCIhXCIpID8gJyEnIDogJycpICsgXCJ0aGlzLmhhc1Blcm1pc3Npb24oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgdG1wUmVwbGFjZSA9IHRtcFJlcGxhY2UucmVwbGFjZSh0Mi50cmltKCksICh0Mi5zdGFydHNXaXRoKFwiIVwiKSA/ICchJyA6ICcnKSArIFwidGhpcy5oYXNDdXN0b20oJ1wiICsgc3BsaXRzMlsxXS50cmltKCkgKyBcIicpXCIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbi5yZXBsYWNlKHQudHJpbSgpLCB0bXBSZXBsYWNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgKHQuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzUGVybWlzc2lvbignXCIgKyBzcGxpdHNbMV0udHJpbSgpICsgXCInKVwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZXhwcmVzc2lvbiA9IGV4cHJlc3Npb24ucmVwbGFjZSh0LnRyaW0oKSwgKHQuc3RhcnRzV2l0aChcIiFcIikgPyAnIScgOiAnJykgKyBcInRoaXMuaGFzQ3VzdG9tKCdcIiArIHNwbGl0c1sxXS50cmltKCkgKyBcIicsICdcIiArICgodC5zdGFydHNXaXRoKFwiIVwiKSA/IHNwbGl0c1swXS50cmltKCkuY2hhckF0KDEpIDogc3BsaXRzWzBdLnRyaW0oKSkpICsgXCInKVwiKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHZhciByZXQgPSA8Ym9vbGVhbj5ldmFsKGV4cHJlc3Npb24pO1xyXG4gICAgLy8gQ2FjaGUgdmFsb3JlXHJcbiAgICB0aGlzLmNhY2hlW2V4cHJlc3Npb25dID0gcmV0O1xyXG4gICAgcmV0dXJuIHJldDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFV0aWxpenphdG8gZGEgaGFzQUNFeHByZXNzaW9uIGRlbnRybyBldmFsXHJcbiAgICogXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFzUm9sZShyb2xlOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5JZGVudGl0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJFbGVtZW50byBJZGVudGl0eSBub24gc3BlY2lmaWNhdG8gaW4gQWNjZXNzIENvbnRyb2wuIEdsaSBhY2Nlc3NpIHNhcmFubm8gdHV0dGkgbGliZXJpIGRpIGRlZmF1bHRcIilcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5JZGVudGl0eS5Sb2xlcyAmJiB0aGlzLklkZW50aXR5LlJvbGVzLmxlbmd0aCA+IDAgJiYgdGhpcy5JZGVudGl0eS5Sb2xlcy5pbmRleE9mKHJvbGUpICE9IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXRpbGl6emF0byBkYSBoYXNBQ0V4cHJlc3Npb24gZGVudHJvIGV2YWxcclxuICAgKiBcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYXNQZXJtaXNzaW9uKHBlcm1pc3Npb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLklkZW50aXR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkVsZW1lbnRvIElkZW50aXR5IG5vbiBzcGVjaWZpY2F0byBpbiBBY2Nlc3MgQ29udHJvbC4gR2xpIGFjY2Vzc2kgc2FyYW5ubyB0dXR0aSBsaWJlcmkgZGkgZGVmYXVsdFwiKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLklkZW50aXR5LlBlcm1pc3Npb25zICYmIHRoaXMuSWRlbnRpdHkuUGVybWlzc2lvbnMubGVuZ3RoID4gMCAmJiB0aGlzLklkZW50aXR5LlBlcm1pc3Npb25zLmluZGV4T2YocGVybWlzc2lvbikgIT0gLTE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVdGlsaXp6YXRvIGRhIGhhc0FDRXhwcmVzc2lvbiBkZW50cm8gZXZhbFxyXG4gICAqIFxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwcml2YXRlIGhhc0N1c3RvbSh2YWx1ZTogc3RyaW5nLCB0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdmFyIGl0ZW1zID0gdGhpcy50YWdnZWRJdGVtc0NhY2hlLmZpbmQodCA9PiB0LmtleSA9PSB0YWcpPy5pdGVtcztcclxuICAgIGlmICghaXRlbXMpXHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgZWxzZSBpZiAoaXRlbXMubGVuZ3RoID09IDApXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIGVsc2Uge1xyXG4gICAgICB2YXIgZm91bmQgPSBpdGVtcy5maW5kKHQgPT4gdCA9PSB2YWx1ZSlcclxuICAgICAgcmV0dXJuIGZvdW5kICE9IG51bGwgJiYgZm91bmQgIT0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRW50cnkgcG9pbnQgY2hlIGNvbnRyb2xsYSB1bidlc3ByZXNzaW9uZSBpZGVudGlmaWNhbnRlIHVuIHBlcm1lc3NvLCBhZCBlc2VtcGlvIFwiUDp2aXN1YWxpenphemlvbmVcIiBjb250cm9sbGEgY2hlIGwndXRlbnRlIGNvbGxlZ2F0byBhYmJpYSB1biBwZXJtZXNzbyBjaGUgc2kgY2hpYW1hIFwidmlzdWFsaXp6YXppb25lXCJcclxuICAgKi9cclxuICBwdWJsaWMgaGFzKGV4cHI6IHN0cmluZywgYWJzb2x1dGU6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFzQUNFeHByZXNzaW9uKGV4cHIsIGFic29sdXRlKTtcclxuICB9XHJcbn0iXX0=
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Directive, Optional, Inject } from "@angular/core";
|
|
3
|
-
import { ACC_CUSTOMKEY } from "./tokens";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "./models/ComponentContext";
|
|
6
|
-
import * as i2 from "./access-control.service";
|
|
7
|
-
/**
|
|
8
|
-
* Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.
|
|
9
|
-
*
|
|
10
|
-
* Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext
|
|
11
|
-
*/
|
|
12
|
-
export class ContextAwareDirective {
|
|
13
|
-
/**
|
|
14
|
-
* Costruttore
|
|
15
|
-
*
|
|
16
|
-
* @ignore
|
|
17
|
-
*/
|
|
18
|
-
constructor(element, context, ac, ACC_CUSTOMKEY) {
|
|
19
|
-
this.context = context;
|
|
20
|
-
this.ac = ac;
|
|
21
|
-
this.ACC_CUSTOMKEY = ACC_CUSTOMKEY;
|
|
22
|
-
var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + ":" + this.context.name);
|
|
23
|
-
if (!allow)
|
|
24
|
-
element.nativeElement.setAttribute("enabled", "true");
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
30
|
-
type: Directive,
|
|
31
|
-
args: [{
|
|
32
|
-
selector: '[contextAware]',
|
|
33
|
-
}]
|
|
34
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ComponentContext, decorators: [{
|
|
35
|
-
type: Optional
|
|
36
|
-
}] }, { type: i2.AccessControlService }, { type: undefined, decorators: [{
|
|
37
|
-
type: Optional
|
|
38
|
-
}, {
|
|
39
|
-
type: Inject,
|
|
40
|
-
args: [ACC_CUSTOMKEY]
|
|
41
|
-
}] }]; } });
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
// Angular
|
|
2
|
+
import { Directive, Optional, Inject } from "@angular/core";
|
|
3
|
+
import { ACC_CUSTOMKEY } from "./tokens";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./models/ComponentContext";
|
|
6
|
+
import * as i2 from "./access-control.service";
|
|
7
|
+
/**
|
|
8
|
+
* Direttiva che permette di capire se l'elemento HTML su cui è utilizzata dev'essere disabilitato o no.
|
|
9
|
+
*
|
|
10
|
+
* Non ha effetto sugli elementi dichiarati in componenti che non dichiarano alcun ComponentContext
|
|
11
|
+
*/
|
|
12
|
+
export class ContextAwareDirective {
|
|
13
|
+
/**
|
|
14
|
+
* Costruttore
|
|
15
|
+
*
|
|
16
|
+
* @ignore
|
|
17
|
+
*/
|
|
18
|
+
constructor(element, context, ac, ACC_CUSTOMKEY) {
|
|
19
|
+
this.context = context;
|
|
20
|
+
this.ac = ac;
|
|
21
|
+
this.ACC_CUSTOMKEY = ACC_CUSTOMKEY;
|
|
22
|
+
var allow = !this.context || !this.context.name || !this.ACC_CUSTOMKEY || this.ac.has(this.ACC_CUSTOMKEY + ":" + this.context.name);
|
|
23
|
+
if (!allow)
|
|
24
|
+
element.nativeElement.setAttribute("enabled", "true");
|
|
25
|
+
}
|
|
26
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContextAwareDirective, deps: [{ token: i0.ElementRef }, { token: i1.ComponentContext, optional: true }, { token: i2.AccessControlService }, { token: ACC_CUSTOMKEY, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
27
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ContextAwareDirective, selector: "[contextAware]", ngImport: i0 }); }
|
|
28
|
+
}
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ContextAwareDirective, decorators: [{
|
|
30
|
+
type: Directive,
|
|
31
|
+
args: [{
|
|
32
|
+
selector: '[contextAware]',
|
|
33
|
+
}]
|
|
34
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ComponentContext, decorators: [{
|
|
35
|
+
type: Optional
|
|
36
|
+
}] }, { type: i2.AccessControlService }, { type: undefined, decorators: [{
|
|
37
|
+
type: Optional
|
|
38
|
+
}, {
|
|
39
|
+
type: Inject,
|
|
40
|
+
args: [ACC_CUSTOMKEY]
|
|
41
|
+
}] }]; } });
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1hd2FyZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2Nlc3MtY29udHJvbC9zcmMvbGliL2NvbnRleHQtYXdhcmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsU0FBUyxFQUFjLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQTs7OztBQUt4Qzs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLHFCQUFxQjtJQUU5Qjs7OztPQUlHO0lBQ0gsWUFBWSxPQUFtQixFQUFzQixPQUF5QixFQUFVLEVBQXdCLEVBQTZDLGFBQXFCO1FBQTdILFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBc0I7UUFBNkMsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDOUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFFLENBQUM7UUFFckksSUFBSSxDQUFDLEtBQUs7WUFDTixPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQzsrR0FaUSxxQkFBcUIsZ0lBT3dHLGFBQWE7bUdBUDFJLHFCQUFxQjs7NEZBQXJCLHFCQUFxQjtrQkFIakMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUM3Qjs7MEJBUXFDLFFBQVE7OzBCQUF5RSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sU2VydmljZSB9IGZyb20gXCIuL2FjY2Vzcy1jb250cm9sLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQUNDX0NVU1RPTUtFWSB9IGZyb20gXCIuL3Rva2Vuc1wiXHJcblxyXG4vLyBDbGFzc2lcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGV4dCB9IGZyb20gXCIuL21vZGVscy9Db21wb25lbnRDb250ZXh0XCI7XHJcblxyXG4vKipcclxuICogRGlyZXR0aXZhIGNoZSBwZXJtZXR0ZSBkaSBjYXBpcmUgc2UgbCdlbGVtZW50byBIVE1MIHN1IGN1aSDDqCB1dGlsaXp6YXRhIGRldidlc3NlcmUgZGlzYWJpbGl0YXRvIG8gbm8uXHJcbiAqIFxyXG4gKiBOb24gaGEgZWZmZXR0byBzdWdsaSBlbGVtZW50aSBkaWNoaWFyYXRpIGluIGNvbXBvbmVudGkgY2hlIG5vbiBkaWNoaWFyYW5vIGFsY3VuIENvbXBvbmVudENvbnRleHRcclxuICovXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICdbY29udGV4dEF3YXJlXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250ZXh0QXdhcmVEaXJlY3RpdmUge1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENvc3RydXR0b3JlIFxyXG4gICAgICogXHJcbiAgICAgKiBAaWdub3JlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYsIEBPcHRpb25hbCgpIHByaXZhdGUgY29udGV4dDogQ29tcG9uZW50Q29udGV4dCwgcHJpdmF0ZSBhYzogQWNjZXNzQ29udHJvbFNlcnZpY2UsIEBPcHRpb25hbCgpIEBJbmplY3QoQUNDX0NVU1RPTUtFWSkgcHJpdmF0ZSBBQ0NfQ1VTVE9NS0VZOiBzdHJpbmcpIHtcclxuICAgICAgICB2YXIgYWxsb3cgPSAhdGhpcy5jb250ZXh0IHx8ICF0aGlzLmNvbnRleHQubmFtZSB8fCAhdGhpcy5BQ0NfQ1VTVE9NS0VZIHx8IHRoaXMuYWMuaGFzKHRoaXMuQUNDX0NVU1RPTUtFWSArIFwiOlwiICsgdGhpcy5jb250ZXh0Lm5hbWUsKTtcclxuXHJcbiAgICAgICAgaWYgKCFhbGxvdylcclxuICAgICAgICAgICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcImVuYWJsZWRcIiwgXCJ0cnVlXCIpO1xyXG4gICAgfVxyXG59Il19
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'
|
|
3
|
-
*/
|
|
4
|
-
export class AccessControlModuleConfig {
|
|
5
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Configurazione Modulo AccessControl. Se non fornita verrà generata automaticamente con locale 'it-IT'
|
|
3
|
+
*/
|
|
4
|
+
export class AccessControlModuleConfig {
|
|
5
|
+
}
|
|
6
6
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzQ29udHJvbE1vZHVsZUNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FjY2Vzcy1jb250cm9sL3NyYy9saWIvbW9kZWxzL0FjY2Vzc0NvbnRyb2xNb2R1bGVDb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8seUJBQXlCO0NBYXJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENvbmZpZ3VyYXppb25lIE1vZHVsbyBBY2Nlc3NDb250cm9sLiBTZSBub24gZm9ybml0YSB2ZXJyw6AgZ2VuZXJhdGEgYXV0b21hdGljYW1lbnRlIGNvbiBsb2NhbGUgJ2l0LUlUJ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEFjY2Vzc0NvbnRyb2xNb2R1bGVDb25maWcge1xyXG5cclxuICAgIC8qKiBDaGlhdmUgY3VzdG9tIHN1IGN1aSBsYSAqKmNvbnRleHRBd2FyZURpcmVjdGl2ZSoqIHNpIGJhc2EgcGVyIGNvbnRyb2xsYXJlIHNlIGwnZWxlbWVudG8gw6ggYWJpbGl0YXRvIG8gbWVubyAqL1xyXG4gICAgY29udGV4dEF3YXJlS2V5Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBDb25kaXppb25lIGRpIGRlZmF1bHQgZGEgYWdnaXVuZ2VyZSBhIG9nbmkgY29uZGl6aW9uZSB1dGVudGUuIEVzOiAnUjpKYWNlIEFkbWluJyAqL1xyXG4gICAgZGVmYXVsdENvbmRpdGlvbj86IHN0cmluZztcclxuXHJcbiAgICAvKiogUmVsYXppb25lIGxvZ2ljYSBmcmEgbGEgY29uZGl6aW9uZSBkaSBkZWZhdWx0IGUgbGEgY29uZGl6aW9uZSB1dGVudGUuIEVzOiAnfHwnLiBEaSBkZWZhdWx0IHZpZW5lIHV0aWxpenphdG8gbCdPUiBsb2dpY28gKi9cclxuICAgIGRlZmF1bHRDb25kaXRpb25Mb2dpY2FsT3BlcmF0b3I/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIEF0dGl2YSBsYSBtb2RhbGl0w6AgZGkgZGVidWcgcGVyIGwnZXNwb3NpemlvbmUgZGkgbWVzc2FnZ2kgc2lnbmlmaWNhdGl2aSAqL1xyXG4gICAgZGVidWdNb2RlPzogYm9vbGVhbjtcclxufSJdfQ==
|