wikipoints/PLAN.md

7.8 KiB
Raw Blame History

План работ: wikipoints.ru

Статус

  • Бэкап БД: есть (poi.sql, 18 таблиц, 868 строк)
  • Google Maps API key: просрочен (AIzaSyDuWmguxO35oV9WGc6D8xUPvQBaUS4kt78)
  • SMS.ru / Alarmer: ключи устарели, но не критично
  • uLogin: выпилить, заменить на вход по email + пароль
  • Подтверждение email: через Resend (добавить колонки email, password, emailConfirmed)

1. База данных

1.1 Импортировать poi.sql

mysql -u root -p poi < poi.sql

1.2 Расширить таблицу users

ALTER TABLE users
  ADD COLUMN `email` varchar(255) DEFAULT NULL AFTER `uid`,
  ADD COLUMN `password` varchar(255) DEFAULT NULL AFTER `email`,
  ADD COLUMN `emailConfirmed` tinyint(1) NOT NULL DEFAULT 0 AFTER `password`,
  ADD COLUMN `confirmToken` varchar(64) DEFAULT NULL AFTER `emailConfirmed`,
  ADD UNIQUE KEY `email` (`email`);

Старым пользователям (через uLogin) проставить emailConfirmed = 1 — они не могут войти по паролю, но не теряют доступ. Новые регистрируются только через email+пароль.


2. Авторизация (выпил uLogin)

2.1 Новый контроллер AuthController или методы в IndexController

actionRegister — регистрация:

  • Поля: email, пароль (2 раза), ник
  • Валидация: email уникальный, пароль ≥ 6 символов
  • Хеш пароля: password_hash($pass, PASSWORD_BCRYPT)
  • Генерация confirmToken = bin2hex(random_bytes(32))
  • Отправка письма через Resend с ссылкой /auth/confirm?token=...
  • После успеха: флеш-сообщение «Проверьте почту»

actionLogin — вход (заменить старый ulogin):

  • Форма: email + пароль
  • Поиск пользователя по email, проверка password_verify()
  • Если emailConfirmed = 0 — «Подтвердите email»
  • Успех: App::userLogin($user), редирект

actionLogout — без изменений (уже работает)

actionConfirm — подтверждение email:

  • Проверить confirmToken, проставить emailConfirmed = 1, очистить токен
  • Автоматический вход, редирект на главную

actionForgot — восстановление пароля:

  • Форма email → поиск пользователя → Resend c токеном сброса
  • Новая колонка resetToken (или переиспользовать confirmToken)

actionResetсброс пароля:

  • Проверить токен, показать форму нового пароля

2.2 Модель User — добавить методы

function getByEmail($email) { ... }
static function hashPassword($pass) { return password_hash($pass, PASSWORD_BCRYPT); }
function verifyPassword($pass) { return password_verify($pass, $this->password); }

2.3 Файлы для удаления/изменения

Файл Действие
views/modals/login.php Переписать целиком: убрать uLogin, вставить форму email+пароль + ссылку на регистрацию
controllers/IndexController.php (actionLogin) Удалить ulogin-код, заменить на email/пароль
views/layouts/*.php (скрипт ulogin) Убрать проверку strpos($script, 'ulogin')
public/js/app.js Проверить и убрать ulogin-вызовы

2.4 Шаблоны

  • views/modals/register.php — новый
  • views/modals/login.php — переписать
  • views/auth/confirm.php — новый
  • views/auth/forgot.php — новый
  • views/auth/reset.php — новый

3. Уведомления через Resend

3.1 Установка (без composer — вручную)

Скачать и положить в classes/:

  • classes/Resend.php — простой класс-обёртка для Resend API (POST https://api.resend.com/emails)
  • API-ключ через config.php: 'resendKey' => 're_...'

3.2 Отправка писем

  • Регистрация: подтверждение email (HTML-шаблон)
  • Восстановление пароля
  • (Опционально) уведомления о новых точках/комментариях

4. Google Maps API ключ

4.1 Файлы для замены

Файл Строка
controllers/JsonController.php:384,506 AIzaSyDuWmguxO35oV9WGc6D8xUPvQBaUS4kt78 → новый ключ

4.2 Вынести в config

Добавить в config.php:

'googleMapsKey' => 'НОВЫЙ_КЛЮЧ',

В коде:

$key = App::getConfig('googleMapsKey');

5. Конфигурация

5.1 config.php — изменения

return array(
    'title' => '...',
    'description' => '...',
    'DB' => array(
        'host' => 'localhost',
        'user' => 'poi',
        'password' => '...',
        'dbname' => 'poi',
    ),
    'images' => [...],
    'version' => trim(file_get_contents(...)),
    'metrika' => false,              // отключить, ключей нет
    'ganalytics' => false,           // отключить
    'disableSMS' => true,            // SMS.ru не работает
    'alarmerKey' => '',              // не используется
    'protocol' => 'http',            // пока http
    'googleMapsKey' => '...',        // новый ключ
    'resendKey' => 're_...',         // ключ Resend
);

6. PHP-совместимость (минимальные правки)

Проблема Правка
__autoload() Пока работает в PHP 7.4/8.x (deprecated, но не fatal). Совместимость не сломана
die;die(); Косметика, не блокирует
PHP4-конструкторы Проверить Model.php и Controller.php — если Class() { parent::Class(); } — заменить на __construct()
mysql_* Уже нет, везде PDO

После всех правок проверить:

php -l app.php
php -l controllers/*.php
php -l models/*.php
php -l classes/*.php

7. Порядок выполнения

 1. config_template.php → скопировать, настроить БД, ключи
 2. Импортировать poi.sql, выполнить ALTER TABLE users
 3. Добавить класс Resend
 4. Расширить модель User (email, password, getByEmail)
 5. Создать AuthController (register, login, logout, confirm, forgot, reset)
 6. Переписать views/modals/login.php (форма email+pass)
 7. Создать views/modals/register.php
 8. Создать шаблоны confirm/forgot/reset
 9. Заменить Google Maps ключ в JsonController
10. Вычистить uLogin из layouts
11. Обновить config.php (resendKey, googleMapsKey, disableSMS, metrika/ganalytics)
12. Проверить php -l
13. Проверить в браузере

Не делаем (осознанно)

  • SQL-инъекции глобально — править только критичные места
  • XSS-защита — не трогаем legacy
  • Миграции — не пишем, всё через sql-файл
  • Тесты — не пишем
  • Composer — не добавляем
  • CSRF — не добавляем
  • Спрятать пароль БД в .env — в следующей итерации