Skip to content

Commit 7cd704f

Browse files
authored
Merge pull request #70 from artemploxoyy/feat/plugin-dependencies-and-proxy-fixes
fix: валидация портов серверов и автоочистка невалидных записей
2 parents 2a2d56c + c59a6c1 commit 7cd704f

2 files changed

Lines changed: 25 additions & 3 deletions

File tree

backend/src/api/routes/servers.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ router.post('/', authorize('server:create'), async (req, res) => {
3939
if (!name || !host || !version) {
4040
return res.status(400).json({ error: 'Имя, хост и версия сервера обязательны' });
4141
}
42+
43+
const portNumber = port ? parseInt(port, 10) : 25565;
44+
if (isNaN(portNumber) || portNumber < 1 || portNumber > 65535) {
45+
return res.status(400).json({ error: 'Порт должен быть числом от 1 до 65535 (максимум 5 цифр)' });
46+
}
47+
4248
const newServer = await prisma.server.create({
43-
data: { name, host, port: port ? parseInt(port, 10) : 25565, version },
49+
data: { name, host, port: portNumber, version },
4450
});
4551
res.status(201).json(newServer);
4652
} catch (error) {
@@ -58,7 +64,13 @@ router.put('/:id', authorize('server:create'), async (req, res) => {
5864
const dataToUpdate = {};
5965
if (name !== undefined) dataToUpdate.name = name;
6066
if (host !== undefined) dataToUpdate.host = host;
61-
if (port !== undefined && port !== '') dataToUpdate.port = parseInt(port, 10);
67+
if (port !== undefined && port !== '') {
68+
const portNumber = parseInt(port, 10);
69+
if (isNaN(portNumber) || portNumber < 1 || portNumber > 65535) {
70+
return res.status(400).json({ error: 'Порт должен быть числом от 1 до 65535 (максимум 5 цифр)' });
71+
}
72+
dataToUpdate.port = portNumber;
73+
}
6274
if (version !== undefined) dataToUpdate.version = version;
6375

6476
Object.keys(dataToUpdate).forEach(k => { if (dataToUpdate[k] === undefined) delete dataToUpdate[k]; });

backend/src/server.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,24 @@ app.get(/^(?!\/api).*/, (req, res) => {
102102

103103
async function runStartupMigrations() {
104104
try {
105+
// Удаляем серверы с невалидными портами напрямую через SQL,
106+
// потому что Prisma не может их прочитать если значение не помещается в INT
107+
const result = await prisma.$executeRawUnsafe(
108+
`DELETE FROM Server WHERE length(CAST(port AS TEXT)) > 5 OR port > 65535 OR port < 1`
109+
);
110+
111+
if (result > 0) {
112+
console.log(`[Migration] Удалено ${result} серверов с невалидными портами.`);
113+
}
114+
105115
const adminRole = await prisma.panelRole.findUnique({ where: { name: 'Admin' } });
106116
if (adminRole) {
107117
const permissions = JSON.parse(adminRole.permissions);
108118
if (permissions.includes('*')) {
109119
const newPermissions = ALL_PERMISSIONS
110120
.map(p => p.id)
111121
.filter(id => id !== '*');
112-
122+
113123
await prisma.panelRole.update({
114124
where: { id: adminRole.id },
115125
data: { permissions: JSON.stringify(newPermissions) }

0 commit comments

Comments
 (0)