emilsoftware-utilities 1.3.69 → 1.3.71
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/AccessiModule.d.ts +4 -2
- package/dist/accessi-module/AccessiModule.js +6 -2
- package/dist/accessi-module/{AccessiController.d.ts → Controllers/AccessiController.d.ts} +17 -6
- package/dist/accessi-module/{AccessiController.js → Controllers/AccessiController.js} +47 -14
- package/dist/accessi-module/{AccessiControllerBase.d.ts → Controllers/AccessiControllerBase.d.ts} +9 -0
- package/dist/accessi-module/{AccessiRoutes.d.ts → Routes/AccessiRoutes.d.ts} +2 -2
- package/dist/accessi-module/{AccessiRoutes.js → Routes/AccessiRoutes.js} +5 -2
- package/dist/accessi-module/Services/AuthService/AuthService.d.ts +1 -1
- package/dist/accessi-module/Services/AuthService/AuthService.js +19 -3
- package/dist/accessi-module/Services/AuthService/IAuthService.d.ts +9 -7
- package/dist/accessi-module/Services/EmailService/EmailService.d.ts +1 -1
- package/dist/accessi-module/Services/EmailService/EmailService.js +25 -3
- package/dist/accessi-module/Services/EmailService/IEmailService.d.ts +1 -1
- package/dist/accessi-module/Services/UserService/IUserService.d.ts +8 -0
- package/dist/accessi-module/Services/UserService/UserService.d.ts +1 -0
- package/dist/accessi-module/Services/UserService/UserService.js +17 -0
- package/dist/accessi-module/inversify.config.js +4 -3
- package/package.json +1 -1
- /package/dist/accessi-module/{AccessiControllerBase.js → Controllers/AccessiControllerBase.js} +0 -0
|
@@ -14,6 +14,7 @@ export interface EmailOptions {
|
|
|
14
14
|
host: string;
|
|
15
15
|
port: number;
|
|
16
16
|
secure: boolean;
|
|
17
|
+
from: string;
|
|
17
18
|
auth: {
|
|
18
19
|
user: string;
|
|
19
20
|
pass: string;
|
|
@@ -39,18 +40,19 @@ export declare class AccessiModule {
|
|
|
39
40
|
* @author mttdev382
|
|
40
41
|
|
|
41
42
|
*/
|
|
42
|
-
constructor(options: AccessiOptions);
|
|
43
|
+
constructor(app: Application, options: AccessiOptions);
|
|
43
44
|
/**
|
|
44
45
|
* Ottiene il router delle rotte per gestire gli accessi.
|
|
45
46
|
*
|
|
46
47
|
* **Consiglio:** È consigliabile utilizzare questo router nel primo livello della tua applicazione (es. /api/accessi).
|
|
47
|
-
*
|
|
48
|
+
* @deprecated A breve questo metodo sparirà, la libreria viene importata automaticamente.
|
|
48
49
|
* @returns {Router} Il router con le rotte degli accessi.
|
|
49
50
|
* @author mttdev382
|
|
50
51
|
*/
|
|
51
52
|
getAccessiRouter(): Router;
|
|
52
53
|
/**
|
|
53
54
|
* Inizializza la documentazione di swagger per gli accessi.
|
|
55
|
+
* @deprecated A breve questo metodo sparirà, la libreria servirà swagger autonomamente.
|
|
54
56
|
* @author mttdev382
|
|
55
57
|
*/
|
|
56
58
|
serveSwaggerDocs(app: Application): void;
|
|
@@ -14,18 +14,21 @@ class AccessiModule {
|
|
|
14
14
|
* @author mttdev382
|
|
15
15
|
|
|
16
16
|
*/
|
|
17
|
-
constructor(options) {
|
|
17
|
+
constructor(app, options) {
|
|
18
18
|
this.options = options;
|
|
19
19
|
this.logger = new Logger_1.Logger(AccessiModule.name);
|
|
20
20
|
// Configura le opzioni di AccessiModule dentro il container DI
|
|
21
21
|
inversify_config_1.container.rebind("AccessiOptions").toConstantValue(this.options);
|
|
22
22
|
this.accessiRoutes = inversify_config_1.container.get("IAccessiRoutes");
|
|
23
|
+
app.use("/api/accessi", this.getAccessiRouter());
|
|
24
|
+
this.logger.info("Serving accessi router under /api/accessi...");
|
|
25
|
+
(0, SwaggerConfig_1.serveSwaggerDocs)(app);
|
|
23
26
|
}
|
|
24
27
|
/**
|
|
25
28
|
* Ottiene il router delle rotte per gestire gli accessi.
|
|
26
29
|
*
|
|
27
30
|
* **Consiglio:** È consigliabile utilizzare questo router nel primo livello della tua applicazione (es. /api/accessi).
|
|
28
|
-
*
|
|
31
|
+
* @deprecated A breve questo metodo sparirà, la libreria viene importata automaticamente.
|
|
29
32
|
* @returns {Router} Il router con le rotte degli accessi.
|
|
30
33
|
* @author mttdev382
|
|
31
34
|
*/
|
|
@@ -35,6 +38,7 @@ class AccessiModule {
|
|
|
35
38
|
}
|
|
36
39
|
/**
|
|
37
40
|
* Inizializza la documentazione di swagger per gli accessi.
|
|
41
|
+
* @deprecated A breve questo metodo sparirà, la libreria servirà swagger autonomamente.
|
|
38
42
|
* @author mttdev382
|
|
39
43
|
*/
|
|
40
44
|
serveSwaggerDocs(app) {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Request, Response } from "express";
|
|
2
|
-
import { IAuthService } from "
|
|
3
|
-
import { IEmailService } from "
|
|
4
|
-
import { IPermissionService } from "
|
|
5
|
-
import { IUserService } from "
|
|
2
|
+
import { IAuthService } from "../Services/AuthService/IAuthService";
|
|
3
|
+
import { IEmailService } from "../Services/EmailService/IEmailService";
|
|
4
|
+
import { IPermissionService } from "../Services/PermissionService/IPermissionService";
|
|
5
|
+
import { IUserService } from "../Services/UserService/IUserService";
|
|
6
6
|
import { AccessiControllerBase } from "./AccessiControllerBase";
|
|
7
|
+
import { AccessiOptions } from "../AccessiModule";
|
|
7
8
|
/**
|
|
8
9
|
* Controller per la gestione degli accessi e delle operazioni correlate.
|
|
9
10
|
* Fornisce metodi per login, registrazione, crittografia, decrittografia e gestione delle autorizzazioni utente.
|
|
@@ -11,9 +12,10 @@ import { AccessiControllerBase } from "./AccessiControllerBase";
|
|
|
11
12
|
export declare class AccessiController implements AccessiControllerBase {
|
|
12
13
|
private userService;
|
|
13
14
|
private permissionService;
|
|
14
|
-
private emailService;
|
|
15
15
|
private authService;
|
|
16
|
-
|
|
16
|
+
private emailService;
|
|
17
|
+
private accessiOptions;
|
|
18
|
+
constructor(userService: IUserService, permissionService: IPermissionService, authService: IAuthService, emailService: IEmailService, accessiOptions: AccessiOptions);
|
|
17
19
|
getUserByToken(req: Request<{}, {}, {
|
|
18
20
|
token: string;
|
|
19
21
|
}>, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
@@ -38,4 +40,13 @@ export declare class AccessiController implements AccessiControllerBase {
|
|
|
38
40
|
setGdpr(req: Request<{}, {}, {
|
|
39
41
|
codiceUtente: string;
|
|
40
42
|
}>, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
43
|
+
verifyEmail(req: Request<{
|
|
44
|
+
token: string;
|
|
45
|
+
}>, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
46
|
+
requestPasswordReset(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
47
|
+
resetPassword(req: Request<{
|
|
48
|
+
token: string;
|
|
49
|
+
}, {}, {
|
|
50
|
+
newPassword: string;
|
|
51
|
+
}>, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
41
52
|
}
|
|
@@ -27,19 +27,20 @@ var AccessiController_1;
|
|
|
27
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
28
|
exports.AccessiController = void 0;
|
|
29
29
|
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
30
|
-
const autobind_1 = require("
|
|
31
|
-
const Utilities_1 = require("
|
|
30
|
+
const autobind_1 = require("../../autobind");
|
|
31
|
+
const Utilities_1 = require("../../Utilities");
|
|
32
32
|
const inversify_1 = require("inversify");
|
|
33
33
|
/**
|
|
34
34
|
* Controller per la gestione degli accessi e delle operazioni correlate.
|
|
35
35
|
* Fornisce metodi per login, registrazione, crittografia, decrittografia e gestione delle autorizzazioni utente.
|
|
36
36
|
*/
|
|
37
37
|
let AccessiController = AccessiController_1 = class AccessiController {
|
|
38
|
-
constructor(userService, permissionService, emailService,
|
|
38
|
+
constructor(userService, permissionService, authService, emailService, accessiOptions) {
|
|
39
39
|
this.userService = userService;
|
|
40
40
|
this.permissionService = permissionService;
|
|
41
|
-
this.emailService = emailService;
|
|
42
41
|
this.authService = authService;
|
|
42
|
+
this.emailService = emailService;
|
|
43
|
+
this.accessiOptions = accessiOptions;
|
|
43
44
|
}
|
|
44
45
|
getUserByToken(req, res) {
|
|
45
46
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -48,9 +49,8 @@ let AccessiController = AccessiController_1 = class AccessiController {
|
|
|
48
49
|
if (!token) {
|
|
49
50
|
return Utilities_1.RestUtilities.sendErrorMessage(res, "Token non fornito", AccessiController_1.name);
|
|
50
51
|
}
|
|
51
|
-
const jwtOptions = this.authService.getOptions().jwtOptions;
|
|
52
52
|
// Decodifica il token JWT
|
|
53
|
-
const decoded = jsonwebtoken_1.default.verify(token, jwtOptions.secret);
|
|
53
|
+
const decoded = jsonwebtoken_1.default.verify(token, this.accessiOptions.jwtOptions.secret);
|
|
54
54
|
if (!decoded) {
|
|
55
55
|
return Utilities_1.RestUtilities.sendUnauthorized(res);
|
|
56
56
|
}
|
|
@@ -68,10 +68,9 @@ let AccessiController = AccessiController_1 = class AccessiController {
|
|
|
68
68
|
const userData = yield this.authService.login(request);
|
|
69
69
|
if (!userData)
|
|
70
70
|
return Utilities_1.RestUtilities.sendInvalidCredentials(res);
|
|
71
|
-
const jwtOptions = this.authService.getOptions().jwtOptions;
|
|
72
71
|
userData.token = {
|
|
73
|
-
expiresIn: jwtOptions.expiresIn,
|
|
74
|
-
value: jsonwebtoken_1.default.sign({ userData }, jwtOptions.secret, { expiresIn: jwtOptions.expiresIn }),
|
|
72
|
+
expiresIn: this.accessiOptions.jwtOptions.expiresIn,
|
|
73
|
+
value: jsonwebtoken_1.default.sign({ userData }, this.accessiOptions.jwtOptions.secret, { expiresIn: this.accessiOptions.jwtOptions.expiresIn }),
|
|
75
74
|
type: "Bearer"
|
|
76
75
|
};
|
|
77
76
|
return Utilities_1.RestUtilities.sendBaseResponse(res, userData);
|
|
@@ -122,7 +121,7 @@ let AccessiController = AccessiController_1 = class AccessiController {
|
|
|
122
121
|
encrypt(req, res) {
|
|
123
122
|
return __awaiter(this, void 0, void 0, function* () {
|
|
124
123
|
try {
|
|
125
|
-
const key = this.
|
|
124
|
+
const key = this.accessiOptions.encryptionKey;
|
|
126
125
|
let encryptedData = Utilities_1.CryptUtilities.encrypt(req.body.data, key);
|
|
127
126
|
return Utilities_1.RestUtilities.sendBaseResponse(res, encryptedData);
|
|
128
127
|
}
|
|
@@ -134,7 +133,7 @@ let AccessiController = AccessiController_1 = class AccessiController {
|
|
|
134
133
|
decrypt(req, res) {
|
|
135
134
|
return __awaiter(this, void 0, void 0, function* () {
|
|
136
135
|
try {
|
|
137
|
-
const key = this.
|
|
136
|
+
const key = this.accessiOptions.encryptionKey;
|
|
138
137
|
let decryptedData = Utilities_1.CryptUtilities.decrypt(req.body.data, key);
|
|
139
138
|
return Utilities_1.RestUtilities.sendBaseResponse(res, decryptedData);
|
|
140
139
|
}
|
|
@@ -188,13 +187,47 @@ let AccessiController = AccessiController_1 = class AccessiController {
|
|
|
188
187
|
}
|
|
189
188
|
});
|
|
190
189
|
}
|
|
190
|
+
verifyEmail(req, res) {
|
|
191
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
192
|
+
try {
|
|
193
|
+
yield this.userService.verifyEmail(req.params.token);
|
|
194
|
+
return Utilities_1.RestUtilities.sendOKMessage(res, "Email verificata con successo!");
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
return Utilities_1.RestUtilities.sendErrorMessage(res, error, AccessiController_1.name);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
requestPasswordReset(req, res) {
|
|
202
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
203
|
+
try {
|
|
204
|
+
yield this.emailService.sendPasswordResetEmail(req.body.email, req.headers.origin);
|
|
205
|
+
return Utilities_1.RestUtilities.sendOKMessage(res, "Email di reset inviata!");
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return Utilities_1.RestUtilities.sendErrorMessage(res, error, AccessiController_1.name);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
resetPassword(req, res) {
|
|
213
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
+
try {
|
|
215
|
+
yield this.authService.resetPassword(req.params.token, req.body.newPassword);
|
|
216
|
+
return Utilities_1.RestUtilities.sendOKMessage(res, "Password aggiornata con successo!");
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return Utilities_1.RestUtilities.sendErrorMessage(res, error, AccessiController_1.name);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
191
223
|
};
|
|
192
224
|
exports.AccessiController = AccessiController;
|
|
193
225
|
exports.AccessiController = AccessiController = AccessiController_1 = __decorate([
|
|
194
226
|
autobind_1.autobind,
|
|
195
227
|
__param(0, (0, inversify_1.inject)("IUserService")),
|
|
196
228
|
__param(1, (0, inversify_1.inject)("IPermissionService")),
|
|
197
|
-
__param(2, (0, inversify_1.inject)("
|
|
198
|
-
__param(3, (0, inversify_1.inject)("
|
|
199
|
-
|
|
229
|
+
__param(2, (0, inversify_1.inject)("IAuthService")),
|
|
230
|
+
__param(3, (0, inversify_1.inject)("IEmailService")),
|
|
231
|
+
__param(4, (0, inversify_1.inject)("AccessiOptions")),
|
|
232
|
+
__metadata("design:paramtypes", [Object, Object, Object, Object, Object])
|
|
200
233
|
], AccessiController);
|
package/dist/accessi-module/{AccessiControllerBase.d.ts → Controllers/AccessiControllerBase.d.ts}
RENAMED
|
@@ -375,4 +375,13 @@ export declare abstract class AccessiControllerBase {
|
|
|
375
375
|
abstract setGdpr(req: Request<{}, {}, {
|
|
376
376
|
codiceUtente: string;
|
|
377
377
|
}>, res: Response): any;
|
|
378
|
+
abstract verifyEmail(req: Request<{
|
|
379
|
+
token: string;
|
|
380
|
+
}>, res: Response): any;
|
|
381
|
+
abstract requestPasswordReset(req: Request, res: Response): any;
|
|
382
|
+
abstract resetPassword(req: Request<{
|
|
383
|
+
token: string;
|
|
384
|
+
}, {}, {
|
|
385
|
+
newPassword: string;
|
|
386
|
+
}>, res: Response): any;
|
|
378
387
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AccessiController } from "
|
|
1
|
+
import { AccessiController } from "../Controllers/AccessiController";
|
|
2
2
|
import { Router } from "express";
|
|
3
|
-
import { IAccessiRoutes } from "
|
|
3
|
+
import { IAccessiRoutes } from "../IAccessiRoutes";
|
|
4
4
|
export declare class AccessiRoutes implements IAccessiRoutes {
|
|
5
5
|
private accessiController;
|
|
6
6
|
private logger;
|
|
@@ -15,8 +15,8 @@ var AccessiRoutes_1;
|
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
16
|
exports.AccessiRoutes = void 0;
|
|
17
17
|
const inversify_1 = require("inversify");
|
|
18
|
-
const Logger_1 = require("
|
|
19
|
-
const AccessiController_1 = require("
|
|
18
|
+
const Logger_1 = require("../../Logger");
|
|
19
|
+
const AccessiController_1 = require("../Controllers/AccessiController");
|
|
20
20
|
const express_1 = require("express");
|
|
21
21
|
let AccessiRoutes = AccessiRoutes_1 = class AccessiRoutes {
|
|
22
22
|
constructor(accessiController) {
|
|
@@ -38,6 +38,9 @@ let AccessiRoutes = AccessiRoutes_1 = class AccessiRoutes {
|
|
|
38
38
|
this.router.post(`/register`, this.accessiController.register.bind(this.accessiController));
|
|
39
39
|
this.router.post(`/set-gdpr`, this.accessiController.setGdpr.bind(this.accessiController));
|
|
40
40
|
this.router.post(`/reset-abilitazioni`, this.accessiController.resetAbilitazioni.bind(this.accessiController));
|
|
41
|
+
this.router.get('/verify-email/:token', this.accessiController.verifyEmail.bind(this.accessiController));
|
|
42
|
+
this.router.post('/reset-password', this.accessiController.requestPasswordReset.bind(this.accessiController));
|
|
43
|
+
this.router.post('/reset-password/:token', this.accessiController.resetPassword.bind(this.accessiController));
|
|
41
44
|
}
|
|
42
45
|
catch (error) {
|
|
43
46
|
this.logger.error("Si è verificato un errore:", error);
|
|
@@ -7,10 +7,10 @@ export declare class AuthService implements IAuthService {
|
|
|
7
7
|
private permissionService;
|
|
8
8
|
private accessiOptions;
|
|
9
9
|
constructor(userService: IUserService, permissionService: IPermissionService, accessiOptions: AccessiOptions);
|
|
10
|
-
getOptions(): AccessiOptions;
|
|
11
10
|
login(request: LoginRequest): Promise<ILoginResult>;
|
|
12
11
|
setPassword(codiceUtente: string, nuovaPassword: string): Promise<any>;
|
|
13
12
|
verifyPassword(codiceUtente: string, passwordCifrata: string): Promise<boolean>;
|
|
14
13
|
getAdminUser(): ILoginResult;
|
|
15
14
|
getDemoUser(): ILoginResult;
|
|
15
|
+
resetPassword(token: string, newPassword: string): Promise<void>;
|
|
16
16
|
}
|
|
@@ -32,9 +32,6 @@ let AuthService = class AuthService {
|
|
|
32
32
|
this.permissionService = permissionService;
|
|
33
33
|
this.accessiOptions = accessiOptions;
|
|
34
34
|
}
|
|
35
|
-
getOptions() {
|
|
36
|
-
return this.accessiOptions;
|
|
37
|
-
}
|
|
38
35
|
login(request) {
|
|
39
36
|
return __awaiter(this, void 0, void 0, function* () {
|
|
40
37
|
if (this.accessiOptions.mockDemoUser && request.username.toLowerCase() === "demo")
|
|
@@ -129,6 +126,25 @@ let AuthService = class AuthService {
|
|
|
129
126
|
abilitazioni: []
|
|
130
127
|
};
|
|
131
128
|
}
|
|
129
|
+
resetPassword(token, newPassword) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
try {
|
|
132
|
+
// Controlliamo se il token esiste
|
|
133
|
+
const result = yield Orm_1.Orm.query({}, "SELECT CODUTE FROM UTENTI WHERE KEYREG = ?", [token]);
|
|
134
|
+
if (result.length === 0) {
|
|
135
|
+
throw new Error("Token non valido o già usato.");
|
|
136
|
+
}
|
|
137
|
+
// Hashiamo la nuova password
|
|
138
|
+
const hashedPassword = Utilities_1.CryptUtilities.encrypt(newPassword, this.accessiOptions.encryptionKey);
|
|
139
|
+
// Aggiorniamo la password e rimuoviamo il token di reset
|
|
140
|
+
yield Orm_1.Orm.query({}, "UPDATE UTENTI SET PASSWORD = ?, KEYREG = NULL WHERE CODUTE = ?", [hashedPassword, result[0].CODUTE]);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
console.error("Errore nel reset della password:", error);
|
|
144
|
+
throw new Error("Errore durante il reset della password.");
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
132
148
|
};
|
|
133
149
|
exports.AuthService = AuthService;
|
|
134
150
|
exports.AuthService = AuthService = __decorate([
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { AccessiOptions } from "../../AccessiModule";
|
|
2
1
|
import { IAbilitazioneMenu, IFiltriUtente, IUser } from "../UserService/IUserService";
|
|
3
2
|
export interface ILoginResult {
|
|
4
3
|
utente: IUser;
|
|
@@ -18,12 +17,6 @@ export interface LoginRequest {
|
|
|
18
17
|
* Interfaccia per la gestione dell'autenticazione.
|
|
19
18
|
*/
|
|
20
19
|
export interface IAuthService {
|
|
21
|
-
/**
|
|
22
|
-
* Restituisce la configurazione delle opzioni di accesso.
|
|
23
|
-
*
|
|
24
|
-
* @returns {AccessiOptions} - Oggetto contenente le opzioni di configurazione per l'autenticazione.
|
|
25
|
-
*/
|
|
26
|
-
getOptions(): AccessiOptions;
|
|
27
20
|
/**
|
|
28
21
|
* Effettua il login dell'utente.
|
|
29
22
|
* @param {LoginRequest} request - Richiesta contenente username e password.
|
|
@@ -59,4 +52,13 @@ export interface IAuthService {
|
|
|
59
52
|
* @throws {Error} Se la query fallisce o si verifica un problema durante l'esecuzione.
|
|
60
53
|
*/
|
|
61
54
|
verifyPassword(codiceUtente: string, passwordCifrata: string): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Resetta la password di un utente utilizzando un token univoco.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} token - Il token di reset ricevuto via email.
|
|
59
|
+
* @param {string} newPassword - La nuova password scelta dall'utente.
|
|
60
|
+
* @returns {Promise<void>} - Nessun valore di ritorno se il reset ha successo.
|
|
61
|
+
* @throws {Error} - Se il token è invalido o già usato, o se si verifica un errore nel database.
|
|
62
|
+
*/
|
|
63
|
+
resetPassword(token: string, newPassword: string): Promise<void>;
|
|
62
64
|
}
|
|
@@ -3,8 +3,8 @@ import { IEmailService } from './IEmailService';
|
|
|
3
3
|
export declare class EmailService implements IEmailService {
|
|
4
4
|
private accessiOptions;
|
|
5
5
|
constructor(accessiOptions: AccessiOptions);
|
|
6
|
-
sendPasswordResetEmail(email: string, resetToken: string, baseUrl: string): Promise<void>;
|
|
7
6
|
sendAccountUpdateEmail(email: string, message: string): Promise<void>;
|
|
8
7
|
private transporter;
|
|
8
|
+
sendPasswordResetEmail(email: string, baseUrl: string): Promise<void>;
|
|
9
9
|
sendVerificationEmail(email: string, codiceUtente: string, baseUrl: string): Promise<void>;
|
|
10
10
|
}
|
|
@@ -34,12 +34,34 @@ let EmailService = class EmailService {
|
|
|
34
34
|
this.accessiOptions = accessiOptions;
|
|
35
35
|
this.transporter = nodemailer_1.default.createTransport(this.accessiOptions.emailOptions);
|
|
36
36
|
}
|
|
37
|
-
sendPasswordResetEmail(email, resetToken, baseUrl) {
|
|
38
|
-
throw new Error('Method not implemented.');
|
|
39
|
-
}
|
|
40
37
|
sendAccountUpdateEmail(email, message) {
|
|
41
38
|
throw new Error('Method not implemented.');
|
|
42
39
|
}
|
|
40
|
+
sendPasswordResetEmail(email, baseUrl) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
try {
|
|
43
|
+
const resetToken = (0, uuid_1.v4)(); // Generiamo un nuovo token unico
|
|
44
|
+
// Aggiorna il campo keyReg nel database
|
|
45
|
+
const result = yield Orm_1.Orm.query({}, "UPDATE UTENTI SET KEYREG = ? WHERE USRNAME = ? RETURNING CODUTE", [resetToken, email]);
|
|
46
|
+
if (result.length === 0) {
|
|
47
|
+
throw new Error("Email non trovata.");
|
|
48
|
+
}
|
|
49
|
+
const resetUrl = `${baseUrl}/reset-password/${resetToken}`;
|
|
50
|
+
const mailOptions = {
|
|
51
|
+
from: this.accessiOptions.emailOptions.from,
|
|
52
|
+
to: email,
|
|
53
|
+
subject: "Reset della tua password",
|
|
54
|
+
text: `Clicca sul seguente link per resettare la tua password: ${resetUrl}`,
|
|
55
|
+
html: `<p>Clicca sul seguente link per resettare la tua password:</p><a href="${resetUrl}">${resetUrl}</a>`,
|
|
56
|
+
};
|
|
57
|
+
yield this.transporter.sendMail(mailOptions);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error("Errore nell'invio dell'email di reset password:", error);
|
|
61
|
+
throw new Error("Errore durante l'invio dell'email di reset password.");
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
43
65
|
sendVerificationEmail(email, codiceUtente, baseUrl) {
|
|
44
66
|
return __awaiter(this, void 0, void 0, function* () {
|
|
45
67
|
try {
|
|
@@ -18,7 +18,7 @@ export interface IEmailService {
|
|
|
18
18
|
* @returns {Promise<void>} Una Promise che si risolve al completamento dell'invio.
|
|
19
19
|
* @throws {Error} Se l'invio dell'email fallisce.
|
|
20
20
|
*/
|
|
21
|
-
sendPasswordResetEmail(email: string,
|
|
21
|
+
sendPasswordResetEmail(email: string, baseUrl: string): Promise<void>;
|
|
22
22
|
/**
|
|
23
23
|
* Invia un'email di conferma per la modifica dell'account o di altri dettagli.
|
|
24
24
|
*
|
|
@@ -107,4 +107,12 @@ export interface IUserService {
|
|
|
107
107
|
* @throws {Error} Se la query fallisce o si verifica un problema durante l'esecuzione.
|
|
108
108
|
*/
|
|
109
109
|
getUserFilters(codiceUtente: string): Promise<IFiltriUtente[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Verifica l'email di un utente utilizzando un token univoco.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} token - Il token di verifica (`keyReg`) ricevuto via email.
|
|
114
|
+
* @returns {Promise<void>} - Nessun valore di ritorno se la verifica ha successo.
|
|
115
|
+
* @throws {Error} - Se il token è invalido o già usato, o se si verifica un errore nel database.
|
|
116
|
+
*/
|
|
117
|
+
verifyEmail(token: string): Promise<void>;
|
|
110
118
|
}
|
|
@@ -17,4 +17,5 @@ export declare class UserService implements IUserService {
|
|
|
17
17
|
deleteUser(codiceCliente: string): Promise<void>;
|
|
18
18
|
setGdpr(codiceUtente: string): Promise<any>;
|
|
19
19
|
setStatoRegistrazione(statoRegistrazione: StatoRegistrazione, codiceUtente: string): Promise<any>;
|
|
20
|
+
verifyEmail(token: string): Promise<void>;
|
|
20
21
|
}
|
|
@@ -210,6 +210,23 @@ let UserService = class UserService {
|
|
|
210
210
|
}
|
|
211
211
|
});
|
|
212
212
|
}
|
|
213
|
+
verifyEmail(token) {
|
|
214
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
+
try {
|
|
216
|
+
// Controlliamo se il token esiste
|
|
217
|
+
const result = yield Orm_1.Orm.query({}, "SELECT CODUTE FROM UTENTI WHERE KEYREG = ?", [token]);
|
|
218
|
+
if (result.length === 0) {
|
|
219
|
+
throw new Error("Token non valido o già usato.");
|
|
220
|
+
}
|
|
221
|
+
// Attiviamo l'account e rimuoviamo il token
|
|
222
|
+
yield Orm_1.Orm.query({}, "UPDATE UTENTI SET STAREG = ?, KEYREG = NULL WHERE CODUTE = ?", [StatoRegistrazione_1.StatoRegistrazione.CONF, result[0].CODUTE]);
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error("Errore nella verifica email:", error);
|
|
226
|
+
throw new Error("Errore durante la verifica dell'email.");
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
213
230
|
};
|
|
214
231
|
exports.UserService = UserService;
|
|
215
232
|
exports.UserService = UserService = __decorate([
|
|
@@ -6,9 +6,9 @@ const UserService_1 = require("./Services/UserService/UserService");
|
|
|
6
6
|
const AuthService_1 = require("./Services/AuthService/AuthService");
|
|
7
7
|
const PermissionService_1 = require("./Services/PermissionService/PermissionService");
|
|
8
8
|
const EmailService_1 = require("./Services/EmailService/EmailService");
|
|
9
|
-
const AccessiController_1 = require("./AccessiController");
|
|
10
|
-
const AccessiRoutes_1 = require("./AccessiRoutes");
|
|
11
|
-
const AccessiControllerBase_1 = require("./AccessiControllerBase");
|
|
9
|
+
const AccessiController_1 = require("./Controllers/AccessiController");
|
|
10
|
+
const AccessiRoutes_1 = require("./Routes/AccessiRoutes");
|
|
11
|
+
const AccessiControllerBase_1 = require("./Controllers/AccessiControllerBase");
|
|
12
12
|
const container = new inversify_1.Container({ defaultScope: "Singleton" });
|
|
13
13
|
exports.container = container;
|
|
14
14
|
console.log("UserService:", UserService_1.UserService);
|
|
@@ -36,6 +36,7 @@ const accessiOptions = {
|
|
|
36
36
|
user: "",
|
|
37
37
|
pass: ""
|
|
38
38
|
},
|
|
39
|
+
from: "",
|
|
39
40
|
host: "",
|
|
40
41
|
port: 0,
|
|
41
42
|
secure: false
|
package/package.json
CHANGED
/package/dist/accessi-module/{AccessiControllerBase.js → Controllers/AccessiControllerBase.js}
RENAMED
|
File without changes
|