Skip to content

fix: валидация портов серверов и автоочистка невалидных записей#70

Merged
mmeerrkkaa merged 1 commit into
blockmineJS:masterfrom
artemploxoyy:feat/plugin-dependencies-and-proxy-fixes
Dec 21, 2025
Merged

fix: валидация портов серверов и автоочистка невалидных записей#70
mmeerrkkaa merged 1 commit into
blockmineJS:masterfrom
artemploxoyy:feat/plugin-dependencies-and-proxy-fixes

Conversation

@artemploxoyy
Copy link
Copy Markdown
Contributor

@artemploxoyy artemploxoyy commented Dec 21, 2025

Описание

Исправлена проблема с невалидными портами серверов, которая приводила к ошибке
Value does not fit in an INT column при попытке создать сервер с портом
больше 5 цифр (больше 65535).

Изменения

Валидация портов

  • ✅ Добавлена валидация порта (1-65535) при создании сервера
  • ✅ Добавлена валидация порта при обновлении сервера
  • ✅ Понятные сообщения об ошибках для пользователя

Автоматическая очистка

  • ✅ Автоудаление серверов с невалидными портами при старте приложения
  • ✅ Использован прямой SQL запрос для обхода ограничений Prisma ORM
  • ✅ Проверка трех условий: длина > 5 цифр, порт > 65535, порт < 1

Файлы изменены

  • backend/src/api/routes/servers.js - валидация в API endpoints
  • backend/src/server.js - автоочистка при старте

Тестирование

  • База данных очищена от невалидных портов
  • Невозможно создать сервер с портом > 65535
  • Невозможно обновить сервер с портом > 65535
  • При старте автоматически удаляются серверы с невалидными портами

Summary by Sourcery

Обеспечить использование допустимых диапазонов серверных портов и очистку некорректных записей о серверах при запуске.

Исправления ошибок:

  • Предотвратить создание и обновление серверов с портами вне допустимого диапазона, которые ранее вызывали ошибки переполнения столбца типа INT.

Улучшения:

  • Проверять порты серверов (1–65535) при создании и обновлении, выводя понятные пользователю сообщения об ошибках.
  • Автоматически удалять существующие серверы с недопустимыми значениями портов во время запуска приложения с помощью прямой SQL-очистки.
Original summary in English

Summary by Sourcery

Enforce valid server port ranges and clean up invalid server records on startup.

Bug Fixes:

  • Prevent creation and update of servers with ports outside the valid range that previously caused INT column overflow errors.

Enhancements:

  • Validate server ports (1–65535) on create and update with user-friendly error messages.
  • Automatically delete existing servers with invalid port values during application startup via a direct SQL cleanup.

Summary by CodeRabbit

Новые возможности

  • Добавлена валидация номера порта при создании и обновлении сервера (допускаются только целые числа от 1 до 65535)

Исправления ошибок

  • Автоматическая очистка серверов с невалидными портами при запуске системы

✏️ Tip: You can customize this high-level summary in your review settings.

Исправлена проблема с невалидными портами серверов:
- Добавлена валидация порта (1-65535) при создании
- Добавлена валидация порта при обновлении
- Автоудаление серверов с невалидными портами при старте

Решает ошибку "Value does not fit in an INT column".
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Dec 21, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Обзор

Добавлена валидация номера порта в эндпоинты создания и обновления серверов с диапазоном 1-65535, включена очистка базы данных от серверов с невалидными портами при запуске приложения, и проведены корректировки в логике управления разрешениями администратора.

Изменения

Группа / Файлы Описание
Валидация портов в маршрутах
backend/src/api/routes/servers.js
Добавлена валидация portNumber для POST /servers (по умолчанию 25565) и валидация port для PUT /servers/:id с проверкой диапазона 1-65535; возвращает 400 при невалидном порте
Очистка данных при запуске
backend/src/server.js
Добавлена миграция, удаляющая серверы с невалидными портами используя prisma.$executeRawUnsafe; скорректирована логика управления разрешениями админ-роли с удалением wildcard '*'

Предполагаемая сложность проверки

🎯 2 (Simple) | ⏱️ ~12 минут

  • Особое внимание к SQL-запросу в миграции: убедиться в корректности проверки границ портов и отсутствии побочных эффектов
  • Проверить консистентность валидации портов между POST и PUT эндпоинтами

