Ebenza — это платформа для управления домашними EV-зарядками. Сегодня я добавил гостевой доступ, демо-режим и закрыл несколько дыр в безопасности. Расскажу что получилось.

Гостевой режим

Раньше в системе был один тип пользователя — владелец зарядки. Теперь появился второй — гость. Владелец приглашает гостя по email, и тот получает доступ к конкретной станции с ограничениями.

Какие ограничения можно задать:

Параметр Что делает
Период доступа Гость может заряжаться только в указанные даты
Лимит энергии Максимум кВт-ч за всё время
Сессий в день Сколько раз в сутки можно начать зарядку
Расписание По каким дням и часам разрешён доступ

Гость видит адаптированный интерфейс. Вместо списка станций — страница «Мой доступ» с карточками станций, к которым его пригласили. Меню упрощено: нет пунктов «Гости», «Отчёты», «Регистрация станции» — они ему не нужны.

Демо-режим для презентаций

Для демонстрации проекта нужна живая зарядка. Настоящую станцию на презентацию не притащишь, поэтому я сделал симуляцию.

Одна команда в терминале — и в системе появляются два аккаунта (владелец и гость), три станции с коннекторами, история сессий и всё остальное. Вторая команда запускает OCPP-симулятор — он притворяется реальной зарядной станцией и шлёт данные в систему по WebSocket.

Если симулятор не подключён, зарядка всё равно работает. Система переходит в офлайн-режим: сессия активируется локально, а фоновая задача каждые 15 секунд обновляет показания — мощность, энергию, уровень заряда батареи. Кривая мощности реалистичная: разгон, плато, снижение к концу.

На экране всё выглядит как настоящая зарядка. Графики двигаются, цифры меняются, индикатор пульсирует.

Безопасность гостевого доступа

После того как гостевой режим заработал, я прогнал полный анализ кода и нашёл четыре бага.

Лимиты обходились через веб-интерфейс. Гость мог начать зарядку через браузер, даже если его доступ истёк или лимит энергии исчерпан. Проверка работала только на уровне протокола зарядной станции, а веб пропускал. Исправил — теперь оба пути проверяют одни и те же правила.

Десктопное меню показывало лишнее. На мобильном гость не видит пункты владельца, а на десктопе — видел всё. Добавил фильтрацию.

Прямой URL обходил ограничения. Гость мог вбить адрес страницы гостей или отчётов в адресную строку и попасть туда. Добавил автоматический редирект на главную.

Владелец не мог создать бронирование. Система бронирования ожидала данные гостевого доступа, но у владельца их нет — он же владелец. При попытке забронировать свою станцию всё падало. Сделал это поле необязательным.

На все четыре фикса написал 19 автоматических тестов. Все проходят.

Итого за день

Что сделано Детали
Гостевой режим Адаптивный интерфейс, страница «Мой доступ», фильтрация меню
Демо-данные Два аккаунта, три станции, история сессий — одной командой
Офлайн-зарядка Симуляция с реалистичной кривой мощности для демо
Безопасность 4 бага найдены и исправлены, 19 тестов написаны

Платформа готова к демонстрации. Осталось подключить оплату через ЮKassa и push-уведомления — но это уже другая история.