Files
vue-pult/server/api/user-info.js
sasha 3e90269b0b Initial commit: Vue.js тир управления система
- Клиентская часть Vue 3 + Vite
- Серверная часть Node.js + WebSocket
- Система авторизации и смен
- Управление игровыми портами
- Поддержка тем (светлая/темная)
- Адаптивный дизайн

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-19 12:24:22 +03:00

107 lines
4.4 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 fs = require('node:fs/promises');
const path = require('path');
exports.go = async (req, res, postData, urlParsed) => {
try {
console.log('[api/user-info] Запрос информации о пользователе:', {
phone: postData.phone,
hasHash: !!postData.hash
});
// Проверяем обязательные поля
if (!postData.phone || !postData.hash) {
return res.end(JSON.stringify({
success: false,
error: "Не указан номер телефона или сессионный хэш"
}));
}
// Нормализуем номер телефона
const normalizedPhone = postData.phone.replace(/\D/g, '');
// Читаем данные пользователей и сессионных хэшей
let avt = {};
let hash = {};
try {
const avtData = await fs.readFile(path.join(__dirname, '../data/avt.ini'), 'utf8');
avt = JSON.parse(avtData);
} catch (error) {
console.error('[api/user-info] Ошибка чтения avt.ini:', error);
return res.end(JSON.stringify({
success: false,
error: "Ошибка загрузки данных пользователей"
}));
}
try {
const hashData = await fs.readFile(path.join(__dirname, '../data/hash.ini'), 'utf8');
hash = JSON.parse(hashData);
} catch (error) {
console.warn('[api/user-info] Файл hash.ini не найден');
hash = {};
}
// ПРОВЕРКА СЕССИОННОГО ХЭША
if (normalizedPhone in hash && normalizedPhone in avt && hash[normalizedPhone] === postData.hash) {
console.log('[api/user-info] ✅ Сессионный хэш действителен');
const user = JSON.parse(JSON.stringify(avt[normalizedPhone]));
delete user.pass;
if (user.groupz && user.groupz.access) delete user.groupz.access;
// Определяем роль пользователя
let userRole = 'operator';
if (user.taccess) {
userRole = user.taccess;
} else if (user.access && user.access.fullaccess) {
userRole = 'admin';
} else if (user.groupz && user.groupz.name) {
const groupName = user.groupz.name.toLowerCase();
if (groupName.includes('программист') || groupName.includes('админ')) {
userRole = 'admin';
} else if (groupName.includes('оператор')) {
userRole = 'operators';
} else if (groupName.includes('техник')) {
userRole = 'technics';
}
}
// Возвращаем актуальные данные пользователя
const response = {
success: true,
user: {
id: user._id || normalizedPhone,
name: user.fio || user.name || 'Пользователь',
phone: normalizedPhone,
role: userRole,
isAuthenticated: true,
hash: postData.hash, // Возвращаем тот же хэш
// Дополнительные данные
group: user.groupz ? user.groupz.name : null,
color: user.color || null,
balance: user.bal || null,
serverConnected: global.conn_to_server || false,
lastUpdate: Date.now()
}
};
res.end(JSON.stringify(response));
} else {
console.log('[api/user-info] ❌ Сессионный хэш недействителен');
res.end(JSON.stringify({
success: false,
error: "Сессия истекла или недействительна"
}));
}
} catch (error) {
console.error('[api/user-info] Критическая ошибка:', error);
res.end(JSON.stringify({
success: false,
error: "Внутренняя ошибка сервера"
}));
}
};