feat(admin): transfer user accounts and show local cover coverage
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m17s
ci / ts / ts (packages + web) (push) Successful in 3m13s
ci / api / api (push) Successful in 59s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m31s
ci / db / db (push) Successful in 2m50s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m17s
ci / ts / ts (packages + web) (push) Successful in 3m13s
ci / api / api (push) Successful in 59s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m31s
ci / db / db (push) Successful in 2m50s
This commit is contained in:
1 parent
0a4cd4bff1
commit
f1528de948
22 files changed
+1661
-313
No files matched your search
@@ -56,6 +56,22 @@
|
||||
Аналогично для `must_change_password` (после сброса пароля админом / модератором): разрешён только
|
||||
`POST /me/password` (без `current_password`, если вход был по временному паролю).
|
||||
|
||||
## Перенос пользователей через файл
|
||||
|
||||
Администратору на странице «Пользователи» доступны «Экспорт пользователей» и «Импорт пользователей».
|
||||
JSON-файл версии 1 содержит логины, отображаемые имена, роли, дополнительные права аудита загрузок
|
||||
и управления обновлениями, флаги блокировки и обязательной смены пароля, а также хэши Argon2id.
|
||||
Действующие пароли сохраняются; открытые пароли в файле отсутствуют. Файл содержит секретные данные
|
||||
и должен храниться в защищённом месте. Экспорт охватывает всех пользователей независимо от фильтров страницы.
|
||||
|
||||
Импорт добавляет отсутствующие логины с новыми ID. Существующие логины пропускаются без изменений
|
||||
пароля, роли и данных пользователя; список пропущенных логинов показывается в результате.
|
||||
Весь файл проверяется до записи, добавление выполняется атомарно. Ограничения: 10000 пользователей,
|
||||
16 MiB; параметры импортированных хэшей ограничены для безопасной проверки пароля при следующем входе.
|
||||
Рекомендации, история, лайки, плейлисты, сессии и настройки интерфейса не экспортируются и не импортируются.
|
||||
Язык новых записей берётся из настроек сервера. Импорт и экспорт пишутся в журнал без хэшей паролей.
|
||||
API: `GET /admin/users/export`, `POST /admin/users/import` (оба только для admin).
|
||||
|
||||
## Пароли
|
||||
|
||||
- argon2id: `m=64 MiB, t=3, p=2`, соль 16 байт; параметры в хэше (PHC), при изменении — rehash при входе.
|
||||
|
||||
@@ -182,6 +182,13 @@ lower-case, `ё → е`, удаление пунктуации, схлопыва
|
||||
общие файлы кэша; ошибки чтения и конвертации остаются для повтора при следующем запуске обработчика.
|
||||
Клиент получает ссылку на готовый WebP через API каталога; nginx раздаёт файл из кэша.
|
||||
|
||||
В карточке источника показано «Локальные обложки: X из Y файлов» и число альбомов, ожидающих обработки.
|
||||
Статистика обновляется каждые 10 секунд через `GET /admin/sources/{id}/cover-stats`.
|
||||
Считаются аудиофайлы каталога без ошибок чтения, пропавших файлов и исключённых папок, включая
|
||||
альтернативные форматы одного трека. Числитель — файлы, у альбома которых есть готовая обложка
|
||||
из тегов или папки; внешние URL Genius не учитываются. Это покрытие файлов обложками альбомов,
|
||||
а не количество отдельных `cover.jpg` на диске.
|
||||
|
||||
## Поиск
|
||||
|
||||
Meilisearch, индексы:
|
||||
|
||||
Reference in new issue
Block a user