205 lines
7.8 KiB
Markdown
205 lines
7.8 KiB
Markdown
# План работ: 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`
|
||
```sql
|
||
mysql -u root -p poi < poi.sql
|
||
```
|
||
|
||
### 1.2 Расширить таблицу `users`
|
||
```sql
|
||
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` — добавить методы
|
||
|
||
```php
|
||
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`:
|
||
```php
|
||
'googleMapsKey' => 'НОВЫЙ_КЛЮЧ',
|
||
```
|
||
В коде:
|
||
```php
|
||
$key = App::getConfig('googleMapsKey');
|
||
```
|
||
|
||
---
|
||
|
||
## 5. Конфигурация
|
||
|
||
### 5.1 `config.php` — изменения
|
||
|
||
```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 |
|
||
|
||
После всех правок проверить:
|
||
```bash
|
||
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 — в следующей итерации
|