v0.5.174: timeout IAM 5с, rate-limiters на login/CRUD/export

This commit is contained in:
2026-06-22 19:24:58 +04:00
parent 0135d28189
commit df697cd703
5 changed files with 15 additions and 9 deletions
+8 -5
View File
@@ -31,6 +31,7 @@ const { createUserRouter } = require('./src/user');
const { createAdminRouter } = require('./src/admin');
const { pool } = require('./src/db');
const { ensureSchema } = require('./src/db/schema');
const { mutationLimiter, exportLimiter } = require('../../src/middleware/rateLimit');
function createV2Router({ generateCsrfToken, doubleCsrfProtection } = {}) {
// Автосоздание таблиц v2_companies, v2_entries, v2_audit при старте
@@ -102,10 +103,10 @@ function createV2Router({ generateCsrfToken, doubleCsrfProtection } = {}) {
});
// ── /v2/app — пользовательский CRUD (только с сессией) ──────────────
router.use('/app', enhanceImpersonation, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createUserRouter({ generateCsrfToken }));
router.use('/app', mutationLimiter, enhanceImpersonation, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createUserRouter({ generateCsrfToken }));
// ── /v2/admin — админка: лимиты + аудит ──────────────────────────
router.use('/admin', enhanceImpersonation, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createAdminRouter({ generateCsrfToken }));
router.use('/admin', mutationLimiter, enhanceImpersonation, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createAdminRouter({ generateCsrfToken }));
// ── GET /v2/ — редирект на /v2/app ──────────────────────────────────
router.get('/', (req, res) => res.redirect('/v2/app'));
@@ -121,7 +122,7 @@ function createV2Router({ generateCsrfToken, doubleCsrfProtection } = {}) {
// ── /v2/export — выгрузка CIDR (только для админов) ─────────────
const { createExportRouter } = require('./src/export');
router.use('/export', resolveContext, (req, res, next) => {
router.use('/export', exportLimiter, resolveContext, (req, res, next) => {
if (!req.canAdmin) return res.status(403).send('Доступ запрещён — только для администраторов');
next();
}, createExportRouter());
@@ -172,7 +173,7 @@ async function iamFetch(token, url) {
const https = require('https');
const u = new URL(url);
return new Promise((resolve, reject) => {
https.get({
const req = https.get({
hostname: u.hostname, port: 443, path: u.pathname,
headers: { Authorization: 'Bearer ' + token, Accept: 'application/json' },
}, res => {
@@ -182,7 +183,9 @@ async function iamFetch(token, url) {
if (res.statusCode !== 200) return reject(new Error(res.statusCode + ': ' + data.slice(0, 200)));
try { resolve(JSON.parse(data)); } catch (e) { reject(e); }
});
}).on('error', reject);
});
req.on('error', reject);
req.setTimeout(5000, () => { req.destroy(); reject(new Error('timeout')); });
});
}