From 4d0f57323bd42de29d4980c6325be313998192d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80?= Date: Thu, 20 Aug 2026 04:18:32 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=BF=D0=BE=D0=B4=D1=80=D0=BE=D0=B1?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20README=20(=D1=80=D0=B0=D0=B7=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81=D0=B5?= =?UTF-8?q?=20=D0=B2=20Gitea)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Старый README сохранён как README.upstream.md. --- README.md | 82 ++++++++++++++++++++++++++++++++++++++++++---- README.upstream.md | 13 ++++++++ 2 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 README.upstream.md diff --git a/README.md b/README.md index 6a84876..0dfa375 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,83 @@ -git clone https://github.com/viktor138irk/reg +# reg — панель регистрации DMR ID +Небольшой PHP-скрипт для радиолюбительского DMR-сервера (XLX/HBLink, узел DMRYKT). Решает одну задачу: выдача и учёт локальных DMR ID. Радиолюбитель заполняет заявку с позывным и контактом в Telegram, скрипт присваивает свободный ID из диапазона 1410000–1419999 и кладёт заявку в очередь. Администратор через веб-админку подтверждает, редактирует, блокирует или удаляет записи, после чего подтверждённые записи выгружаются в файл `dmrid.dat` формата `ID;CALLSIGN;`, который читают XLX и Pi-Star. + +Базы данных нет: всё хранится в JSON-файле и в текстовом `.dat`. + +## Стек + +- PHP (процедурный, без фреймворка и без Composer). Версия не определена из кода, но используются стрелочные функции — требуется PHP 7.4+. +- Хранилище: `db.json` (структура `{"count": N, "results": [...]}`) и `dmrid.dat` (`ID;CALLSIGN;` построчно). +- Frontend: HTML, CSS, ванильный JavaScript (клиентская валидация и AJAX-проверка уникальности). +- Веб-сервер с PHP — по README ожидается размещение в `/var/www/xlxd/reg` рядом с XLX-сервером. +- Внешних API нет. + +## Структура + +| Путь | Назначение | +| --- | --- | +| `index.php` | Стартовая страница со ссылками на админку, XLX-сервер и файлы баз | +| `register.php` | Публичная форма заявки на DMR ID: валидация позывного и Telegram, генерация свободного ID, запись в `db.json` с `confirmed: false` | +| `admin.php` | Админка: HTML, таблица подтверждённых записей, поиск, сортировка, пагинация, форма добавления вручную | +| `adminLogic.php` | Вся логика админки, подключается первой строкой `admin.php`. Обрабатывает `sync`, `confirm`, `block`, `delete`, `edit`, `ajax_check`, добавление через POST, а также поиск, сортировку и пагинацию | +| `check_unique.php` | Отдельный JSON-эндпоинт проверки уникальности ID и позывного по `db.json` и `dmrid.dat` | +| `db.json` | Основная база заявок и записей | +| `dmrid.dat` | Выгрузка подтверждённых записей для XLX/Pi-Star | +| `assets/css/style.css` | Стили админки | +| `assets/js/main.js` | Клиентская валидация формы добавления и AJAX-проверка уникальности | +| `savedata/` | Резервная копия предыдущей версии: `admin.php`, `logic.php`, `db.json` (232 записи), `dmrid.dat` | +| `README` | Исходное описание структуры проекта от автора | +| `README.upstream.md` | Исходная инструкция по установке от автора | + +## Как запустить + +Отдельного запуска нет — это набор PHP-файлов, который кладётся в корень веб-сервера. По инструкции автора (`README.upstream.md`): + +```bash +git clone <репозиторий> /var/www/xlxd/reg chmod 666 /var/www/xlxd/reg/db.json - chmod 666 /var/www/xlxd/reg/dmrid.dat - ln -s /var/www/xlxd/reg/dmrid.dat /xlxd/dmrid.dat +``` -Панель админа по адресу https://вашсайт/reg +Адреса после установки: -Панель регистрации по адресу https://вашсайт/reg/register.php +- админка — `https://ваш-сайт/reg/` +- форма регистрации — `https://ваш-сайт/reg/register.php` -Отблагодарить можно сюда: USDT(TRC20): TLzarMXzcaeG9QsBRywnbYCikjqKHe6B2X +Права `666` на файлы данных обязательны: процесс PHP пишет в них напрямую через `file_put_contents`. + +## Конфигурация + +Файлов конфигурации и переменных окружения нет. Всё, что можно поменять, захардкожено в исходниках: + +| Что | Где | Значение | +| --- | --- | --- | +| Пути к файлам данных | `adminLogic.php`, `register.php`, `check_unique.php` | `__DIR__ . '/db.json'`, `__DIR__ . '/dmrid.dat'` | +| Диапазон выдаваемых ID | `register.php` | `rand(1410000, 1419999)` | +| Формат позывного | `register.php`, `adminLogic.php` | `/^[A-Z0-9]{4,7}$/` | +| Формат Telegram | `register.php` | `/^[a-zA-Z0-9_]{5,32}$/` | +| Допустимый ID при ручном добавлении | `adminLogic.php` | 6–7 цифр, от 100000 до 9999999 | +| Записей на страницу | `adminLogic.php` | `$perPage = 15` | +| Ссылки на внешние ресурсы | `index.php`, `admin.php` | `https://xlx.dmrykt.ru/`, `https://dmrykt.ru/` | +| Путь к стилям | `admin.php` | `/reg/assets/css/style.css` — приложение обязано лежать в подкаталоге `/reg` | + +## Состояние + +Рабочий, но простой скрипт; развитие остановлено. 8 коммитов, последний — 12.07.2025, из них четыре последних правили только README. Реального кода — один заход «Add files via upload» 11.07.2025. + +Функциональность закрыта: заявка, подтверждение, редактирование, блокировка, удаление, синхронизация в `.dat`, поиск, сортировка, пагинация. `db.json` и `dmrid.dat` в репозитории пустые — боевые данные вычищены, но в `savedata/` лежит старый снимок на 232 записи. + +## Что не доделано + +- **Админка полностью открыта.** В `admin.php` и `adminLogic.php` нет ни аутентификации, ни проверки сессии, ни CSRF-токенов. Любой, кто знает адрес, может добавлять, редактировать, блокировать и удалять записи обычными GET-запросами вида `admin.php?delete=1410001`. Прикрывать доступ нужно на уровне веб-сервера (basic auth или ограничение по IP). +- Нет блокировок при записи. `file_get_contents` + `file_put_contents` без `flock`: две одновременные заявки могут затереть друг друга. +- Обработчик `edit` в `adminLogic.php` дублирует работу: сначала точечно правит строку в `dmrid.dat`, а следом полностью перезаписывает файл из всех записей `db.json` — включая неподтверждённые. Это расходится с логикой `sync`, которая пишет только подтверждённые. +- В `check_unique.php` разбор `db.json` идёт по верхнему уровню (`foreach ($json as $entry)`), а не по `$json['results']` — проверка по JSON-базе фактически не работает. Этот файл к тому же дублирует `ajax_check` из `adminLogic.php` и, судя по коду фронтенда, не вызывается. +- Сравнение `$item['id'] === $confirmId` строгое, а ID в `db.json` может оказаться строкой — тогда подтверждение и блокировка молча ничего не сделают. +- В `admin.php` в шапке таблицы (``) используется `$row['id']` вне цикла — обращение к неопределённой переменной. +- Сообщения об ошибках выводятся без `htmlspecialchars` в `register.php`, хотя тексты и константные. +- Заявки принимаются без капчи и без ограничения частоты — форма открыта для спама. +- В `README.upstream.md` указан адрес кошелька USDT (TRC20) для донатов — при публикации репозитория стоит решить, нужен ли он там. +- В `savedata/db.json` лежат персональные данные пользователей: позывные, имена, фамилии, города и Telegram-контакты 232 человек. Перед тем как делать репозиторий публичным, этот файл лучше убрать. +- Тестов нет, CI нет, логирования действий администратора нет. diff --git a/README.upstream.md b/README.upstream.md new file mode 100644 index 0000000..6a84876 --- /dev/null +++ b/README.upstream.md @@ -0,0 +1,13 @@ +git clone https://github.com/viktor138irk/reg + +chmod 666 /var/www/xlxd/reg/db.json + +chmod 666 /var/www/xlxd/reg/dmrid.dat + +ln -s /var/www/xlxd/reg/dmrid.dat /xlxd/dmrid.dat + +Панель админа по адресу https://вашсайт/reg + +Панель регистрации по адресу https://вашсайт/reg/register.php + +Отблагодарить можно сюда: USDT(TRC20): TLzarMXzcaeG9QsBRywnbYCikjqKHe6B2X