Стихотворение

🐰 Портам спешу назначить границы,
От одного до шести пять пять,
Невалидных удалю в единицы,
Админ без звёздочек станет блистать! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок полностью соответствует основным изменениям в PR: добавлена валидация портов серверов и реализована автоочистка невалидных записей.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sourcery-ai
Copy link
Copy Markdown
Contributor

sourcery-ai Bot commented Dec 21, 2025

Руководство для ревьюера

Добавляет строгую валидацию порта (1–65535) при создании/обновлении сервера и вводит стартовую «миграцию», которая удаляет сервера с некорректными значениями порта с помощью raw SQL, обходя ограничения Prisma на тип INT.

Диаграмма последовательности для создания сервера с валидацией порта

sequenceDiagram
    actor User
    participant ServersAPI
    participant Prisma
    participant Database

    User ->> ServersAPI: POST /api/servers (name, host, port)
    ServersAPI ->> ServersAPI: parseInt(port) or default 25565
    alt invalid port (NaN or <1 or >65535)
        ServersAPI -->> User: 400 Порт должен быть числом от 1 до 65535 (максимум 5 цифр)
    else valid port
        ServersAPI ->> Prisma: server.create(name, host, portNumber, version)
        Prisma ->> Database: INSERT INTO Server
        Database -->> Prisma: insert result
        Prisma -->> ServersAPI: newServer
        ServersAPI -->> User: 201 newServer
    end
Loading

Диаграмма последовательности для обновления сервера с валидацией порта

sequenceDiagram
    actor User
    participant ServersAPI
    participant Prisma
    participant Database

    User ->> ServersAPI: PUT /api/servers/:id (optional name, host, port, version)
    ServersAPI ->> ServersAPI: build dataToUpdate
    alt port provided and not empty
        ServersAPI ->> ServersAPI: parseInt(port)
        alt invalid port (NaN or <1 or >65535)
            ServersAPI -->> User: 400 Порт должен быть числом от 1 до 65535 (максимум 5 цифр)
        else valid port
            ServersAPI ->> Prisma: server.update(id, dataToUpdate)
            Prisma ->> Database: UPDATE Server
            Database -->> Prisma: update result
            Prisma -->> ServersAPI: updatedServer
            ServersAPI -->> User: 200 updatedServer
        end
    else port not provided or empty
        ServersAPI ->> Prisma: server.update(id, dataToUpdate without port)
        Prisma ->> Database: UPDATE Server
        Database -->> Prisma: update result
        Prisma -->> ServersAPI: updatedServer
        ServersAPI -->> User: 200 updatedServer
    end
Loading

Изменения по файлам

Изменение Подробности Файлы
Валидация порта сервера при создании и обновлении, с понятными пользовательскими ошибками и единым поведением по умолчанию.
  • При создании сервера один раз парсить входящий порт, использовать значение по умолчанию 25565, если порт не передан, и отклонять нечисловые или выходящие за диапазон (1–65535) значения с ответом 400 и сообщением об ошибке на русском языке.
  • При обновлении сервера аналогично валидировать переданный порт (непустая строка, числовое значение, 1–65535) до того, как добавить его в payload обновления.
  • Переиспользовать разобранное числовое значение порта и для валидации, и для записи в базу данных, чтобы избежать несоответствий.
backend/src/api/routes/servers.js
Автоматическая очистка строк с некорректными портами при запуске приложения с помощью raw SQL.
  • Добавить шаг стартовой миграции, который выполняет raw SQL DELETE по таблице Server, удаляя строки, в которых длина порта превышает 5 цифр или числовое значение выходит за пределы 1–65535.
  • Использовать $executeRawUnsafe, чтобы обойти ограничения Prisma на парсинг INT для некорректных данных порта.
  • Логировать количество удалённых строк с некорректными серверами, если очистка затронула какие-либо записи.
  • Незначительное изменение форматирования в блоке миграции прав роли администратора (нормализация пробелов).
backend/src/server.js

Подсказки и команды

