refactor: шаг 4 — GET /export вынесен в src/routes/export.js

This commit is contained in:
2026-05-30 13:38:03 +03:00
parent b25f346d97
commit f91a882379
2 changed files with 64 additions and 19 deletions
+8 -19
View File
@@ -40,30 +40,19 @@ async function start() {
// ── Публичные маршруты (до auth.middleware) ──────────────────────────────────
// k8s liveness probe
// k8s liveness probe — простая проверка что сервер жив
app.get('/healthz', (req, res) => res.send('OK'));
// JWKS endpoint для валидации токенов внешними сервисами (только в mock-режиме)
if (auth.jwksHandler) app.get('/.well-known/jwks.json', auth.jwksHandler);
// /export агрегированный список всех активных CIDR по всем компаниям.
// ТЗ: «авторизация не требуется, доступ ограничивается на сетевом уровне».
// Маршрут регистрируется ДО auth.middleware чтобы не требовать jwt-cookie.
// exportLimiter: не более 20 запросов/мин с одного IP (защита от scraping).
app.get('/export', exportLimiter, async (req, res) => {
try {
// Получаем все активные CIDR без фильтра по компании
const cidrs = await q.getExportCIDRs();
// Суммаризация: объединяем пересекающиеся диапазоны → минимальный набор
const aggregated = aggregateCIDRs(cidrs);
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
res.setHeader('Content-Disposition', 'inline; filename="whitelist.txt"');
res.send(aggregated.join('\n') + (aggregated.length ? '\n' : ''));
} catch (e) {
console.error('Export error:', e);
res.status(500).send('Export error');
}
});
// GET /export: агрегированный список CIDR, без авторизации.
// src/routes/export.js содержит логику и комментарии.
app.use(require('./src/routes/export').createRouter({
q,
exportLimiter,
aggregateCIDRs,
}));
// Страница входа — отдаём форму выбора мок-пользователя.
// Генерируем CSRF-токен и передаём в шаблон для скрытого поля формы.