О сервисе
- Название
- TSOY ID
- Адрес
- https://id.tsoy.my
- Версия движка
- 4.94.0
- PHP
- 8.4.17
Название, логотип, цвет и текст подвала настраиваются в разделе «Настройки» — движок не навязывает своего имени.
SSO — открытый OpenID-провайдер на PHP: один аккаунт на сеть сайтов, без Composer и Node. Лицензия MIT: можно использовать, дорабатывать и разворачивать у себя.
Правовые документы этой инсталляции. Редакция и дата изменения — на странице каждого.
4.94.0 · Журналы
Пятый шаг переработки основных экранов — журналы. Сначала замер на боевой: в «Запросах» за сутки 6 300 строк, и действия людей в них терялись.
Исправлено
- Обложки и шрифты писались в журнал запросов как действия. Их отдаёт приложение, а не веб-сервер, и в список «статики, которую не пишем» они не попали. На боевой это ~2 500 строк в сутки — каждая страница тянула обложку и два шрифта. Теперь не пишутся, как и прочая статика.
Изменено — «Запросы»
- Стуки сканеров скрыты, пока их не попросили. Стук — гость по адресу, которого нет (ответ 404 или 405). Так выглядят сканеры уязвимостей: пачками по двести запросов в минуту перебирают пробы WordPress и PHP-CGI. На боевой — 842 за сутки с пяти адресов.
- Над таблицей — сколько скрыто и кто стучал чаще всех. Адрес ведёт на его страницу, где его можно закрыть. Одна ссылка — «Показать всё».
- Поиск по адресу или по отказам стуки показывает: там их и ищут.
- Срок хранения — словом («Хранится 30 дней»); срок 0 значит «не чистить», и страница больше не пишет «Хранится 0 дн.».
Изменено — «Журнал приложения»
- Вкладка и страница называются «Журнал приложения», а не «Ошибки приложения». На боевой в нём за три дня 13 записей, почти все служебные («обложка портала получена»), — название пугало зря. Уровни и поиск по номеру инцидента — как были.
- Время записей — местное и коротко («27.09 07:06:33 … 13:44:28»), а не строка ISO в UTC; точное — в подсказке.
- «Найти» у поиска по номеру инцидента — рядом с полем, а не у правого края страницы.
Проверки
admin_logs— новая, 12 проверок:- обложки и шрифты не пишутся;
- стуки скрыты, сводка над таблицей, поиск их показывает;
- журнал приложения называется журналом, время в нём — местное.
- Мутаций: 350 (+6).
4.93.0 · Роли
Четвёртый шаг переработки основных экранов — список ролей и карточка роли.
Изменено — список ролей
- Название впереди, машинное имя и описание — строкой под ним, как в «Ролях» человека. Раньше первой колонкой шёл моноширинный слаг, и «Админ портала» приходилось искать среди
client_admin. - Сколько людей — ссылкой на список пользователей с этой ролью. Пустая роль — «никого», а не 0.
- Кнопки «Права» больше нет: название и есть ссылка на карточку. «Удалить» — только у ролей, заведённых вручную.
- На телефоне у встроенной роли нет пустого отступа под карточкой.
Изменено — карточка роли
- У роли портала рядом с именем — портал ссылкой, а не машинное
client_N. - Число людей — ссылкой на список с этой ролью.
Изменено — полоса «Сохранить»
- Липнет к низу окна, только когда есть что сохранять. Над нетронутой формой пилюля плыла поверх содержимого — на карточке роли лежала на «Особых правах», хотя сохранять было нечего. Теперь до первой правки полоса стоит в конце формы. Правка поля или кнопки, которая заполняет форму сама (столбец прав целиком, палитра, готовая схема), — и пилюля прилипает.
- Полоса с другими действиями («Подставить предложенное», «Выгрузить JSON») липнет, как раньше, всегда: они нужны и без правок.
Проверки
admin_lists(+9): список ролей, карточка роли, полоса «Сохранить».- Мутаций: 344 (+3).
4.92.0 · Люди
Третий шаг переработки основных экранов — список людей и карточка человека.
Исправлено
- «Отозвать» в «Ролях» снимало роль со всех областей разом. Форма слала только роль, и снятие «Админа портала» с одного сервиса снимало его со всех сервисов, где он был выдан. Теперь строка шлёт свою область, и снимается только она. Форма без области (страница, открытая до обновления) работает как раньше. В журнале видно, из какой области сняли.
- Клетки номера аккаунта в половинной карточке «Действий» вылезали за край: последняя клетка выходила на 8px. Теперь клетки сжимаются под ширину.
Изменено — «Роли» человека
- Название роли впереди, машинное имя и уровень — строкой под ним. Отдельная колонка «Уровень» повторяла название другими словами.
- Область — ссылкой на сервис или организацию.
- Выдача на удалённый сервис названа прямо: «удалённый сервис #N» вместо «сервис #N». Её предлагают убрать, под таблицей — почему она ничего не открывает.
- На телефоне — карточками, без обрезанных колонок.
Изменено — «Сессии» и «Устройства»
- Строка — устройство, а не сессия: сессии одного браузера с одного адреса сложены, их число — плашкой. У того, кто входит ссылками из писем, раньше было по десятку одинаковых строк.
- Сверху — сколько сессий и на скольких устройствах.
- У каждого устройства — «Завершить» (все его сессии, порталы получают событие выхода). У своего текущего — «Завершить остальные»: свою сессию строкой не закрыть.
- «Разлогинить везде» — под списком с пояснением, а не первой кнопкой на странице.
- Карточка человека в админке и «Устройства» в профиле складывают сессии одним механизмом и завершают одной дорогой.
Изменено — «Действия»
Стопка одинаковых кнопок во всю ширину разложена по карточкам. У каждого действия строкой сказано, что оно сделает:
- «Помочь войти»: ссылка сброса пароля (куда уйдёт или что почты нет), ссылка для входа, подтверждение почты, просмотр глазами владельца;
- «Доступ к аккаунту»: блокировка и удаление. Удаление — больше не сплошная красная кнопка среди безобидных ссылок. Рядом — дорога в опасную зону для удаления без следа. Суперадмину эти действия не предлагают, а объясняют, почему;
- «Номер аккаунта» — отдельной карточкой.
Изменено — список людей
- Длинное имя — одной строкой с многоточием, полное — в подсказке. «Имена» ботов в сотню знаков растягивали строку на три.
Проверки
admin_people— новая, 33 проверки:- роль снимается только в своей строке;
- сессии складываются по устройству;
- чужую и свою текущую сессию строкой не закрыть;
- «Действия» — карточками;
- имя в списке — одной строкой.
- Мутаций: 341 (+10).
4.91.0 · Обзор
Второй шаг переработки основных экранов — карточки организаций и порталов.
Добавлено — обзор портала
Карточка портала открывается обзором, а не длинной формой реквизитов. Раньше то, что важно каждый день, было разбросано по пяти разделам.
- Плитки-числа, каждая ведёт в свой раздел:
- люди — и сколько входили за неделю;
- последний вход;
- заявки;
- недоставленные события (цветом предупреждения, если есть).
- «Как дела» — проверки со значком и дорогой туда, где это чинится:
- портал включён;
- портал отвечает (или почему нет);
- адреса возврата сходятся;
- события доставлены;
- заявок нет.
- «Как входят»: окно или страница, откуда оформление, какие способы.
- «Чей и кому открыт»: организация-владелец, кого пускать, каким организациям выдан, сколько своих ролей.
Реквизиты переехали на /admin/clients/{id}/req. После сохранения форма возвращает в реквизиты, а не в обзор. Старые ссылки на карточку открывают обзор, из него одна ссылка до реквизитов.
Изменено — обзор организации
- Плитки-числа во всю ширину: участники, люди, сервисы, доступы к чужим порталам — каждая с подписью, что она считает. Раньше «Участников: 6» в колонке «Состояние» спорило с «Пользователи 9» в колонке разделов. Теперь оба числа названы: участники — состав, люди — участники и те, кто ходит в её сервисы.
- «Организация включена» — тумблер в основной форме, как у портала.
Исправлено
- Кнопка «Выключить организацию» с 4.29 ничего не делала. Она слала действие
disable/enable, которого контроллер не знает, и организация оставалась включённой. Проверки вызывали действиеtoggleнапрямую, а не кнопку, поэтому ошибку не замечали. Теперь проверка отправляет ровно то, что отправляет форма. - Приглашения после создания и отзыва уводили на старый якорь
#tab-invites. Опасная зона в одном из случаев уводила на#danger. Теперь — на свои разделы.
Проверки
admin_cards(+3):- карточка портала открывается обзором;
- реквизиты на
/req, после сохранения — обратно в них; - организацию выключают и включают из обзора, и это срабатывает.
- Мутаций: 331 (+3).
4.90.0 · Лица списков
Владелец: «переходим к основным экранам — изучаем, смотрим, логично ли, красиво ли, формируем изменения, переписываем». Снимки 21 экрана админки: организации, порталы, пользователи, роли, журналы. Первый шаг — списки порталов и организаций и то, что мешало на всех экранах сразу.
Изменено — плитка портала
Плитка отвечает на вопросы о портале, а не пересказывает его реквизиты:
- под именем — адрес без протокола и организация-владелец;
- метки — как открывается вход («вход окном поверх сайта» и т. п.) и чем портал отличается от обычного: по заявке, нужен 2FA, сторонний, родственный домен;
- внизу — сколько людей, когда входили последний раз и сколько событий не доставлено (цветом предупреждения). Раньше застрявшие события были видны, только если зайти в карточку;
- пустой портал — «пока никого», а не «0 пользователей»;
- знак крупнее (36px), имя и подпись — столбиком рядом с ним.
Числа, как и раньше, — одним запросом на весь список, а не по запросу на плитку.
Изменено — организации
- Знак той же формы, что у портала: скруглённый квадрат с двумя буквами названия на цвете от слага. Раньше в списке у организации знака не было, а в карточке был бледный круг — один объект выглядел двумя разными.
- Плитка — участники и сервисы («3 сервиса», «сервисов нет»). Машинный слаг ушёл в карточку: его копируют оттуда, а в списке он шумел.
- Объяснение «что выдано организации…» — строкой под заголовком, а не плашкой во всю ширину над списком: его читают один раз.
Исправлено — по всем экранам
- «1 дн назад» → «вчера», «3 дня назад», «21 день назад». Минуты и часы сокращаются, как раньше.
- Статус доступа в карточке человека стоял голым «active», в журнале почты — «sent». Теперь одна плашка на все места: доступ — «открыт», «заявка», «закрыт»; письмо — «отправлено», «не ушло», «в очереди».
Проверки
admin_lists(новый, 19): время словами, статусы, знак организации в списке и карточке, плитки порталов и организаций, число сервисов, один запрос на весь список.- Мутаций: 328 (+10).
4.89.0 · Свои имена
Владелец: «переименуй технические имена с переходным периодом», и «старая болячка — кнопка "Сохранить изменения" с максимально уродским блоком».
Изменено — технические имена без названия проекта
У всех прежних имён переходный период: SSO продолжает их отдавать и принимать до версии 5.0. Ни один портал и ни одна установка не ломаются в день обновления.
Протокол с порталами:
| Было | Стало | Переходный период | |---|---|---| | X-TSOY-Client, X-TSOY-Timestamp, X-TSOY-Signature (выгрузка людей) | X-SSO-* | SSO шлёт оба набора, набор портала принимает любой | | X-TSOY-Event, X-TSOY-Timestamp, X-TSOY-Signature (вебхуки) | X-SSO-* | SSO шлёт оба набора | | X-TSOY-ID (метка «ответило приложение») | X-SSO-App | отдаются обе, проверка связи понимает любую | | /.well-known/tsoy-move | /.well-known/sso-move | оба адреса отвечают | | файл tsoy-secrets.php на портале | sso-secrets.php | набор читает оба; у портала, где старый файл уже есть, пишет в него же | | TSOY_CLIENT_SECRET, TSOY_USERS_SECRET, TSOY_SECRETS_FILE | SSO_* | набор читает оба имени |
Порталам ничего менять не нужно: старый набор работает как работал. Новый набор, скачанный из карточки портала, сразу понимает новые имена.
Внутри установки:
- Константы
TSOY_ROOT,TSOY_VERSION,TSOY_REQUEST_ID→SSO_*. Старые имена оставлены синонимами для сторонних скриптов. - Метрики
tsoyid_*→sso_*. Старые отдаются рядом теми же числами: графики и тревоги не слепнут в день обновления. - Выбор темы в браузере — ключ
sso-theme; прежнийtsoy-themeчитается, так что у людей тема не сбросится. - Имя cookie сессии для новых установок —
sso. У существующих оно записано в конфиге и не меняется: никого не разлогинит. - Новые API-токены начинаются с
sso_; выданные раньше работают. - Прочее:
- архив поставки —
sso-vX.Y.Z.zip; User-Agentзапросов —SSO/…;- QR на удостоверении —
sso:…; - переменные для проверок —
SSO_FONTS_BASE,SSO_SHOTS_API.
Исправлено — полоса «Сохранить изменения»
Полоса была лентой во всю ширину с чертой сверху. В стеклянной карточке она выглядела белой плитой поверх полупрозрачного, а на фоне страниц — швом, режущим форму. Теперь:
- Пилюля по размеру кнопок. Пока полоса прилипла к низу окна поверх содержимого, она плывёт стеклом с мягкой тенью и отступает от края.
- На своём месте в конце формы — просто ряд кнопок, без подложки, по краю полей.
- Одно правило на все формы — на странице, в карточке, на фоне страниц и в диалоге. Отдельные «белая в карточке» и «стекло на фоне» убраны.
- Без мигания. Первое состояние ставится сразу, без перехода: пилюля не мигает там, где полоса стоит на месте. Без скрипта пилюля видна всегда: лишняя подложка лучше кнопок поверх текста.
Проверки
admin_smoke:- вебхук несёт
X-SSO-*и прежниеX-TSOY-*с той же подписью; - выгрузка людей проходит под обоими наборами заголовков;
sso-moveиtsoy-moveотвечают;- метрики — под обоими именами;
- набор читает оба файла секретов.
frame: имя cookie берётся из конфига установки, а не строкой.ui_fixes(+5): пилюля, покой без подложки, в карточке без плиты, «прилипла» по наблюдателю, одна полоса на все формы.- Мутаций: 318 (+2).
4.88.0 · Это вы?
Владелец вошёл через второй аккаунт Яндекса с другой почтой, и SSO предложил завести новый аккаунт, хотя фамилия, имя и дата рождения совпали с уже существующим. Попросил объединение аккаунтов из админки, заметил пару мелочей на экранах входа — и попросил держать репозиторий нейтральным.
Добавлено — «Похоже, у вас уже есть аккаунт»
На экране «Создать аккаунт?» после входа через сервис теперь ищется похожий аккаунт:
- по номеру телефона — его подтверждает сам сервис, и в базе он уникален;
- по фамилии, имени и полной дате рождения вместе. Регистр, «ё» и лишние пробелы не в счёт. Одних фамилии и имени мало: тёзки бывают.
Найденный аккаунт назван, но не раскрыт: первая буква почты и домен, а без почты — сервисы, через которые в него входят. Главной становится кнопка «Войти в него и привязать …», а создание нового — запасным путём.
Сами аккаунты не связываются: совпавшие имя и дата рождения — не доказательство. Доказательство — вход в найденный аккаунт любым его способом. Связка ждёт в сессии десять минут и применяется там, куда сходятся все пути входа, — после второго фактора и подтверждения почты. На экране входа, пока она ждёт, стоит плашка «Войдите в свой аккаунт — … привяжется к нему» с отменой. Связку сервиса с другим аккаунтом она не перебивает.
Добавлено — объединение аккаунтов в админке
В карточке пользователя появился раздел «Объединить»:
- Возможные дубли — те же фамилия и имя (с датой рождения или без неё), со ссылкой на сравнение.
- Поиск второго аккаунта по почте (в том числе дополнительной), логину, телефону или номеру.
- Сравнение сторон — одной таблицей: почты, логин, телефон, дата рождения, сервисы входа, ключи, роли, доступы, организации, даты.
- Выбор, какой аккаунт оставить. Сработает тот же механизм, что у человека в профиле: переезжают сервисы входа, ключи, доступы, роли и организации, почта влитого становится дополнительной. Влитый аккаунт получает статус «удалён» со ссылкой на оставшийся, его сессии закрываются, порталам уходит событие удаления с новым адресом.
Объединение необратимо, поэтому оно за тем же паролем, что окончательное удаление; после пароля возвращает на сравнение. Суперадмина влить нельзя. В журнале — от имени администратора.
Исправлено
- «Сервис подтвердил вашу личность» и «аккаунта ещё нет» — теперь две строки, а не одна фраза в два предложения.
- В окне входа поверх сайта знак установки стоит слева, как над основной формой, а не по центру.
- Файл кодов восстановления скачивается как
recovery-codes.txt, без названия проекта в имени.
Изменено — репозиторий без личных данных
Проект должен в любой момент уйти в открытый доступ. Из кода, тестов, документации и истории изменений убраны:
- название установки — в текстах, установщике и значениях по умолчанию (по умолчанию теперь «SSO»; у существующих установок название задано в настройках и не меняется);
- имя автора и его домены в примерах и тестах — теперь «Иван Петров» и
*.example; - адреса боевой установки;
- названия конкретных порталов — примеры теперь вымышленные, как «Комбинат Заря».
Документ архитектуры теперь ARCHITECTURE.md.
Технические имена оставлены: заголовки протокола X-TSOY-*, адрес /.well-known/tsoy-move, файл секретов портала, константы кода и ключи браузера. Их уже используют развёрнутые порталы, и смена — отдельное решение с переходным периодом.
Проверки
duplicates(новый, 25):- похожий аккаунт по телефону и по фамилии с именем и датой;
- не по одним именам, не в заблокированный;
- название без раскрытия почты;
- «Войти и привязать» сквозным путём по HTTP со входом по паролю;
- чужая связка не перебивается, срок жизни;
- объединение в админке: за паролем, в обе стороны, в журнале — от имени администратора.
login_window: знак в окне — слева.- Мутаций: 316 (+16).
4.87.0 · Одно окно
Владелец входил в Портфолио через Telegram из окна поверх сайта: «ТРИ окна! Одно во вкладке самого сервиса, ещё одно окно SSO в отдельном окне браузера и третье окно Telegram». И спросил: «Почему в основных формах — квадратный логотип и красивая надпись, а в окнах авторизации сервисов — "● SSO"?»
Исправлено — лишние окна
- Сервис из окна поверх сайта. Щелчок «Продолжить с …» во фрейме уводит саму вкладку портала прямо на сервис (с
idp_hint). Раньше открывалось отдельное окно SSO. Вход всё равно кончается переходом на адрес возврата портала в этой же вкладке, так что уйти с неё — не потеря. Отдельное окно осталось для того, что во фрейме не работает помимо сервисов: ссылка из письма и фрейм, который не загрузился. - Telegram — переходом в том же окне. Раньше сначала открывалась страница с кнопкой-виджетом, а виджет открывал своё окно. Теперь старт ведёт прямо на страницу Telegram
oauth.telegram.org/authсreturn_to: - это тот же путь, которым виджет пользуется там, где окон нельзя (браузеры внутри приложений);
- после подтверждения Telegram возвращает на
/social/telegram/returnс данными во фрагменте адреса (#tgAuthResult=…); - скрипт переносит данные в обработчик, где сверяются подпись и state;
- номер бота — начало его токена;
- если токен не такого вида, остаётся страница с виджетом, как раньше;
- домен бота в BotFather (
/setdomain) нужен тот же, что и для виджета. - state и у Telegram. Подпись доказывает, что данные от Telegram, а state — что вход начал этот же браузер. Без него чужую подписанную ссылку можно было бы подсунуть и войти человеком в чужой аккаунт. Для страницы с виджетом всё как было: подпись — единственная проверка.
В итоге: вкладка портала → Telegram (или Яндекс) → снова портал, уже с входом. Одно окно.
Исправлено — окно входа выглядело чужим
Во фрейме на странице портала и в окне входа была своя компактная раскладка, и в ней было три недочёта:
- Знак. Там стоял запасной «● Название» вместо знака и названия, как над основной формой. Теперь знак тот же. Если пришли с портала, вместо знака коннектор портала, как и в основной форме.
- Карточка в карточке. Окно само и есть карточка, а внутри была ещё одна со своей рамкой. Теперь форма стоит прямо на фоне, как в колонке основной формы.
- Высота окна. Скрипт мерил страницу, а она не ниже фрейма, поэтому окно умело только расти: после длинной регистрации «Не помню» висело посреди пустого окна. Теперь высота считается по содержимому, окно и растёт, и сжимается (от 360px).
Исправлено — фон страниц во фрейме
4.85 обещал фон страниц в окне входа на странице портала, но условие «не попап» его отсекало: фрейм — та же компактная раскладка. Проверка тогда смотрела на исходник, а не на страницу. Теперь фон есть и во фрейме, и в окне входа. Видео и YouTube там по-прежнему не подключаются.
Проверки
login_window(новый, 18):- Telegram переходом: бот, возврат со state, подписанный ответ проходит; повтор, без state и изменённое поле — нет;
- запасная страница с виджетом;
- вкладка вместо окна;
- знак и раскладка в окне.
backdrop: фон в компактной раскладке проверяется по отрисованной странице.- Сквозной замер в браузере: старт → (Telegram) → возврат с
#tgAuthResult→ обработчик получил имя «Проба» без искажений и совпавший state → «Создать аккаунт?». - Мутаций: 300 (+11).
4.86.0 · Продолжить с …
Владелец прислал скриншоты входа у Claude, ChatGPT и X: «сделай по красоте кнопки для авторизации через соцсети с логотипами, красивым правильным текстом».
Изменено — кнопки сервисов входа
- Знаки сервисов. Раньше у всех кнопок был один значок «наружу». Теперь у каждой свой знак:
- Telegram — голубой круг с самолётиком;
- Яндекс ID — красный круг с «Я»;
- VK — синий квадрат;
- GitHub — одноцветный, берёт цвет текста и не пропадает на тёмной теме.
- Подпись «Продолжить с Telegram», «Продолжить с Яндекс ID». Слово «продолжить», а не «войти»: той же кнопкой и заводят аккаунт. Яндекс называется «Яндекс ID», как его вход называет сам Яндекс. По-английски — «Continue with …».
- Вид. Знак и подпись по центру, кнопка во всю ширину, рост и скругление как у поля. Цветной только знак, сама кнопка в теме: несколько сервисов не спорят цветами с кнопкой «Войти». При четырёх сервисах на широком экране — два столбца с одним именем. На телефоне и в окне поверх сайта столбец один, подпись полная.
Добавлено
- «Сервисы — первыми» в «Способах входа на экране». Кнопки «Продолжить с …» встают над формой, а под ними — «или», как у Google, Apple и X. В окне поверх сайта портала они тогда видны сразу, без прокрутки. По умолчанию выключено: кнопки под формой, как было. Предпросмотр показывает порядок сразу, до сохранения.
idp_hint— сразу через сервис./authorize?…&idp_hint=yandexведёт мимо экрана выбора прямо на Яндекс, какkc_idp_hintу Keycloak.- Работает только для включённого сервиса, только если портал его показывает, и не во фрейме. Иначе молча не срабатывает, и человек видит обычный экран входа.
- В сохранённом запросе подсказки нет: после входа она не сработает снова.
- Описано порталам в
integration.md. - Из окна поверх сайта — без второго выбора. Щелчок «Продолжить с Яндекс ID» во фрейме открывает отдельное окно (страницы сервисов во фрейм не пускают). Раньше окно открывалось на экране входа, и сервис приходилось выбирать ещё раз. Теперь фрейм сообщает, какой сервис выбран, и окно открывается сразу на нём. В адрес попадают только латинские буквы.
Изменено — окно входа поверх сайта
Страница портала под окном входа размыта заметнее (8px вместо 3px), как у X: окно главное на экране, сайт под ним только угадывается.
Проверки
social_buttons(новый, 26):- знаки и цвета;
- подписи по-русски и по-английски;
- два и четыре сервиса;
- «Сервисы — первыми» на экране и в черновике предпросмотра;
idp_hint: включённый, выключенный, чужое имя, фрейм, портал без сервисов;- подсказка из фрейма в окно.
login_look(+2): тумблер «Сервисы — первыми» сохраняется формой.mail_i18n: Yandex ID по-английски.- Мутаций: 289 (+14).
4.85.0 · Дизайн сайта главнее
Владелец (скриншоты окна входа Портфолио и входа в установку): «почему на формы авторизации порталов не распространяется общий дизайн, задаваемый /admin/appearance?»
Причина: с 4.82 тема, которую портал прислал манифестом, была главнее «Оформления сайта», а сайт добавлял только то, чего портал не задал. Портфолио присылает почти всё — палитру, скругление 6, Inter и Garamond, — и от оформления сайта до его входа доходило одно стекло. Окно входа на странице портала к тому же было без фона страниц.
Добавлено — выбор «Вход в порталы»
В «Оформлении сайта», рядом с «Это оформление — на весь сайт»:
- «Дизайн сайта главнее» (по умолчанию). Как у сайта: шрифты, форма, скругления, карточки, узор, тени, раскладка и тема для новых — даже если портал прислал свои. Чего сайт не задал, стоит по умолчанию, а не берётся у портала. От портала остаются цвета (по ним вход в него узнаётся) и его тексты панели;
- «Портал главнее» — как в 4.82: присланное порталом — его, остальное от сайта;
- «Только дизайн сайта» — все порталы выглядят как вход в установку, их темы не применяются.
Портал, которому в карточке задано «Своё», выглядит как настроено там: это оформление задают здесь же руками, и выбор его не трогает. Подсказка в карточке портала говорит, где лежит выбор.
Изменено — фон страниц в окне входа на странице портала
Фон страниц теперь есть и в окне входа на странице портала, но только картинками: видео и YouTube скрипт во фрейме не подключает. YouTube — вложенный документ, на котором Chrome 153 с блокировщиками и падал (4.73). В попапе соцвхода фона по-прежнему нет: окно живёт секунды.
Проверки
look_builder(+9): три режима на портале «как Портфолио»:- по умолчанию — сайт;
- узор, который задал только портал, при «сайт главнее» не встаёт;
- цвета и цитата — портала;
- «Своё» не трогается;
- мусор в настройке — как по умолчанию.
login_look(+2): выбор сохраняется; чужое значение и форма без поля его не сбивают. Проверка подделанной раскладки больше не ждёт «слева»: отброшенное значение даёт раскладку сайта, какой бы она ни была.portal_theme: разбор темы Портфолио проверяется при «Портал главнее».backdrop: фон во фрейме — только картинками.- Мутаций: 275 (+8).
4.84.0 · Фон страниц
Владелец: «было бы неплохо выносить изображения/видео на фон форм, ЛК, админки — чтобы было и смотрелось интереснее и интерактивнее»; «всё, что касается дизайна, — доделай до божественной красоты».
Добавлено — фон страниц
В «Оформлении сайта» — раздел «Фон страниц»:
- где: вход и главная, кабинет, админка — каждое своей галочкой;
- что: тот же набор, что у обложки панели входа:
- картинка или картинки по кругу, в том числе «живыми обоями»;
- видео файлом;
- видео с YouTube;
- приглушение: сильное (по умолчанию), среднее или лёгкое. Между кадром и страницей — вуаль цвета фона темы: подписи вне карточек стоят на ней, а не на чужом кадре. Рядом сказано, что чем легче вуаль, тем труднее читаются подписи вне карточек;
- размытие: без, лёгкое, сильное;
- «Живой фон»: фон чуть смещается за курсором, как окно, в которое смотришь под другим углом. Только мышью, и не у того, кто просил «без движения».
Карточки остаются карточками. Со «стеклом» из конструктора сквозь них размыто виден фон.
Осторожно, как и у обложки:
- видео и YouTube подключаются только на широком экране и не при экономии трафика — на телефоне стоит первая картинка;
- у фона нет кнопки звука;
- в попапе и в окне входа на странице портала фона нет вовсе: вокруг свой сайт, а видео во фрейме — вложенный документ, на котором Chrome 153 с блокировщиками и падал (4.73);
- на страницах ошибок фона нет.
Механизм один: CoverSet теперь ведёт три набора — обложку установки, обложки порталов и фон (bg), — а поля формы у каждого редактора со своей приставкой, так что на одной странице живут два редактора.
Исправлено — замечено на боевой после 4.83
Кнопка звука у видео на обложке не была видна. У длинной формы входа (вход через сервисы, документы) панель с обложкой тянулась на всю высоту страницы, и её нижний угол с кнопкой уезжал ниже первого экрана. Теперь панель — ровно в экран и стоит на месте, пока прокручивается форма.
Липкая полоса «Сохранить изменения» на фоне страниц — стеклом, а не сплошной плитой цвета страницы; внутри карточек — как была.
Изменено — дашборд
Под числом на дашборде стояла одна кривая — у неудачных входов; три соседние плитки кончались пустым полем. Теперь у каждой своя кривая за 14 дней: регистрации, входы (теми же событиями, что число над ней), неудачные входы, новые сессии.
Проверки
tests/backdrop.php(26 проверок, сервер не нужен):- настройки только из списка, и в базу чужое не попадает;
- поля фона со своей приставкой;
- три набора не смешиваются;
- слой только там, где отмечено, без кнопки звука и адреса видео;
- без фона — без прозрачности;
- где фона не бывает;
- видео только на широком экране;
- «живой фон» только мышью и не при «без движения»;
- вуаль и прозрачность страницы;
- редактор;
- панель входа ровно в экран;
- стеклянная полоса «Сохранить».
tests/ui_fixes.php(+2): кривые у всех плиток дашборда.- На стенде: фон в кабинете, админке и на входе в обеих темах; «живой фон» сдвигается за настоящей мышью (
translate3d(7.91px, 7.71px)) и стоит при «без движения»; на окне высотой 560px кнопка звука видна. - 15 новых мутаций, всего 267.
4.83.0 · Контрольный прогон
Владелец: «контрольный прогон проекта на наличие ошибок, багов, поломок, уязвимостей, криворукости дизайна — и исправление всех этих недочётов»; «почему нельзя включать звук у видео, которое играет в заставке?».
Снял все разделы админки и кабинета на компьютере и на телефоне, заново прошёл по коду новых возможностей (права маршрутов, отдача файлов, загрузки, внешние запросы), замерил живую боевую. Что нашлось — исправлено, и каждая находка стала проверкой.
Исправлено — заметно на боевой
- YouTube на обложке. В первые секунды и на каждом повторе поверх обложки стояли название ролика и кнопки плеера «назад · пауза · вперёд». Теперь:
- повтор — перемоткой через API встраивания, а не плейлистом из одного ролика (плейлист и рисовал «назад · вперёд»);
- картинка-заставка лежит поверх плеера и уходит, когда тот отыграл свои подписи (~3 с), на повторе возвращается на те же секунды. Без картинок — ровная подложка;
- сообщения принимаются только от своего фрейма.
- Экран входа по ключу возврата без сессии. Если сессия по дороге умирала, вход всё равно возвращал на портал, но экран был безымянным: ни «Вы входите в …», ни темы портала. Теперь портал находится и по ключу.
Добавлено — звук у видео на обложке
Видео со звуком браузеры не запускают, пока человек ничего не нажал: такое видео просто не заиграло бы. Поэтому видео начинает без звука, а в углу панели — кнопка звука. Она появляется, когда видео заиграло, и работает и у файла, и у YouTube. Кнопку можно убрать в редакторе обложки («Кнопка звука»).
Исправлено — вёрстка и мелочи
- «Регистрация»: два лишних
</div>закрывали колонку раздела раньше времени — полоса «Сохранить изменения» уезжала под меню разделов. Ещё по одному лишнему было в профиле и журнале человека. - «Документы»: вместо ссылки «Заполнить →» на экране стоял её HTML-код.
- «Почта»: пропадал пробел перед ссылкой «Здоровье» — PHP съедает перевод строки после
?>. - «Реквизиты»: второе пояснение повторяло первое — ссылка на документы стала кнопкой в шапке.
- «Опасная зона» человека, портала и организации открывалась без колонки разделов — единственная из всех. Теперь — в общей оболочке карточки.
- Журнал портала: действие системы подписано словом «система», а не висячим «—» после заголовка, в котором уже есть тире.
- Телефон:
- в карточке портала и человека шапка стояла первой плиткой в ленте разделов, и разделам оставался один пункт — теперь шапка над лентой, а страница не шире экрана (замер: 375 из 375);
- значки темы и экрана в предпросмотре вставали башенками.
- Смоук оставлял в подвале стенда подпись «подпись из файла».
Проверено и чисто
Права на маршрутах схем, шрифтов, обложек и витрины; отдача файлов только по шаблону имени; шрифты — только с fonts.gstatic.com по HTTPS, без переходов по редиректам; видео — по байтам, с nosniff; внешние адреса витрины — с защитой от внутренних сетей.
Порталы
Сессиям Портфолио, Архива и Календарь событий переданы задачи по замеру их главных. Архив уже выложил: sso.js подключён, data-sso-login на всех восьми кнопках входа, есть og:image.
Проверки
tests/ui_fixes.php(13 проверок): портал по ключу возврата, мелочи со снимков, «Опасная зона» в оболочке, телефон.tests/templates_test.php— три новых правила для всех шаблонов:- баланс
<div>; - пробел перед ссылкой не съеден;
- разметка внутри
callout()— только с флагом «сырой».
Проверка «у каждого переключателя в скрипте есть разметка» теперь видит и разметку классов ядра.
tests/cover_set.php(+7, всего 44): повтор без плейлиста, заставка поверх плеера, подложка, кнопка звука у файла и у YouTube, её выключение.- На стенде замером через DevTools:
- заставка → видео через ~3 с;
- кнопка звука появляется и переключает звук;
- на телефоне ширина страниц карточек 375 из 375.
- 21 новая мутация, всего 252.