Взаимодействие с Sourcery

  • Запустить новое ревью: Оставьте комментарий @sourcery-ai review в pull request.
  • Продолжить обсуждение: Отвечайте напрямую на комментарии ревью от Sourcery.
  • Создать GitHub‑issue из комментария ревью: Попросите Sourcery создать
    issue из комментария ревью, ответив на него. Можно также ответить на
    комментарий ревью командой @sourcery-ai issue, чтобы создать issue на его основе.
  • Сгенерировать заголовок pull request: Напишите @sourcery-ai где угодно
    в заголовке pull request, чтобы в любой момент сгенерировать заголовок. Можно
    также оставить комментарий @sourcery-ai title в pull request, чтобы
    (пере)сгенерировать заголовок в любой момент.
  • Сгенерировать краткое описание pull request: Напишите @sourcery-ai summary
    где угодно в теле pull request, чтобы в любой момент сгенерировать краткое
    описание PR прямо в нужном месте. Можно также оставить комментарий
    @sourcery-ai summary в pull request, чтобы (пере)сгенерировать краткое
    описание в любой момент.
  • Сгенерировать руководство для ревьюера: Оставьте комментарий
    @sourcery-ai guide в pull request, чтобы в любой момент (пере)сгенерировать
    руководство для ревьюера.
  • Пометить все комментарии Sourcery как решённые: Оставьте комментарий
    @sourcery-ai resolve в pull request, чтобы пометить все комментарии Sourcery
    как решённые. Полезно, если вы уже обработали все комментарии и больше не
    хотите их видеть.
  • Скрыть все ревью от Sourcery: Оставьте комментарий @sourcery-ai dismiss
    в pull request, чтобы скрыть все существующие ревью Sourcery. Особенно полезно,
    если вы хотите начать с чистого листа с новым ревью — не забудьте затем
    оставить комментарий @sourcery-ai review, чтобы запустить новое ревью!

Настройка работы

Откройте свою панель управления, чтобы:

  • Включать или отключать функции ревью, такие как автоматически сгенерированное
    Sourcery краткое описание pull request, руководство для ревьюера и другие.
  • Изменить язык ревью.
  • Добавлять, удалять или изменять пользовательские инструкции для ревью.
  • Настраивать другие параметры ревью.

Получение помощи

Original review guide in English

Reviewer's Guide

Adds strict port validation (1–65535) for server creation/update and introduces a startup migration that deletes servers with invalid port values via raw SQL, avoiding Prisma INT limitations.

Sequence diagram for server creation with port validation

sequenceDiagram
    actor User
    participant ServersAPI
    participant Prisma
    participant Database

    User ->> ServersAPI: POST /api/servers (name, host, port)
    ServersAPI ->> ServersAPI: parseInt(port) or default 25565
    alt invalid port (NaN or <1 or >65535)
        ServersAPI -->> User: 400 Порт должен быть числом от 1 до 65535 (максимум 5 цифр)
    else valid port
        ServersAPI ->> Prisma: server.create(name, host, portNumber, version)
        Prisma ->> Database: INSERT INTO Server
        Database -->> Prisma: insert result
        Prisma -->> ServersAPI: newServer
        ServersAPI -->> User: 201 newServer
    end
Loading

Sequence diagram for server update with port validation

sequenceDiagram
    actor User
    participant ServersAPI
    participant Prisma
    participant Database

    User ->> ServersAPI: PUT /api/servers/:id (optional name, host, port, version)
    ServersAPI ->> ServersAPI: build dataToUpdate
    alt port provided and not empty
        ServersAPI ->> ServersAPI: parseInt(port)
        alt invalid port (NaN or <1 or >65535)
            ServersAPI -->> User: 400 Порт должен быть числом от 1 до 65535 (максимум 5 цифр)
        else valid port
            ServersAPI ->> Prisma: server.update(id, dataToUpdate)
            Prisma ->> Database: UPDATE Server
            Database -->> Prisma: update result
            Prisma -->> ServersAPI: updatedServer
            ServersAPI -->> User: 200 updatedServer
        end
    else port not provided or empty
        ServersAPI ->> Prisma: server.update(id, dataToUpdate without port)
        Prisma ->> Database: UPDATE Server
        Database -->> Prisma: update result
        Prisma -->> ServersAPI: updatedServer
        ServersAPI -->> User: 200 updatedServer
    end
Loading

File-Level Changes

