exodus-framework 2.2.10919 → 2.2.10921
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.
|
@@ -12,7 +12,7 @@ declare class SSEHandler extends System {
|
|
|
12
12
|
private tickInterval;
|
|
13
13
|
constructor(request: Request, response: Response);
|
|
14
14
|
onInit(): Promise<void> | void;
|
|
15
|
-
onConnect(): Promise<void
|
|
15
|
+
onConnect(): Promise<void>;
|
|
16
16
|
onAfterConnect(): Promise<void> | void;
|
|
17
17
|
onDisconnect(): Promise<void> | void;
|
|
18
18
|
onAborted(): Promise<void> | void;
|
|
@@ -28,6 +28,7 @@ declare class SSEHandler extends System {
|
|
|
28
28
|
protected send(event: string, data: any): void;
|
|
29
29
|
static handle(): (request: Request, res: Response) => Promise<void>;
|
|
30
30
|
private encryptData;
|
|
31
|
+
private decryptToken;
|
|
31
32
|
}
|
|
32
33
|
export default SSEHandler;
|
|
33
34
|
//# sourceMappingURL=ssehandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssehandler.d.ts","sourceRoot":"","sources":["../../../../src/app/classes/socket/ssehandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ssehandler.d.ts","sourceRoot":"","sources":["../../../../src/app/classes/socket/ssehandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAO5D,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,cAAM,UAAW,SAAQ,MAAM;IAS3B,SAAS,CAAC,OAAO,EAAE,OAAO;IAC1B,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAT9B,SAAS,CAAC,IAAI,EAAG,cAAc,CAAC;IAChC,SAAS,CAAC,MAAM,EAAG,OAAO,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAG,OAAO,CAAC;IAC7B,OAAO,CAAC,SAAS,CAAU;IAC3B,SAAS,CAAC,cAAc,EAAG,MAAM,CAAC;IAClC,OAAO,CAAC,YAAY,CAAyB;gBAGjC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ;IAKvB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAOxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBhC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAgBtC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAUpC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAUjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAG9B,OAAO;IAGP,SAAS;IAGhB,SAAS,CAAC,iBAAiB;IAI3B;;;;OAIG;IACH,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;WAazB,MAAM,cACK,OAAO,OAAO,QAAQ;IAS/C,OAAO,CAAC,WAAW;YA0BL,YAAY;CAgG3B;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import { isBefore } from 'date-fns';
|
|
1
3
|
import { eExecutionSide } from '../../../contracts/core.js';
|
|
4
|
+
import { Application } from '../../../models/Application.js';
|
|
5
|
+
import SecurityService from '../../../services/security.js';
|
|
6
|
+
import Core from '../../core.js';
|
|
2
7
|
import System from '../system.js';
|
|
3
|
-
import crypto from 'crypto';
|
|
4
8
|
class SSEHandler extends System {
|
|
5
9
|
request;
|
|
6
10
|
response;
|
|
@@ -21,7 +25,7 @@ class SSEHandler extends System {
|
|
|
21
25
|
this.security = false;
|
|
22
26
|
this.ticketInterval = 3000; // 3 segundos
|
|
23
27
|
}
|
|
24
|
-
onConnect() {
|
|
28
|
+
async onConnect() {
|
|
25
29
|
this.response.setHeader('Content-Type', 'text/event-stream');
|
|
26
30
|
this.response.setHeader('Cache-Control', 'no-cache');
|
|
27
31
|
this.response.setHeader('Connection', 'keep-alive');
|
|
@@ -34,6 +38,7 @@ class SSEHandler extends System {
|
|
|
34
38
|
this.response.on('error', () => {
|
|
35
39
|
this.onAborted();
|
|
36
40
|
});
|
|
41
|
+
await this.decryptToken();
|
|
37
42
|
}
|
|
38
43
|
onAfterConnect() {
|
|
39
44
|
if (this.security) {
|
|
@@ -115,6 +120,85 @@ class SSEHandler extends System {
|
|
|
115
120
|
return data;
|
|
116
121
|
}
|
|
117
122
|
}
|
|
123
|
+
async decryptToken() {
|
|
124
|
+
if (!this.request) {
|
|
125
|
+
throw new Error('Request object is not available for token decryption');
|
|
126
|
+
}
|
|
127
|
+
const token = this.request.headers['authorization'] &&
|
|
128
|
+
typeof this.request.headers['authorization'] === 'string'
|
|
129
|
+
? this.request.headers['authorization'].replace('Bearer ', '')
|
|
130
|
+
: '';
|
|
131
|
+
const tenantId = this.request.headers['X-Exodus-Tenant-ID'];
|
|
132
|
+
const applicationId = this.request.headers['X-Exodus-Application-ID'];
|
|
133
|
+
let isApplication = false;
|
|
134
|
+
let envUuid = '';
|
|
135
|
+
try {
|
|
136
|
+
if (!token) {
|
|
137
|
+
throw new Error('Token ausente');
|
|
138
|
+
}
|
|
139
|
+
const data = await SecurityService.getService().verifySignature(token, SecurityService.getService().getServicePublicKey());
|
|
140
|
+
if (!data) {
|
|
141
|
+
throw new Error('Token inválido');
|
|
142
|
+
}
|
|
143
|
+
const account = data['account'];
|
|
144
|
+
this.request.auth = {
|
|
145
|
+
account: account,
|
|
146
|
+
exp: data.exp || 0,
|
|
147
|
+
iat: 0,
|
|
148
|
+
iss: data.iss || ''
|
|
149
|
+
};
|
|
150
|
+
const requestor = {
|
|
151
|
+
database: '',
|
|
152
|
+
id: account.uuid,
|
|
153
|
+
name: account.name,
|
|
154
|
+
environmentId: tenantId,
|
|
155
|
+
trigger: tenantId
|
|
156
|
+
};
|
|
157
|
+
/* Aplicações */
|
|
158
|
+
if (applicationId) {
|
|
159
|
+
isApplication = true;
|
|
160
|
+
const application = await Application.findOne({ where: { token: applicationId } });
|
|
161
|
+
if (!application) {
|
|
162
|
+
throw new Error('Token de aplicação inválido');
|
|
163
|
+
}
|
|
164
|
+
else if (!application.active) {
|
|
165
|
+
throw new Error('Token de aplicação desativado');
|
|
166
|
+
}
|
|
167
|
+
else if (isBefore(application.expiresAt, new Date())) {
|
|
168
|
+
throw new Error('Token de aplicação expirado');
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
//valido
|
|
172
|
+
const data = await SecurityService.singleton().verifySignature(applicationId, SecurityService.getService().getServicePublicKey());
|
|
173
|
+
if (!data) {
|
|
174
|
+
throw new Error('Token de aplicação sem autênticidade');
|
|
175
|
+
}
|
|
176
|
+
requestor.database = data.payload.database;
|
|
177
|
+
requestor.environmentId = data.payload.envUuid;
|
|
178
|
+
requestor.name = application.dataValues.name;
|
|
179
|
+
requestor.id = data.payload.token;
|
|
180
|
+
requestor.trigger = applicationId;
|
|
181
|
+
envUuid = data.payload.envUuid;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (tenantId) {
|
|
185
|
+
envUuid = tenantId;
|
|
186
|
+
}
|
|
187
|
+
if (account && account.type != 'ADMINISTRATOR') {
|
|
188
|
+
requestor.environmentId = account.envUuid;
|
|
189
|
+
envUuid = account.envUuid;
|
|
190
|
+
}
|
|
191
|
+
this.request.tenant = {
|
|
192
|
+
id: envUuid || Core.settings.getDatabase().main.database
|
|
193
|
+
};
|
|
194
|
+
this.request.requestor = requestor;
|
|
195
|
+
this.request.isApplication = isApplication;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
console.warn('SSE token decryption failed:', error);
|
|
199
|
+
throw new Error('Falha na autenticação do token');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
118
202
|
}
|
|
119
203
|
export default SSEHandler;
|
|
120
204
|
//# sourceMappingURL=ssehandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssehandler.js","sourceRoot":"","sources":["../../../../src/app/classes/socket/ssehandler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ssehandler.js","sourceRoot":"","sources":["../../../../src/app/classes/socket/ssehandler.ts"],"names":[],"mappings":"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"}
|