Ebenza — это платформа для управления домашними EV-зарядками. Сегодня я добавил гостевой доступ, демо-режим и закрыл несколько дыр в безопасности. Расскажу что получилось.
Гостевой режим
Раньше в системе был один тип пользователя — владелец зарядки. Теперь появился второй — гость. Владелец приглашает гостя по email, и тот получает доступ к конкретной станции с ограничениями.
Какие ограничения можно задать:
| Параметр | Что делает |
|---|---|
| Период доступа | Гость может заряжаться только в указанные даты |
| Лимит энергии | Максимум кВт-ч за всё время |
| Сессий в день | Сколько раз в сутки можно начать зарядку |
| Расписание | По каким дням и часам разрешён доступ |
Гость видит адаптированный интерфейс. Вместо списка станций — страница «Мой доступ» с карточками станций, к которым его пригласили. Меню упрощено: нет пунктов «Гости», «Отчёты», «Регистрация станции» — они ему не нужны.
Демо-режим для презентаций
Для демонстрации проекта нужна живая зарядка. Настоящую станцию на презентацию не притащишь, поэтому я сделал симуляцию.
Одна команда в терминале — и в системе появляются два аккаунта (владелец и гость), три станции с коннекторами, история сессий и всё остальное. Вторая команда запускает OCPP-симулятор — он притворяется реальной зарядной станцией и шлёт данные в систему по WebSocket.
Если симулятор не подключён, зарядка всё равно работает. Система переходит в офлайн-режим: сессия активируется локально, а фоновая задача каждые 15 секунд обновляет показания — мощность, энергию, уровень заряда батареи. Кривая мощности реалистичная: разгон, плато, снижение к концу.
На экране всё выглядит как настоящая зарядка. Графики двигаются, цифры меняются, индикатор пульсирует.
Безопасность гостевого доступа
После того как гостевой режим заработал, я прогнал полный анализ кода и нашёл четыре бага.
Лимиты обходились через веб-интерфейс. Гость мог начать зарядку через браузер, даже если его доступ истёк или лимит энергии исчерпан. Проверка работала только на уровне протокола зарядной станции, а веб пропускал. Исправил — теперь оба пути проверяют одни и те же правила.
Десктопное меню показывало лишнее. На мобильном гость не видит пункты владельца, а на десктопе — видел всё. Добавил фильтрацию.
Прямой URL обходил ограничения. Гость мог вбить адрес страницы гостей или отчётов в адресную строку и попасть туда. Добавил автоматический редирект на главную.
Владелец не мог создать бронирование. Система бронирования ожидала данные гостевого доступа, но у владельца их нет — он же владелец. При попытке забронировать свою станцию всё падало. Сделал это поле необязательным.
На все четыре фикса написал 19 автоматических тестов. Все проходят.
Итого за день
| Что сделано | Детали |
|---|---|
| Гостевой режим | Адаптивный интерфейс, страница «Мой доступ», фильтрация меню |
| Демо-данные | Два аккаунта, три станции, история сессий — одной командой |
| Офлайн-зарядка | Симуляция с реалистичной кривой мощности для демо |
| Безопасность | 4 бага найдены и исправлены, 19 тестов написаны |
Платформа готова к демонстрации. Осталось подключить оплату через ЮKassa и push-уведомления — но это уже другая история.