Change Details Files
Validate server port on create and update, with clear user-facing errors and consistent defaulting.
  • On server creation, parse the incoming port once, default to 25565 when omitted, and reject non‑numeric or out‑of‑range values (1–65535) with a 400 response and Russian error message.
  • On server update, validate the provided port similarly (non‑empty string, numeric, 1–65535) before assigning it to the update payload.
  • Reuse the parsed numeric port value both for validation and for writing to the database to avoid inconsistencies.
backend/src/api/routes/servers.js
Automatically clean up rows with invalid ports on application startup using raw SQL.
  • Add a startup migration step that executes a raw SQL DELETE against the Server table, removing rows where the port length exceeds 5 digits or the numeric value is outside 1–65535.
  • Use $executeRawUnsafe to bypass Prisma’s INT parsing limitations on invalid port data.
  • Log how many invalid server rows were deleted when the cleanup affects any records.
  • Minor formatting change in the admin role permissions migration block (whitespace normalization).
backend/src/server.js

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Copy Markdown
Contributor

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - я нашёл одну проблему и оставил несколько общих замечаний:

  • Логика валидации порта (проверка диапазона и текст ошибки) дублируется между хендлерами создания и обновления; имеет смысл вынести её в небольшую вспомогательную функцию, чтобы правила были единообразными и проще поддерживались.
  • Стартовый запрос на очистку сейчас использует $executeRawUnsafe с интерполированной строкой; даже несмотря на отсутствие пользовательского ввода, переход на $executeRaw с параметризованным фрагментом (или хотя бы документация, почему Unsafe здесь безопасен) уменьшит риск неправильного использования в будущем.
  • Сообщение об ошибке упоминает ограничение «максимум 5 цифр», тогда как логика фактически проверяет числовой диапазон (1–65535); стоит привести текст сообщения в соответствие с реальной проверкой (например, упомянуть только числовой диапазон), чтобы избежать путаницы.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The port validation logic (range checks and error message) is duplicated between the create and update handlers; consider extracting a small helper function to keep the rules consistent and easier to maintain.
- The startup cleanup query currently uses `$executeRawUnsafe` with an interpolated string; even though there is no user input, switching to `$executeRaw` with a parameterized snippet (or at least documenting why `Unsafe` is safe here) would reduce the risk of future misuse.
- The error message mentions a "maximum 5 digits" constraint while the logic enforces a numeric range (1–65535); consider aligning the message with the actual validation (e.g., focusing only on the numeric range) to avoid confusion.

## Individual Comments

