Files
ldap-auth-service/lib/gosuslugiApi.js
2026-08-24 15:19:24 +05:00

96 lines
3.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
const express = require('express');
const ldapClient = require('./ldapClient');
const sessions = require('./sessions');
const audit = require('./auditLog');
const router = express.Router();
function getToken(req) {
const header = req.headers.authorization || '';
if (header.startsWith('Bearer ')) return header.slice(7);
return null;
}
function requireAuth(req, res, next) {
const session = sessions.getSession(getToken(req));
if (!session) {
return res.status(401).json({ success: false, error: 'Требуется авторизация' });
}
req.session = session;
next();
}
function errorResponse(res, err) {
const status = err.status || 500;
res.status(status).json({ success: false, error: err.message || 'Внутренняя ошибка сервера' });
}
// Список пользователей LDAP (список №2) для сравнения
router.get('/users', requireAuth, async (req, res) => {
try {
const users = await ldapClient.listUsers();
res.json({
success: true,
users: users.map((u) => ({
login: u.login,
fio: u.full_name || '',
email: u.email || ''
}))
});
} catch (err) {
errorResponse(res, err);
}
});
// Синхронизация: обновление ФИО и почты у выбранных пользователей AD
router.post('/sync', requireAuth, async (req, res) => {
const body = req.body || {};
const pairs = Array.isArray(body.pairs) ? body.pairs : [];
if (pairs.length === 0) {
return res.status(400).json({ success: false, error: 'Не указаны пары для синхронизации' });
}
const clean = pairs
.map((p) => p || {})
.filter((p) => typeof p.login === 'string' && String(p.login).trim())
.map((p) => ({
login: String(p.login).trim(),
fio: typeof p.fio === 'string' ? String(p.fio).trim() : '',
email: typeof p.email === 'string' ? String(p.email).trim() : ''
}));
if (clean.length === 0) {
return res.status(400).json({ success: false, error: 'Нет корректных пар (нужен логин пользователя AD)' });
}
const results = [];
for (const pair of clean) {
const item = { login: pair.login, before: { fio: '', email: '' }, after: { fio: pair.fio, email: pair.email }, ok: false, error: null };
try {
const current = await ldapClient.getUser(pair.login);
item.before.fio = current.full_name || '';
item.before.email = current.email || '';
await ldapClient.updateUser(pair.login, { fio: pair.fio, email: pair.email });
item.ok = true;
} catch (err) {
item.error = err.message || 'Ошибка обновления';
}
results.push(item);
}
const okCount = results.filter((r) => r.ok).length;
audit.logAdminEntry({
ip: req.ip,
username: (req.session.user && req.session.user.username) || '',
success: true,
reason: `gosuslugi sync: ${okCount}/${results.length}`
});
res.json({ success: true, ok: okCount, failed: results.length - okCount, results });
});
module.exports = router;