14322890e8
test / test (push) Has been cancelled
Document the preferred implementation order in the roadmap and linked plans. Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
3.8 KiB
Markdown
67 lines
3.8 KiB
Markdown
# План: domain-admin (роль администратора домена)
|
||
|
||
**Статус:** согласовано
|
||
**Версия:** целевой bump **1.x** MINOR при совместимой миграции текущего админа
|
||
в глобального.
|
||
**Порядок:** рекомендуется после [web-split](web-split.md), до
|
||
[inbound-relay](inbound-relay.md).
|
||
|
||
---
|
||
|
||
## Что это
|
||
|
||
Сейчас в панели ровно один субъект: `requireAuth` — булев гейт, а не роль
|
||
([web.go](../../internal/web/web.go) — обёртка
|
||
`mux.Handle("/", s.requireAuth(authed))`), сессия не несёт ничего, кроме факта
|
||
входа.
|
||
|
||
Роль выдаёт доступ к **одному домену** и только к нему:
|
||
|
||
- приложения этого домена (создание, режим отправителя, перегенерация пароля,
|
||
удаление, свой L2-лимит);
|
||
- DKIM/DNS-статус домена;
|
||
- журнал отправки, отфильтрованный по домену — фильтр в журнале уже есть
|
||
([sendLogData](../../internal/web/handlers_monitor.go)).
|
||
|
||
Вне роли остаётся то, что глобально по своей природе:
|
||
|
||
- добавление и удаление доменов;
|
||
- `/reload`;
|
||
- полный бэкап (это весь `/data` вместе с `sasldb2`, то есть все домены
|
||
сразу);
|
||
- очередь и хвост `mail.log` — они серверные и к домену не привязаны.
|
||
|
||
## Почему расширение v1.0
|
||
|
||
[product.md](../product.md) относит «несколько пользователей панели, роли» к
|
||
out of scope (один администратор). Появление второго субъекта — сознательное
|
||
расширение границ проекта, как и inbound-relay.
|
||
|
||
Цена — уровня фазы, а не патча:
|
||
|
||
- таблица пользователей и их привязка к доменам;
|
||
- роль в сессии;
|
||
- авторизация в каждом хендлере (а не только на маршруте — сейчас `{id}`/`{aid}`
|
||
не сверяются ни с чем, кроме существования);
|
||
- пересмотр первичного setup'а и смены пароля под нескольких пользователей;
|
||
- учёт нового субъекта в бэкапе и экспорте домена.
|
||
|
||
*(Прежняя формулировка этого пункта — «2FA и несколько администраторов» —
|
||
заменена: 2FA снята с рассмотрения, а «несколько администраторов» уточнено до
|
||
одной конкретной роли, потому что нужна не вторая копия всевластного админа, а
|
||
ограниченный доступ владельца отдельного домена.)*
|
||
|
||
## Готово, когда
|
||
|
||
- Глобальный администратор и domain-admin с разными правами работают через
|
||
панель; domain-admin не может выйти за пределы своего домена;
|
||
- текущий единственный админ мигрирует в глобального без потери доступа;
|
||
- бэкап/восстановление учитывает пользователей и привязки;
|
||
- `build`/`vet`/`test`/образ зелёные.
|
||
|
||
## Риски
|
||
|
||
- Неполная проверка `{id}`/`{aid}` в хендлерах — утечка доступа к чужому
|
||
домену;
|
||
- breaking setup/бэкап — тогда semver major, не 1.x.
|