alterações de melhorias
This commit is contained in:
@@ -1,7 +1,23 @@
|
||||
const db = require('../database');
|
||||
const crypto = require('crypto');
|
||||
const { listAliases } = db;
|
||||
const { isGerente } = require('../middlewares/roles');
|
||||
|
||||
/**
|
||||
* Valida o token de administração (segundo fator para SQL direto).
|
||||
* Comparação em tempo constante para prevenir timing attacks.
|
||||
*/
|
||||
function validarAdminToken(req) {
|
||||
const esperado = process.env.ADMIN_TOKEN;
|
||||
if (!esperado) return false; // Se não configurado, ninguém acessa
|
||||
const recebido = req.headers['x-admin-token'] || '';
|
||||
try {
|
||||
return crypto.timingSafeEqual(Buffer.from(recebido), Buffer.from(esperado));
|
||||
} catch (_) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class GenericController {
|
||||
/**
|
||||
* Executa uma consulta SQL genérica (SELECT)
|
||||
@@ -15,6 +31,10 @@ class GenericController {
|
||||
return res.status(403).json({ success: false, error: 'Apenas gerentes podem executar SQL direto.' });
|
||||
}
|
||||
|
||||
if (!validarAdminToken(req)) {
|
||||
return res.status(403).json({ success: false, error: 'Token de administração (X-Admin-Token) inválido ou não configurado.' });
|
||||
}
|
||||
|
||||
if (!sql) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
@@ -42,6 +62,10 @@ class GenericController {
|
||||
return res.status(403).json({ success: false, error: 'Apenas gerentes podem executar SQL direto.' });
|
||||
}
|
||||
|
||||
if (!validarAdminToken(req)) {
|
||||
return res.status(403).json({ success: false, error: 'Token de administração (X-Admin-Token) inválido ou não configurado.' });
|
||||
}
|
||||
|
||||
if (!sql) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
@@ -94,23 +118,31 @@ class GenericController {
|
||||
}
|
||||
|
||||
/**
|
||||
* Health check do alias específico
|
||||
* Health check completo do alias específico.
|
||||
* Verifica: conectividade Firebird, uso de memória, uptime.
|
||||
*/
|
||||
static async healthCheck(req, res) {
|
||||
try {
|
||||
const { alias } = req.params;
|
||||
const t0 = Date.now();
|
||||
const isConnected = await db.testConnection(alias);
|
||||
const pingMs = Date.now() - t0;
|
||||
const mem = process.memoryUsage();
|
||||
res.json({
|
||||
success: true,
|
||||
alias,
|
||||
connected: isConnected,
|
||||
pingMs,
|
||||
uptimeSeconds: Math.floor(process.uptime()),
|
||||
memory: {
|
||||
rssMB: Math.round(mem.rss / 1024 / 1024),
|
||||
heapUsedMB: Math.round(mem.heapUsed / 1024 / 1024),
|
||||
heapTotalMB: Math.round(mem.heapTotal / 1024 / 1024),
|
||||
},
|
||||
timestamp: new Date().toISOString(),
|
||||
});
|
||||
} catch (err) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: err.message,
|
||||
});
|
||||
res.status(500).json({ success: false, error: err.message });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user