96 lines
3.1 KiB
JavaScript
96 lines
3.1 KiB
JavaScript
'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;
|