emilsoftware-utilities 2.0.0-dev.40 → 2.0.0-dev.42
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/dist/accessi-module/Console/accessiFetch.d.ts +9 -0
- package/dist/accessi-module/Console/accessiFetch.js +31 -3
- package/dist/accessi-module/Console/accessiFetch.js.map +1 -1
- package/dist/accessi-module/Console/console.css +8 -3
- package/dist/accessi-module/Console/console.js +380 -46
- package/dist/accessi-module/Console/console.js.map +1 -1
- package/dist/accessi-module/Console/generated/accessiApi.d.ts +21 -1
- package/dist/accessi-module/Console/generated/accessiApi.js +18 -2
- package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
- package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.d.ts +1 -1
- package/dist/accessi-module/Console/generated/model/confirmResetPasswordRequest.js.map +1 -1
- package/dist/accessi-module/Console/generated/model/index.d.ts +1 -0
- package/dist/accessi-module/Console/generated/model/index.js +1 -0
- package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.d.ts +14 -0
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js +9 -0
- package/dist/accessi-module/Console/generated/model/setUserPasswordRequest.js.map +1 -0
- package/dist/accessi-module/Console/help.js +115 -0
- package/dist/accessi-module/Console/help.js.map +1 -1
- package/dist/accessi-module/Console/wiki.js +9 -2
- package/dist/accessi-module/Console/wiki.js.map +1 -1
- package/dist/accessi-module/Controllers/UserController.d.ts +6 -1
- package/dist/accessi-module/Controllers/UserController.js +91 -3
- package/dist/accessi-module/Controllers/UserController.js.map +1 -1
- package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js +1 -1
- package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.d.ts +4 -0
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.js +32 -0
- package/dist/accessi-module/Dtos/SetUserPasswordRequest.js.map +1 -0
- package/dist/accessi-module/Services/AuthService/AuthService.d.ts +8 -2
- package/dist/accessi-module/Services/AuthService/AuthService.js +13 -9
- package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
- package/dist/accessi-module/Services/UserService/UserService.d.ts +5 -0
- package/dist/accessi-module/Services/UserService/UserService.js +71 -55
- package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
- package/dist/accessi-module/Views/reset-password.html +23 -7
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +2 -1
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +35 -4
- package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
- package/dist/accessi-module/security/accessControl.d.ts +9 -0
- package/dist/accessi-module/security/accessControl.js +14 -0
- package/dist/accessi-module/security/accessControl.js.map +1 -1
- package/dist/accessi-module/security/passwordPolicy.d.ts +21 -0
- package/dist/accessi-module/security/passwordPolicy.js +71 -0
- package/dist/accessi-module/security/passwordPolicy.js.map +1 -0
- package/dist/emilsoftware-utilities-2.0.0-dev.42.tgz +0 -0
- package/package.json +1 -1
- package/dist/emilsoftware-utilities-2.0.0-dev.40.tgz +0 -0
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/** Emesso quando una richiesta autenticata riceve 401: la console deve riportare al login. */
|
|
2
|
+
export declare const ACCESSI_UNAUTHORIZED_EVENT = "accessi-console-unauthorized";
|
|
3
|
+
/** Errore del client console: conserva status, codice stabile Accessi e dettagli di validazione. */
|
|
4
|
+
export declare class AccessiRequestError extends Error {
|
|
5
|
+
readonly status: number;
|
|
6
|
+
readonly code?: string | undefined;
|
|
7
|
+
readonly details?: string[] | undefined;
|
|
8
|
+
constructor(message: string, status: number, code?: string | undefined, details?: string[] | undefined);
|
|
9
|
+
}
|
|
1
10
|
/** Imposta il JWT usato da tutte le funzioni generate da Orval. */
|
|
2
11
|
export declare function setAccessiConsoleToken(token: string | null): void;
|
|
3
12
|
/**
|
|
@@ -9,10 +9,24 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.AccessiRequestError = exports.ACCESSI_UNAUTHORIZED_EVENT = void 0;
|
|
12
13
|
exports.setAccessiConsoleToken = setAccessiConsoleToken;
|
|
13
14
|
exports.accessiFetch = accessiFetch;
|
|
14
15
|
let accessToken = null;
|
|
15
16
|
const loadingEventName = 'accessi-console-network';
|
|
17
|
+
/** Emesso quando una richiesta autenticata riceve 401: la console deve riportare al login. */
|
|
18
|
+
exports.ACCESSI_UNAUTHORIZED_EVENT = 'accessi-console-unauthorized';
|
|
19
|
+
/** Errore del client console: conserva status, codice stabile Accessi e dettagli di validazione. */
|
|
20
|
+
class AccessiRequestError extends Error {
|
|
21
|
+
constructor(message, status, code, details) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.status = status;
|
|
24
|
+
this.code = code;
|
|
25
|
+
this.details = details;
|
|
26
|
+
this.name = 'AccessiRequestError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.AccessiRequestError = AccessiRequestError;
|
|
16
30
|
/** Notifies the browser shell without coupling generated Orval calls to the UI implementation. */
|
|
17
31
|
function notifyNetworkActivity(active) {
|
|
18
32
|
if (typeof window !== 'undefined') {
|
|
@@ -23,18 +37,26 @@ function notifyNetworkActivity(active) {
|
|
|
23
37
|
function setAccessiConsoleToken(token) {
|
|
24
38
|
accessToken = token;
|
|
25
39
|
}
|
|
40
|
+
/** Legge una stringa non vuota dal payload di errore Accessi, ignorando tipi inattesi. */
|
|
41
|
+
function payloadString(payload, key) {
|
|
42
|
+
if (!payload || typeof payload !== 'object')
|
|
43
|
+
return undefined;
|
|
44
|
+
const value = payload[key];
|
|
45
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
46
|
+
}
|
|
26
47
|
/**
|
|
27
48
|
* Trasporto comune del client Orval: aggiunge il Bearer token e converte le
|
|
28
49
|
* risposte di errore Accessi in Error JavaScript leggibili dalla console.
|
|
29
50
|
*/
|
|
30
51
|
function accessiFetch(url, options) {
|
|
31
52
|
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
-
var _a, _b;
|
|
53
|
+
var _a, _b, _c;
|
|
33
54
|
const headers = new Headers(options.headers);
|
|
34
55
|
headers.set('Accept', 'application/json');
|
|
35
56
|
if (options.body !== undefined && !headers.has('Content-Type')) {
|
|
36
57
|
headers.set('Content-Type', 'application/json');
|
|
37
58
|
}
|
|
59
|
+
const authenticatedRequest = accessToken !== null;
|
|
38
60
|
if (accessToken)
|
|
39
61
|
headers.set('Authorization', `Bearer ${accessToken}`);
|
|
40
62
|
notifyNetworkActivity(true);
|
|
@@ -42,8 +64,14 @@ function accessiFetch(url, options) {
|
|
|
42
64
|
const response = yield fetch(url, Object.assign(Object.assign({}, options), { headers }));
|
|
43
65
|
const payload = yield response.json().catch(() => undefined);
|
|
44
66
|
if (!response.ok) {
|
|
45
|
-
const message = (_b = (_a = payload
|
|
46
|
-
|
|
67
|
+
const message = (_b = (_a = payloadString(payload, 'message')) !== null && _a !== void 0 ? _a : payloadString(payload, 'error')) !== null && _b !== void 0 ? _b : `Errore HTTP ${response.status}`;
|
|
68
|
+
const rawDetails = payload && typeof payload === 'object' ? payload.details : undefined;
|
|
69
|
+
const details = Array.isArray(rawDetails) ? rawDetails.map((item) => String(item)) : undefined;
|
|
70
|
+
// Un 401 su una richiesta autenticata significa sessione scaduta/revocata: il token non e piu valido.
|
|
71
|
+
if (response.status === 401 && authenticatedRequest && typeof window !== 'undefined') {
|
|
72
|
+
window.dispatchEvent(new CustomEvent(exports.ACCESSI_UNAUTHORIZED_EVENT));
|
|
73
|
+
}
|
|
74
|
+
throw new AccessiRequestError(message, response.status, (_c = payloadString(payload, 'code')) !== null && _c !== void 0 ? _c : payloadString(payload, 'error'), details);
|
|
47
75
|
}
|
|
48
76
|
return {
|
|
49
77
|
data: payload,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessiFetch.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/accessiFetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accessiFetch.js","sourceRoot":"","sources":["../../../src/accessi-module/Console/accessiFetch.ts"],"names":[],"mappings":";;;;;;;;;;;;AAsBA,wDAEC;AAaD,oCA+BC;AApED,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AACnD,8FAA8F;AACjF,QAAA,0BAA0B,GAAG,8BAA8B,CAAC;AAEzE,oGAAoG;AACpG,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe,EAAW,MAAc,EAAW,IAAa,EAAW,OAAkB;QACvG,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,WAAM,GAAN,MAAM,CAAQ;QAAW,SAAI,GAAJ,IAAI,CAAS;QAAW,YAAO,GAAP,OAAO,CAAW;QAEvG,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,kGAAkG;AAClG,SAAS,qBAAqB,CAAC,MAAe;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,SAAgB,sBAAsB,CAAC,KAAoB;IACzD,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED,0FAA0F;AAC1F,SAAS,aAAa,CAAC,OAAgB,EAAE,GAAW;IAClD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,KAAK,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,SAAsB,YAAY,CAAI,GAAW,EAAE,OAAoB;;;QACrE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,oBAAoB,GAAG,WAAW,KAAK,IAAI,CAAC;QAClD,IAAI,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,WAAW,EAAE,CAAC,CAAC;QAEvE,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,kCAAO,OAAO,KAAE,OAAO,IAAG,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,OAAO,GAAG,MAAA,MAAA,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,mCAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,mCAAI,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACzH,MAAM,UAAU,GAAG,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAE,OAAiC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/F,sGAAsG;gBACtG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,oBAAoB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;oBACrF,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,kCAA0B,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,MAAM,IAAI,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAA,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,mCAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;YACtI,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;aACrB,CAAC;QACT,CAAC;gBAAS,CAAC;YACT,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CAAA","sourcesContent":["let accessToken: string | null = null;\n\nconst loadingEventName = 'accessi-console-network';\n/** Emesso quando una richiesta autenticata riceve 401: la console deve riportare al login. */\nexport const ACCESSI_UNAUTHORIZED_EVENT = 'accessi-console-unauthorized';\n\n/** Errore del client console: conserva status, codice stabile Accessi e dettagli di validazione. */\nexport class AccessiRequestError extends Error {\n constructor(message: string, readonly status: number, readonly code?: string, readonly details?: string[]) {\n super(message);\n this.name = 'AccessiRequestError';\n }\n}\n\n/** Notifies the browser shell without coupling generated Orval calls to the UI implementation. */\nfunction notifyNetworkActivity(active: boolean): void {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(loadingEventName, { detail: { active } }));\n }\n}\n\n/** Imposta il JWT usato da tutte le funzioni generate da Orval. */\nexport function setAccessiConsoleToken(token: string | null): void {\n accessToken = token;\n}\n\n/** Legge una stringa non vuota dal payload di errore Accessi, ignorando tipi inattesi. */\nfunction payloadString(payload: unknown, key: string): string | undefined {\n if (!payload || typeof payload !== 'object') return undefined;\n const value = (payload as Record<string, unknown>)[key];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/**\n * Trasporto comune del client Orval: aggiunge il Bearer token e converte le\n * risposte di errore Accessi in Error JavaScript leggibili dalla console.\n */\nexport async function accessiFetch<T>(url: string, options: RequestInit): Promise<T> {\n const headers = new Headers(options.headers);\n headers.set('Accept', 'application/json');\n if (options.body !== undefined && !headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n const authenticatedRequest = accessToken !== null;\n if (accessToken) headers.set('Authorization', `Bearer ${accessToken}`);\n\n notifyNetworkActivity(true);\n try {\n const response = await fetch(url, { ...options, headers });\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const message = payloadString(payload, 'message') ?? payloadString(payload, 'error') ?? `Errore HTTP ${response.status}`;\n const rawDetails = payload && typeof payload === 'object' ? (payload as { details?: unknown }).details : undefined;\n const details = Array.isArray(rawDetails) ? rawDetails.map((item) => String(item)) : undefined;\n // Un 401 su una richiesta autenticata significa sessione scaduta/revocata: il token non e piu valido.\n if (response.status === 401 && authenticatedRequest && typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent(ACCESSI_UNAUTHORIZED_EVENT));\n }\n throw new AccessiRequestError(message, response.status, payloadString(payload, 'code') ?? payloadString(payload, 'error'), details);\n }\n return {\n data: payload,\n status: response.status,\n headers: response.headers,\n } as T;\n } finally {\n notifyNetworkActivity(false);\n }\n}\n"]}
|
|
@@ -263,9 +263,14 @@ legend { padding: 0 var(--s2); color: var(--ink-2); font-weight: 650; font-size:
|
|
|
263
263
|
.error { color: var(--danger); }
|
|
264
264
|
|
|
265
265
|
#notice { min-height: 0; }
|
|
266
|
-
#notice:not(:empty) { margin: 0
|
|
267
|
-
|
|
268
|
-
|
|
266
|
+
#notice:not(:empty) { margin: 0 0 var(--s4); }
|
|
267
|
+
.notice { display: flex; align-items: flex-start; gap: var(--s3); padding: var(--s3) var(--s4); border: 1px solid var(--brand-line); border-radius: var(--r-md); color: var(--brand-strong); background: var(--brand-soft); }
|
|
268
|
+
.notice-error { border-color: var(--danger-line); color: var(--danger); background: var(--danger-soft); }
|
|
269
|
+
.notice-icon { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center; width: 1.3rem; height: 1.3rem; border-radius: 50%; color: #fff; background: var(--brand-strong); font-weight: 700; font-size: .82rem; }
|
|
270
|
+
.notice-error .notice-icon { background: var(--danger); }
|
|
271
|
+
.notice-text { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
|
|
272
|
+
.notice-close { flex: 0 0 auto; padding: 0 .2rem; border: 0; background: none; color: inherit; font-size: 1.15rem; line-height: 1; cursor: pointer; opacity: .7; }
|
|
273
|
+
.notice-close:hover, .notice-close:focus-visible { opacity: 1; }
|
|
269
274
|
|
|
270
275
|
.page-header { display: flex; align-items: end; justify-content: space-between; gap: var(--s4); margin: 0 0 var(--s5); padding-bottom: var(--s4); border-bottom: 1px solid var(--line); }
|
|
271
276
|
.page-header h2 { margin: 0; }
|