### Comment 1
<location> `backend/src/server.js:107-108` </location>
<code_context>
     try {
+        // Удаляем серверы с невалидными портами напрямую через SQL,
+        // потому что Prisma не может их прочитать если значение не помещается в INT
+        const result = await prisma.$executeRawUnsafe(
+            `DELETE FROM Server WHERE length(CAST(port AS TEXT)) > 5 OR port > 65535 OR port < 1`
+        );
+
</code_context>

<issue_to_address>
**🚨 issue (security):** Raw SQL is both unsafe and potentially non-portable; consider quoting identifiers and using $executeRaw.

Because the query is static and doesn’t use user input, `$executeRaw` is safer than `$executeRawUnsafe` with no downside here. Also, `DELETE FROM Server WHERE length(CAST(port AS TEXT))...` is dialect-specific and may not behave consistently across providers (e.g. quoted vs unquoted `Server` in Postgres, `length`/`TEXT` vs `LENGTH`/`CHAR` in MySQL). Please quote the table name appropriately for your DB (e.g. `"Server"` in Postgres) and align the functions/casts with the actual provider, or document that this migration is provider-specific.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Помогите мне стать полезнее! Пожалуйста, нажимайте 👍 или 👎 под каждым комментарием — я буду использовать этот фидбек, чтобы улучшать следующие обзоры.
Original comment in English

Hey - I've found 1 issue, and left some high level feedback:

  • The port validation logic (range checks and error message) is duplicated between the create and update handlers; consider extracting a small helper function to keep the rules consistent and easier to maintain.
  • The startup cleanup query currently uses $executeRawUnsafe with an interpolated string; even though there is no user input, switching to $executeRaw with a parameterized snippet (or at least documenting why Unsafe is safe here) would reduce the risk of future misuse.
  • The error message mentions a "maximum 5 digits" constraint while the logic enforces a numeric range (1–65535); consider aligning the message with the actual validation (e.g., focusing only on the numeric range) to avoid confusion.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The port validation logic (range checks and error message) is duplicated between the create and update handlers; consider extracting a small helper function to keep the rules consistent and easier to maintain.
- The startup cleanup query currently uses `$executeRawUnsafe` with an interpolated string; even though there is no user input, switching to `$executeRaw` with a parameterized snippet (or at least documenting why `Unsafe` is safe here) would reduce the risk of future misuse.
- The error message mentions a "maximum 5 digits" constraint while the logic enforces a numeric range (1–65535); consider aligning the message with the actual validation (e.g., focusing only on the numeric range) to avoid confusion.

## Individual Comments

### Comment 1
<location> `backend/src/server.js:107-108` </location>
<code_context>
     try {
+        // Удаляем серверы с невалидными портами напрямую через SQL,
+        // потому что Prisma не может их прочитать если значение не помещается в INT
+        const result = await prisma.$executeRawUnsafe(
+            `DELETE FROM Server WHERE length(CAST(port AS TEXT)) > 5 OR port > 65535 OR port < 1`
+        );
+
</code_context>

<issue_to_address>
**🚨 issue (security):** Raw SQL is both unsafe and potentially non-portable; consider quoting identifiers and using $executeRaw.

Because the query is static and doesn’t use user input, `$executeRaw` is safer than `$executeRawUnsafe` with no downside here. Also, `DELETE FROM Server WHERE length(CAST(port AS TEXT))...` is dialect-specific and may not behave consistently across providers (e.g. quoted vs unquoted `Server` in Postgres, `length`/`TEXT` vs `LENGTH`/`CHAR` in MySQL). Please quote the table name appropriately for your DB (e.g. `"Server"` in Postgres) and align the functions/casts with the actual provider, or document that this migration is provider-specific.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread backend/src/server.js
Comment on lines +107 to +108
const result = await prisma.$executeRawUnsafe(
`DELETE FROM Server WHERE length(CAST(port AS TEXT)) > 5 OR port > 65535 OR port < 1`
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 issue (security): Raw SQL is both unsafe and potentially non-portable; consider quoting identifiers and using $executeRaw.

Because the query is static and doesn’t use user input, $executeRaw is safer than $executeRawUnsafe with no downside here. Also, DELETE FROM Server WHERE length(CAST(port AS TEXT))... is dialect-specific and may not behave consistently across providers (e.g. quoted vs unquoted Server in Postgres, length/TEXT vs LENGTH/CHAR in MySQL). Please quote the table name appropriately for your DB (e.g. "Server" in Postgres) and align the functions/casts with the actual provider, or document that this migration is provider-specific.

Original comment in English

🚨 issue (security): Raw SQL is both unsafe and potentially non-portable; consider quoting identifiers and using $executeRaw.

Because the query is static and doesn’t use user input, $executeRaw is safer than $executeRawUnsafe with no downside here. Also, DELETE FROM Server WHERE length(CAST(port AS TEXT))... is dialect-specific and may not behave consistently across providers (e.g. quoted vs unquoted Server in Postgres, length/TEXT vs LENGTH/CHAR in MySQL). Please quote the table name appropriately for your DB (e.g. "Server" in Postgres) and align the functions/casts with the actual provider, or document that this migration is provider-specific.

@codecov
Copy link
Copy Markdown

codecov Bot commented Dec 21, 2025

Codecov Report

❌ Patch coverage is 0% with 8 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
backend/src/api/routes/servers.js 0.00% 4 Missing and 4 partials ⚠️

📢 Thoughts on this report? Let us know!

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2a2d56c and c59a6c1.

📒 Files selected for processing (2)
  • backend/src/api/routes/servers.js (2 hunks)
  • backend/src/server.js (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/server.js (1)
backend/src/api/routes/auth.js (3)
  • permissions (156-156)
  • permissions (335-335)
  • ALL_PERMISSIONS (20-66)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Sourcery review
🔇 Additional comments (4)
backend/src/api/routes/servers.js (3)

42-46: Валидация порта выглядит корректно.

Логика валидации правильно обрабатывает граничные случаи:

  • Используется стандартный порт Minecraft (25565) по умолчанию
  • parseInt с проверкой isNaN отсекает нечисловые значения
  • Диапазон 1-65535 соответствует валидным TCP/UDP портам

49-49: Правильное использование нормализованного значения порта.

Использование portNumber вместо исходного port гарантирует, что в базу сохраняется валидированное числовое значение.


67-73: Валидация в PUT-маршруте согласована с POST.

Проверка port !== undefined && port !== '' корректно обрабатывает случаи, когда порт не передан или передана пустая строка. Логика валидации идентична POST-маршруту.

backend/src/server.js (1)

107-109: Проверка длины порта действительно избыточна.

Условие length(CAST(port AS TEXT)) > 5 логически лишнее, так как проверка port > 65535 OR port < 1 уже покрывает все невалидные порты: положительные значения больше 65535 и все отрицательные значения. Любой порт с количеством символов больше 5 при приведении к тексту уже будет отклонен одним из этих двух условий. Рекомендуется упростить запрос до:

DELETE FROM Server WHERE port > 65535 OR port < 1

Comment thread backend/src/server.js
Comment on lines +105 to +113
// Удаляем серверы с невалидными портами напрямую через SQL,
// потому что Prisma не может их прочитать если значение не помещается в INT
const result = await prisma.$executeRawUnsafe(
`DELETE FROM Server WHERE length(CAST(port AS TEXT)) > 5 OR port > 65535 OR port < 1`
);

if (result > 0) {
console.log(`[Migration] Удалено ${result} серверов с невалидными портами.`);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find Prisma schema file
echo "=== Finding Prisma schema ==="
find . -name "schema.prisma" -o -name "*.prisma" | head -20

# Check for prisma directory
echo -e "\n=== Checking prisma directory ==="
ls -la prisma/ 2>/dev/null || echo "No prisma directory found"

# Check backend directory structure
echo -e "\n=== Backend directory structure ==="
ls -la backend/prisma/ 2>/dev/null || ls -la backend/ | grep -i prisma || echo "No prisma in backend"

Repository: blockmineJS/blockmine

Length of output: 525


🏁 Script executed:

#!/bin/bash
# Read the Prisma schema
cat -n ./backend/prisma/schema.prisma

Repository: blockmineJS/blockmine

Length of output: 12236


🏁 Script executed:

#!/bin/bash
# Read the server.js file around lines 105-113
sed -n '90,120p' backend/src/server.js

Repository: blockmineJS/blockmine

Length of output: 1327


🏁 Script executed:

#!/bin/bash
# Find servers.js route file
echo "=== Finding servers.js files ==="
find backend -name "*servers*" -type f

# If found, show content around lines 95-98
echo -e "\n=== Content of servers route file ==="
if [ -f "backend/src/routes/servers.js" ]; then
  sed -n '85,115p' backend/src/routes/servers.js
else
  echo "Not found at expected location, searching..."
  find backend -name "*servers.js" -exec echo "File: {}" \; -exec sed -n '85,115p' {} \;
fi

Repository: blockmineJS/blockmine

Length of output: 1059


SQL-синтаксис совместим с SQLite, но есть проблема с ссылочной целостностью.

Синтаксис length(CAST(port AS TEXT)) поддерживается SQLite, поэтому предыдущие опасения по поводу совместимости не применяются. Однако при удалении серверов без проверки зависимых ботов произойдет нарушение ссылочной целостности: в маршруте DELETE (servers.js, строки 95-104) выполняется проверка наличия ботов перед удалением, но здесь в миграции при старте эта проверка отсутствует. Это приведет к созданию осиротевших записей в таблице Bot.

Кроме того, используется $executeRawUnsafe, что снижает типобезопасность. Рекомендуется заменить на $executeRaw с tagged template или добавить проверку наличия зависимых ботов перед удалением, аналогично API-маршруту.

🤖 Prompt for AI Agents
In backend/src/server.js around lines 105 to 113, the migration deletes Server
rows with invalid ports using prisma.$executeRawUnsafe which risks referential
integrity by orphaning Bot records and reduces safety; update this startup
migration to first identify servers with invalid ports, check for dependent Bot
records (similar to the DELETE route in servers.js lines 95-104), and only
delete servers that have no bots, or delete bots first in a controlled way, and
replace $executeRawUnsafe with Prisma's tagged $executeRaw (or use parameterized
queries) to avoid unsafe raw SQL execution.

@mmeerrkkaa mmeerrkkaa merged commit 7cd704f into blockmineJS:master Dec 21, 2025
3 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants