From 199910eceb92570f30d6dc12a50678ee7b45b969 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Tue, 13 Oct 2026 15:59:20 +0700 Subject: [PATCH] =?UTF-8?q?chore(tests):=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D1=82=D1=8C=20=D1=81=D1=80=D0=BE=D0=BA=20JWT=20?= =?UTF-8?q?=D0=B8=20=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D0=B2?= =?UTF-8?q?=D1=8B=D1=85=D0=BE=D0=B4=D0=B0=20Portal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ux-ui-external-acceptance.md | 18 +++++- docs/ux-ui-plan.md | 6 +- docs/ux-ui-progress.md | 16 +++++- docs/ux-ui-remaining-acceptance.md | 20 ++++++- docs/ux-ui-stage-12.md | 16 +++++- docs/ux-ui-test-server.md | 18 +++++- .../portal198-lifecycle-2026-10-13.json | 40 +++++++++++++ .../portal198-live-ui-2026-10-13.json | 57 +++++++++++++++++++ 8 files changed, 179 insertions(+), 12 deletions(-) create mode 100644 docs/ux-ui/acceptance/portal198-lifecycle-2026-10-13.json create mode 100644 docs/ux-ui/acceptance/portal198-live-ui-2026-10-13.json diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index af012aca..aadcd3a6 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -696,7 +696,7 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -2400,3 +2400,17 @@ Reader retry403, отсутствие acknowledgedDuplicateRisk400, admin expect Протоколы: [первый partial/failed live](ux-ui/acceptance/telegram197-partial-2026-10-13.json), [полный SQL с simulated provider](ux-ui/acceptance/telegram197-dry-result-2026-10-13.json), [отдельный live retry](ux-ui/acceptance/telegram197-resume-result-2026-10-13.json), [итог и ограничения](ux-ui/acceptance/telegram197-summary-2026-10-13.json). Следующий198: настоящий expiry/logout/reissue Portal и безопасный return_to. Первый непрерывный Telegram live сценарий остаётся диагностической границей; повторять его только при достаточной диагностике и основании, а не отправлять дополнительные дубли ради зелёного счётчика.12.5 открыта. + +## 12.5.198 — срок действия Portal JWT, права и выход (2026-10-13) + +Использован настоящий JWT, выданный Portal в195 и естественно истёкший к проверке: MM GET servers401, Portal me401 и reissue401. Токен не редактировался и TTL не менялся. На собственном временном reader через документированный PUT /api/v1/admin/users/:id/access удалён доступmm: прежний JWT по-прежнему200 доexp, reissue200 выдаёт текущие claims и новый MM JWT403. Возвращённый доступ и новый reissue восстановили200. Первый неверно адресованный PATCH в диагностическом драйвере был исправлен на PUT/access; изменение source продукта не требовалось. User fixture удалён204. + +Logout200 очищает refresh cookie(Max-Age0), но ранее выданный bearer MM JWT остаётся200 и Portal reissue с ним также200 доexp. Это подтверждённая граница offlineJWT и Portal1.3.1: cookie/session logout не означает немедленный отзыв access token. Свежие JWT/credentials в Git не сохранялись. + +Live UI1440/320 с настоящим expired JWT: MM очистил mmapp_token, направил на Portal, реальный login/callback восстановил приложение, fragment удалён, overflow/page errors нет. Однако callback открыл /dashboard вместо исходного /servers: контекст не сохранён, следующий199 исправляет это. Внешний https://outside.invalid/auth/callback не вызвал попытки навигации после login; Portal остался на /admin. Browser /logout очистил token storage и показал login. Защитный browser route только блокировал возможную недоверенную навигацию, ответы API не подменял. + +Оставшиеся return_to на другой localhost port и похожий hostname не приняты: серия диагностических входов достигла rate limit Portal. HTTP GET / и /api/v1/auth/config подтвердили429 с Retry-After18/17s; это не объявлено ошибкой защиты return_to. Промежуточные успехи сохранены отдельно, полный UI прогон не claimed. Повторять только эти оставшиеся случаи после cooldown, без нового полного цикла. Source/runtime/ReUI не менялись. + +Протоколы: [actual lifecycle API](ux-ui/acceptance/portal198-lifecycle-2026-10-13.json), [live UI и границы429](ux-ui/acceptance/portal198-live-ui-2026-10-13.json). + +Следующий199: восстановить исходный same-origin раздел и query после SSO с проверкой permissions и запретом внешних/auth callback redirect. Затем профильные E2E/deploy и два оставшихся Portal return_to.12.5 открыта. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 916eb4f0..26c7b018 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-13. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-13 -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. Этапы0–11 завершены в локальных границах журнала. История выполненных внешних блоков и доказательства сохранены в [журнале](ux-ui-stage-12.md) и [протоколе](ux-ui-external-acceptance.md). Реальная Telegram доставка, Portal SSO, multi-instance и оставшиеся профильные сетевые ограничения открыты. @@ -371,6 +371,6 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index ac1c8571..b56ce00c 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,20 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–196 и ограничения ниже. Runtime backend/frontend ux-peak196. | +## 12.5.198 — срок действия Portal JWT, права и выход (2026-10-13) + +Использован настоящий JWT, выданный Portal в195 и естественно истёкший к проверке: MM GET servers401, Portal me401 и reissue401. Токен не редактировался и TTL не менялся. На собственном временном reader через документированный PUT /api/v1/admin/users/:id/access удалён доступmm: прежний JWT по-прежнему200 доexp, reissue200 выдаёт текущие claims и новый MM JWT403. Возвращённый доступ и новый reissue восстановили200. Первый неверно адресованный PATCH в диагностическом драйвере был исправлен на PUT/access; изменение source продукта не требовалось. User fixture удалён204. + +Logout200 очищает refresh cookie(Max-Age0), но ранее выданный bearer MM JWT остаётся200 и Portal reissue с ним также200 доexp. Это подтверждённая граница offlineJWT и Portal1.3.1: cookie/session logout не означает немедленный отзыв access token. Свежие JWT/credentials в Git не сохранялись. + +Live UI1440/320 с настоящим expired JWT: MM очистил mmapp_token, направил на Portal, реальный login/callback восстановил приложение, fragment удалён, overflow/page errors нет. Однако callback открыл /dashboard вместо исходного /servers: контекст не сохранён, следующий199 исправляет это. Внешний https://outside.invalid/auth/callback не вызвал попытки навигации после login; Portal остался на /admin. Browser /logout очистил token storage и показал login. Защитный browser route только блокировал возможную недоверенную навигацию, ответы API не подменял. + +Оставшиеся return_to на другой localhost port и похожий hostname не приняты: серия диагностических входов достигла rate limit Portal. HTTP GET / и /api/v1/auth/config подтвердили429 с Retry-After18/17s; это не объявлено ошибкой защиты return_to. Промежуточные успехи сохранены отдельно, полный UI прогон не claimed. Повторять только эти оставшиеся случаи после cooldown, без нового полного цикла. Source/runtime/ReUI не менялись. + +Протоколы: [actual lifecycle API](ux-ui/acceptance/portal198-lifecycle-2026-10-13.json), [live UI и границы429](ux-ui/acceptance/portal198-live-ui-2026-10-13.json). + +Следующий199: восстановить исходный same-origin раздел и query после SSO с проверкой permissions и запретом внешних/auth callback redirect. Затем профильные E2E/deploy и два оставшихся Portal return_to.12.5 открыта. + ## 12.5.197 — доставка Telegram и управляемый повтор (2026-10-13) Production compiled outbox проверен в собственной временной PostgreSQL БД и ограниченной роли, с реальными JWT Portal и тестовым Telegram bot/chat. Первый live прогон: enqueue с одинаковым dedupeKey сохранил одну запись; два независимых Node sender процесса выполнили одну отправку, одна запись sent и одна history. Telegram принял№2, затем драйвер намеренно подавил ответ: статус unknown, следующая автоматическая диспетчеризация не отправила сообщение повторно. Это контролируемая имитация потерянного ответа, не физический обрыв WAN. diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index b618ceeb..3382f132 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,8 +1,8 @@ # Оставшаяся внешняя приёмка — 2026-10-13 -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. -Это актуальная матрица после 12.5.197. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.198. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend/frontend `ux-peak196`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. @@ -26,7 +26,7 @@ ## Следующая последовательность — 2026-10-13 -1. **198 — Portal expiry/logout/reissue и return_to:** базовый SSO, reader privacy и Telegram доставки приняты с границами197. После — диагностика цельного Telegram сценария/crash/lock-loss. +1. **199 — SSO context:** сохранить исходный разрешённый раздел/query после login, запретить внешние/auth callback redirect. Затем scoped deploy и два return_to, ограниченные429 в198. 2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания. 3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций. @@ -1316,3 +1316,17 @@ Reader retry403, отсутствие acknowledgedDuplicateRisk400, admin expect Протоколы: [первый partial/failed live](ux-ui/acceptance/telegram197-partial-2026-10-13.json), [полный SQL с simulated provider](ux-ui/acceptance/telegram197-dry-result-2026-10-13.json), [отдельный live retry](ux-ui/acceptance/telegram197-resume-result-2026-10-13.json), [итог и ограничения](ux-ui/acceptance/telegram197-summary-2026-10-13.json). Следующий198: настоящий expiry/logout/reissue Portal и безопасный return_to. Первый непрерывный Telegram live сценарий остаётся диагностической границей; повторять его только при достаточной диагностике и основании, а не отправлять дополнительные дубли ради зелёного счётчика.12.5 открыта. + +## 12.5.198 — срок действия Portal JWT, права и выход (2026-10-13) + +Использован настоящий JWT, выданный Portal в195 и естественно истёкший к проверке: MM GET servers401, Portal me401 и reissue401. Токен не редактировался и TTL не менялся. На собственном временном reader через документированный PUT /api/v1/admin/users/:id/access удалён доступmm: прежний JWT по-прежнему200 доexp, reissue200 выдаёт текущие claims и новый MM JWT403. Возвращённый доступ и новый reissue восстановили200. Первый неверно адресованный PATCH в диагностическом драйвере был исправлен на PUT/access; изменение source продукта не требовалось. User fixture удалён204. + +Logout200 очищает refresh cookie(Max-Age0), но ранее выданный bearer MM JWT остаётся200 и Portal reissue с ним также200 доexp. Это подтверждённая граница offlineJWT и Portal1.3.1: cookie/session logout не означает немедленный отзыв access token. Свежие JWT/credentials в Git не сохранялись. + +Live UI1440/320 с настоящим expired JWT: MM очистил mmapp_token, направил на Portal, реальный login/callback восстановил приложение, fragment удалён, overflow/page errors нет. Однако callback открыл /dashboard вместо исходного /servers: контекст не сохранён, следующий199 исправляет это. Внешний https://outside.invalid/auth/callback не вызвал попытки навигации после login; Portal остался на /admin. Browser /logout очистил token storage и показал login. Защитный browser route только блокировал возможную недоверенную навигацию, ответы API не подменял. + +Оставшиеся return_to на другой localhost port и похожий hostname не приняты: серия диагностических входов достигла rate limit Portal. HTTP GET / и /api/v1/auth/config подтвердили429 с Retry-After18/17s; это не объявлено ошибкой защиты return_to. Промежуточные успехи сохранены отдельно, полный UI прогон не claimed. Повторять только эти оставшиеся случаи после cooldown, без нового полного цикла. Source/runtime/ReUI не менялись. + +Протоколы: [actual lifecycle API](ux-ui/acceptance/portal198-lifecycle-2026-10-13.json), [live UI и границы429](ux-ui/acceptance/portal198-live-ui-2026-10-13.json). + +Следующий199: восстановить исходный same-origin раздел и query после SSO с проверкой permissions и запретом внешних/auth callback redirect. Затем профильные E2E/deploy и два оставшихся Portal return_to.12.5 открыта. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 8f0bb600..e76d20a3 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -3705,3 +3705,17 @@ Reader retry403, отсутствие acknowledgedDuplicateRisk400, admin expect Протоколы: [первый partial/failed live](ux-ui/acceptance/telegram197-partial-2026-10-13.json), [полный SQL с simulated provider](ux-ui/acceptance/telegram197-dry-result-2026-10-13.json), [отдельный live retry](ux-ui/acceptance/telegram197-resume-result-2026-10-13.json), [итог и ограничения](ux-ui/acceptance/telegram197-summary-2026-10-13.json). Следующий198: настоящий expiry/logout/reissue Portal и безопасный return_to. Первый непрерывный Telegram live сценарий остаётся диагностической границей; повторять его только при достаточной диагностике и основании, а не отправлять дополнительные дубли ради зелёного счётчика.12.5 открыта. + +## 12.5.198 — срок действия Portal JWT, права и выход (2026-10-13) + +Использован настоящий JWT, выданный Portal в195 и естественно истёкший к проверке: MM GET servers401, Portal me401 и reissue401. Токен не редактировался и TTL не менялся. На собственном временном reader через документированный PUT /api/v1/admin/users/:id/access удалён доступmm: прежний JWT по-прежнему200 доexp, reissue200 выдаёт текущие claims и новый MM JWT403. Возвращённый доступ и новый reissue восстановили200. Первый неверно адресованный PATCH в диагностическом драйвере был исправлен на PUT/access; изменение source продукта не требовалось. User fixture удалён204. + +Logout200 очищает refresh cookie(Max-Age0), но ранее выданный bearer MM JWT остаётся200 и Portal reissue с ним также200 доexp. Это подтверждённая граница offlineJWT и Portal1.3.1: cookie/session logout не означает немедленный отзыв access token. Свежие JWT/credentials в Git не сохранялись. + +Live UI1440/320 с настоящим expired JWT: MM очистил mmapp_token, направил на Portal, реальный login/callback восстановил приложение, fragment удалён, overflow/page errors нет. Однако callback открыл /dashboard вместо исходного /servers: контекст не сохранён, следующий199 исправляет это. Внешний https://outside.invalid/auth/callback не вызвал попытки навигации после login; Portal остался на /admin. Browser /logout очистил token storage и показал login. Защитный browser route только блокировал возможную недоверенную навигацию, ответы API не подменял. + +Оставшиеся return_to на другой localhost port и похожий hostname не приняты: серия диагностических входов достигла rate limit Portal. HTTP GET / и /api/v1/auth/config подтвердили429 с Retry-After18/17s; это не объявлено ошибкой защиты return_to. Промежуточные успехи сохранены отдельно, полный UI прогон не claimed. Повторять только эти оставшиеся случаи после cooldown, без нового полного цикла. Source/runtime/ReUI не менялись. + +Протоколы: [actual lifecycle API](ux-ui/acceptance/portal198-lifecycle-2026-10-13.json), [live UI и границы429](ux-ui/acceptance/portal198-live-ui-2026-10-13.json). + +Следующий199: восстановить исходный same-origin раздел и query после SSO с проверкой permissions и запретом внешних/auth callback redirect. Затем профильные E2E/deploy и два оставшихся Portal return_to.12.5 открыта. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index d1abd978..9aab4350 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. | Параметр | Проверенное состояние | | --- | --- | @@ -708,7 +708,7 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13: блок197 — Telegram live dedupe/two senders/unknown hold и отдельный explicit retry приняты, пользователь подтвердил одно№1/два№2. Первый полный live прогон не прошёл immediate retry; причина не установлена, цельный live сценарий остаётся открытым. Runtime backend/frontend ux-peak196, Portal1.3.1 healthy, AUTH_REQUIRED=true. Следующий198 — Portal expiry/logout/reissue и return_to;12.5 открыта. +Актуальное продолжение 2026-10-13: блок198 — actual expired JWT401, reissue role changes, logout boundary и live expired recovery ПК/телефон приняты. Первый внешний return_to и browser logout passed; остальные два return_to ограничены подтверждённым429 Portal. Runtime ux-peak196. Следующий199 — сохранить исходный раздел/параметры после SSO;12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -2131,3 +2131,17 @@ Reader retry403, отсутствие acknowledgedDuplicateRisk400, admin expect Протоколы: [первый partial/failed live](ux-ui/acceptance/telegram197-partial-2026-10-13.json), [полный SQL с simulated provider](ux-ui/acceptance/telegram197-dry-result-2026-10-13.json), [отдельный live retry](ux-ui/acceptance/telegram197-resume-result-2026-10-13.json), [итог и ограничения](ux-ui/acceptance/telegram197-summary-2026-10-13.json). Следующий198: настоящий expiry/logout/reissue Portal и безопасный return_to. Первый непрерывный Telegram live сценарий остаётся диагностической границей; повторять его только при достаточной диагностике и основании, а не отправлять дополнительные дубли ради зелёного счётчика.12.5 открыта. + +## 12.5.198 — срок действия Portal JWT, права и выход (2026-10-13) + +Использован настоящий JWT, выданный Portal в195 и естественно истёкший к проверке: MM GET servers401, Portal me401 и reissue401. Токен не редактировался и TTL не менялся. На собственном временном reader через документированный PUT /api/v1/admin/users/:id/access удалён доступmm: прежний JWT по-прежнему200 доexp, reissue200 выдаёт текущие claims и новый MM JWT403. Возвращённый доступ и новый reissue восстановили200. Первый неверно адресованный PATCH в диагностическом драйвере был исправлен на PUT/access; изменение source продукта не требовалось. User fixture удалён204. + +Logout200 очищает refresh cookie(Max-Age0), но ранее выданный bearer MM JWT остаётся200 и Portal reissue с ним также200 доexp. Это подтверждённая граница offlineJWT и Portal1.3.1: cookie/session logout не означает немедленный отзыв access token. Свежие JWT/credentials в Git не сохранялись. + +Live UI1440/320 с настоящим expired JWT: MM очистил mmapp_token, направил на Portal, реальный login/callback восстановил приложение, fragment удалён, overflow/page errors нет. Однако callback открыл /dashboard вместо исходного /servers: контекст не сохранён, следующий199 исправляет это. Внешний https://outside.invalid/auth/callback не вызвал попытки навигации после login; Portal остался на /admin. Browser /logout очистил token storage и показал login. Защитный browser route только блокировал возможную недоверенную навигацию, ответы API не подменял. + +Оставшиеся return_to на другой localhost port и похожий hostname не приняты: серия диагностических входов достигла rate limit Portal. HTTP GET / и /api/v1/auth/config подтвердили429 с Retry-After18/17s; это не объявлено ошибкой защиты return_to. Промежуточные успехи сохранены отдельно, полный UI прогон не claimed. Повторять только эти оставшиеся случаи после cooldown, без нового полного цикла. Source/runtime/ReUI не менялись. + +Протоколы: [actual lifecycle API](ux-ui/acceptance/portal198-lifecycle-2026-10-13.json), [live UI и границы429](ux-ui/acceptance/portal198-live-ui-2026-10-13.json). + +Следующий199: восстановить исходный same-origin раздел и query после SSO с проверкой permissions и запретом внешних/auth callback redirect. Затем профильные E2E/deploy и два оставшихся Portal return_to.12.5 открыта. diff --git a/docs/ux-ui/acceptance/portal198-lifecycle-2026-10-13.json b/docs/ux-ui/acceptance/portal198-lifecycle-2026-10-13.json new file mode 100644 index 00000000..0779c046 --- /dev/null +++ b/docs/ux-ui/acceptance/portal198-lifecycle-2026-10-13.json @@ -0,0 +1,40 @@ +{ + "date": "2026-10-13", + "block": "12.5.198", + "actualPortalImage": "1.3.1", + "cases": [ + { + "name": "actual naturally expired Portal token", + "issuedAt": 1791878079, + "expiredAt": 1791878979, + "checkedAt": 1791881690, + "mmServers": 401, + "portalMe": 401, + "portalReissue": 401, + "tokenAltered": false + }, + { + "name": "role removal and reissue", + "oldIssuedMmJwt": 200, + "reissue": 200, + "newMmJwt": 403, + "offlineOldTokenValidUntilExp": true + }, + { + "name": "role restoration and reissue", + "reissue": 200, + "newMmJwt": 200 + }, + { + "name": "logout boundary", + "logout": 200, + "refreshCookieCleared": true, + "oldMmJwt": 200, + "bearerReissueAfterLogout": 200, + "instantAccessTokenRevocation": false + } + ], + "apiMocks": false, + "serverWrites": 0, + "cleaned": true +} diff --git a/docs/ux-ui/acceptance/portal198-live-ui-2026-10-13.json b/docs/ux-ui/acceptance/portal198-live-ui-2026-10-13.json new file mode 100644 index 00000000..ba8eeeed --- /dev/null +++ b/docs/ux-ui/acceptance/portal198-live-ui-2026-10-13.json @@ -0,0 +1,57 @@ +{ + "date": "2026-10-13", + "block": "12.5.198", + "cases": [ + { + "name": "expired token recovery", + "width": 1440, + "expiredMmTokenCleared": true, + "portalLogin": true, + "recoveredActualSso": true, + "landingPath": "/dashboard", + "originalPathRestored": false, + "noFragment": true, + "noOverflow": true, + "pageErrors": 0 + }, + { + "name": "expired token recovery", + "width": 320, + "expiredMmTokenCleared": true, + "portalLogin": true, + "recoveredActualSso": true, + "landingPath": "/dashboard", + "originalPathRestored": false, + "noFragment": true, + "noOverflow": true, + "pageErrors": 0 + }, + { + "name": "disallowed return_to", + "target": "https://outside.invalid/auth/callback", + "externalNavigationAttempts": 0, + "portalStayed": true, + "apiMocks": false + }, + { + "name": "Portal browser logout", + "loginVisible": true, + "tokenStorageCleared": true + } + ], + "realRuntime": true, + "apiMocks": false, + "blockedUnexpectedNavigationForSafety": true, + "serverWrites": 0, + "complete": false, + "remaining": [ + "return_to different localhost port", + "return_to lookalike host" + ], + "failure": { + "confirmedHttpStatus": 429, + "retryAfterSeconds": 18, + "cause": "Portal rate limit exceeded after repeated login/UI diagnostics; remaining cases not accepted" + }, + "limitation": "Expired session recovery lands on /dashboard instead of the original section" +}