fix(network): защитить ключи WireGuard и режим просмотра операций

This commit is contained in:
Denozordec committed 2026-10-13 20:12:33 +07:00
1 parent c8f9c83f45
commit a404da768d
23 files changed
+1648 -36

No files matched your search

+16 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.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:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
@@ -2510,3 +2510,17 @@ Actual Portal reader настаром frontend ux-accessibility205 видел50
Production frontend ux-history207/source527 matched, backend ux-lock200/Portal/AUTH_REQUIRED сохранены.24 actual live UI6sections×reader/admin×1440/320 наpopulated historical metadata: readerbuttons disabled, adminenabled послеstable device read, informativecopy, nooverflow, Escape→trigger, mutationrequests0. Первыйadminrecursive check сделан доокончанияread ивиделcorrect temporarybusy; тестисправлен наожиданиеready, productguard неослаблялся. Own Portal users удалены204. Credentials/native configs не менялись.
Протоколы: [live baseline](ux-ui/acceptance/history207-baseline-live-2026-10-13.json), [E2E40](ux-ui/acceptance/history207-e2e-2026-10-13.json), [live24](ux-ui/acceptance/history207-live-2026-10-13.json), [deployment](ux-ui/acceptance/history207-deployment-2026-10-13.json). Следующий208: source GET WireGuard includePrivateKey флагне проверяетwrite permission; scoped nativekey privacy +read-only network workspaces.12.5 открыта.
## 12.5.208 — приватные ключи WireGuard и режим просмотра сетевых разделов (2026-10-13)
Старый production backend выдавал синтетический непустой приватный ключ reader при GET WireGuard с includePrivateKey=1/true. Baseline подтверждён actual compiled auth/mapper на собственной ограниченной PostgreSQL БД и локальном RouterOS HTTP fixture. Теперь явный запрос приватного ключа требует mm:network:write/admin, иначе403 до любых native requests. Обычный GET200 сохраняет public key и не содержит private key. is_admin без необходимого permission не заменяет право. Writer/admin сохраняют прежнее действие, legacy AUTH_REQUIRED=false не менялся.
WireGuard, IPsec, GRE, Firewall и Filters показывают режим просмотра и запрещают writer controls при read-only JWT. Использованы существующие readiness/mutation helpers; WireGuard toolbar/import/key-export/peer actions и callbacks дополнительно защищены. Backend RBAC остаётся авторитетной проверкой. Установленные ReUI primitives, vendor files и theme не менялись: добавлены operation-state props/copy.
11 fixed SQL cases: reader/writer/admin ×обычный GET/два private flags, is_admin alone, безJWT401; reader denied native request count0. Baseline/fixed/profile own DB/role/container удалены. WireGuard profile прошёл14.6s, включая56 node:test проверок; другие скрипты профиля не прибавляются к этому числу. Скопированный JSON label ошибочно называл traffic-rate, фактически runner запускал test:wireguard; label исправлен с сохранением originalReportedCommand. TypeScript/backend build/ESLint0errors,12 старых warnings Filters остаются.53 unique E2E:20 readonly PC/mobile +33 history/readiness/refresh. Два первоначальных GRE writer failures были некорректной fixture без обязательного ipsec:null; исправлены только данные теста,20 повторных cases прошли. Повторы не складываются.
Backend/frontend ux-native208 развёрнуты;470/527 source files и1044 compiled artifacts совпали, backend healthy. На каждом CHR через реальный admin API создан собственный WG-интерфейс с уникальным именем/свободным портом. Real reader обычный GET200 безключа, private flags403, admin получает ключ/public key сохранён. Private material вevidence не сохранялся.20 live UI5sections×reader/admin×1440/320 проверили создание/import/key-export controls, mutation requests0. Затем оба собственных интерфейса иPortal reader удалены; отсутствие интерфейсов проверено. Пароли и исходные native объекты не менялись. Это API privacy/UI proof, не WireGuard handshake/data-plane тест.
Протоколы: [baseline](ux-ui/acceptance/wireguard208-baseline-result.json), [fixed SQL11](ux-ui/acceptance/wireguard208-fixed-result.json), [profile](ux-ui/acceptance/native208-profile-result.json), [E2E53](ux-ui/acceptance/native208-e2e-2026-10-13.json), [live UI20](ux-ui/acceptance/native208-live-ui-2026-10-13.json), [native privacy/cleanup2](ux-ui/acceptance/wireguard208-native-live-2026-10-13.json), [compiled](ux-ui/acceptance/compiled208-result.json), [deployment](ux-ui/acceptance/native208-deployment-2026-10-13.json).
Следующий209: GRE mapper содержит ipsecSecret иipsec.secret, проверить оба публичных GET иограничить выдачу секретов reader, сохранив crypto-state/public metadata иwriter editing.12.5 открыта.
+3 -3
View File
@@ -1,12 +1,12 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-13. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
## Актуальная точка продолжения — 2026-10-13
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.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:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
+15 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.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.208 — приватные ключи WireGuard и режим просмотра сетевых разделов (2026-10-13)
Старый production backend выдавал синтетический непустой приватный ключ reader при GET WireGuard с includePrivateKey=1/true. Baseline подтверждён actual compiled auth/mapper на собственной ограниченной PostgreSQL БД и локальном RouterOS HTTP fixture. Теперь явный запрос приватного ключа требует mm:network:write/admin, иначе403 до любых native requests. Обычный GET200 сохраняет public key и не содержит private key. is_admin без необходимого permission не заменяет право. Writer/admin сохраняют прежнее действие, legacy AUTH_REQUIRED=false не менялся.
WireGuard, IPsec, GRE, Firewall и Filters показывают режим просмотра и запрещают writer controls при read-only JWT. Использованы существующие readiness/mutation helpers; WireGuard toolbar/import/key-export/peer actions и callbacks дополнительно защищены. Backend RBAC остаётся авторитетной проверкой. Установленные ReUI primitives, vendor files и theme не менялись: добавлены operation-state props/copy.
11 fixed SQL cases: reader/writer/admin ×обычный GET/два private flags, is_admin alone, безJWT401; reader denied native request count0. Baseline/fixed/profile own DB/role/container удалены. WireGuard profile прошёл14.6s, включая56 node:test проверок; другие скрипты профиля не прибавляются к этому числу. Скопированный JSON label ошибочно называл traffic-rate, фактически runner запускал test:wireguard; label исправлен с сохранением originalReportedCommand. TypeScript/backend build/ESLint0errors,12 старых warnings Filters остаются.53 unique E2E:20 readonly PC/mobile +33 history/readiness/refresh. Два первоначальных GRE writer failures были некорректной fixture без обязательного ipsec:null; исправлены только данные теста,20 повторных cases прошли. Повторы не складываются.
Backend/frontend ux-native208 развёрнуты;470/527 source files и1044 compiled artifacts совпали, backend healthy. На каждом CHR через реальный admin API создан собственный WG-интерфейс с уникальным именем/свободным портом. Real reader обычный GET200 безключа, private flags403, admin получает ключ/public key сохранён. Private material вevidence не сохранялся.20 live UI5sections×reader/admin×1440/320 проверили создание/import/key-export controls, mutation requests0. Затем оба собственных интерфейса иPortal reader удалены; отсутствие интерфейсов проверено. Пароли и исходные native объекты не менялись. Это API privacy/UI proof, не WireGuard handshake/data-plane тест.
Протоколы: [baseline](ux-ui/acceptance/wireguard208-baseline-result.json), [fixed SQL11](ux-ui/acceptance/wireguard208-fixed-result.json), [profile](ux-ui/acceptance/native208-profile-result.json), [E2E53](ux-ui/acceptance/native208-e2e-2026-10-13.json), [live UI20](ux-ui/acceptance/native208-live-ui-2026-10-13.json), [native privacy/cleanup2](ux-ui/acceptance/wireguard208-native-live-2026-10-13.json), [compiled](ux-ui/acceptance/compiled208-result.json), [deployment](ux-ui/acceptance/native208-deployment-2026-10-13.json).
Следующий209: GRE mapper содержит ipsecSecret иipsec.secret, проверить оба публичных GET иограничить выдачу секретов reader, сохранив crypto-state/public metadata иwriter editing.12.5 открыта.
## 12.5.207 — права отката общей истории конфигураций (2026-10-13)
Actual Portal reader настаром frontend ux-accessibility205 видел50 enabled restore buttons GRE; безнажатия подтверждёнbaseline.5 из6 ConfigHistorySheet caller не передавалиrestoreDisabled,defaultfalse. Теперь propобязателен, defaulttrue дляuntyped omission; GRE/WireGuard/IPsec/Filters/Firewall передаютpermission/device/busy guards. Recursive routes ужеимелиguard. Reader требуетnetwork:write (Filters filters:write), disabled/missing device запрещаетaction; GRE/IPsec/Firewall используютexisting readiness guards. Callbacks пятиcaller повторно проверяютpermission непосредственно передrequest. ШаблоныReUI/Timeline/Sheet/vendor unchanged; текст объясняет недоступностьотката.
+18 -4
View File
@@ -1,10 +1,10 @@
# Оставшаяся внешняя приёмка — 2026-10-13
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
Это актуальная матрица после 12.5.207. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Это актуальная матрица после 12.5.208. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-lock200`, frontend `ux-history207`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend/frontend `ux-native208`; 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. **208 — native read-only:** WireGuard private key flag GET permission иnetwork workspace write controls; SQL/native own fixtures, source guard/API/UI, безизменениячужихобъектов.
1. **209 — GRE secret DTOs:** /gre/tunnels и/filters/gre-tunnels, синтетические ключи/own DB, роли исохранение crypto-state; не менятьnative config.
2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания.
3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций.
@@ -1426,3 +1426,17 @@ Actual Portal reader настаром frontend ux-accessibility205 видел50
Production frontend ux-history207/source527 matched, backend ux-lock200/Portal/AUTH_REQUIRED сохранены.24 actual live UI6sections×reader/admin×1440/320 наpopulated historical metadata: readerbuttons disabled, adminenabled послеstable device read, informativecopy, nooverflow, Escape→trigger, mutationrequests0. Первыйadminrecursive check сделан доокончанияread ивиделcorrect temporarybusy; тестисправлен наожиданиеready, productguard неослаблялся. Own Portal users удалены204. Credentials/native configs не менялись.
Протоколы: [live baseline](ux-ui/acceptance/history207-baseline-live-2026-10-13.json), [E2E40](ux-ui/acceptance/history207-e2e-2026-10-13.json), [live24](ux-ui/acceptance/history207-live-2026-10-13.json), [deployment](ux-ui/acceptance/history207-deployment-2026-10-13.json). Следующий208: source GET WireGuard includePrivateKey флагне проверяетwrite permission; scoped nativekey privacy +read-only network workspaces.12.5 открыта.
## 12.5.208 — приватные ключи WireGuard и режим просмотра сетевых разделов (2026-10-13)
Старый production backend выдавал синтетический непустой приватный ключ reader при GET WireGuard с includePrivateKey=1/true. Baseline подтверждён actual compiled auth/mapper на собственной ограниченной PostgreSQL БД и локальном RouterOS HTTP fixture. Теперь явный запрос приватного ключа требует mm:network:write/admin, иначе403 до любых native requests. Обычный GET200 сохраняет public key и не содержит private key. is_admin без необходимого permission не заменяет право. Writer/admin сохраняют прежнее действие, legacy AUTH_REQUIRED=false не менялся.
WireGuard, IPsec, GRE, Firewall и Filters показывают режим просмотра и запрещают writer controls при read-only JWT. Использованы существующие readiness/mutation helpers; WireGuard toolbar/import/key-export/peer actions и callbacks дополнительно защищены. Backend RBAC остаётся авторитетной проверкой. Установленные ReUI primitives, vendor files и theme не менялись: добавлены operation-state props/copy.
11 fixed SQL cases: reader/writer/admin ×обычный GET/два private flags, is_admin alone, безJWT401; reader denied native request count0. Baseline/fixed/profile own DB/role/container удалены. WireGuard profile прошёл14.6s, включая56 node:test проверок; другие скрипты профиля не прибавляются к этому числу. Скопированный JSON label ошибочно называл traffic-rate, фактически runner запускал test:wireguard; label исправлен с сохранением originalReportedCommand. TypeScript/backend build/ESLint0errors,12 старых warnings Filters остаются.53 unique E2E:20 readonly PC/mobile +33 history/readiness/refresh. Два первоначальных GRE writer failures были некорректной fixture без обязательного ipsec:null; исправлены только данные теста,20 повторных cases прошли. Повторы не складываются.
Backend/frontend ux-native208 развёрнуты;470/527 source files и1044 compiled artifacts совпали, backend healthy. На каждом CHR через реальный admin API создан собственный WG-интерфейс с уникальным именем/свободным портом. Real reader обычный GET200 безключа, private flags403, admin получает ключ/public key сохранён. Private material вevidence не сохранялся.20 live UI5sections×reader/admin×1440/320 проверили создание/import/key-export controls, mutation requests0. Затем оба собственных интерфейса иPortal reader удалены; отсутствие интерфейсов проверено. Пароли и исходные native объекты не менялись. Это API privacy/UI proof, не WireGuard handshake/data-plane тест.
Протоколы: [baseline](ux-ui/acceptance/wireguard208-baseline-result.json), [fixed SQL11](ux-ui/acceptance/wireguard208-fixed-result.json), [profile](ux-ui/acceptance/native208-profile-result.json), [E2E53](ux-ui/acceptance/native208-e2e-2026-10-13.json), [live UI20](ux-ui/acceptance/native208-live-ui-2026-10-13.json), [native privacy/cleanup2](ux-ui/acceptance/wireguard208-native-live-2026-10-13.json), [compiled](ux-ui/acceptance/compiled208-result.json), [deployment](ux-ui/acceptance/native208-deployment-2026-10-13.json).
Следующий209: GRE mapper содержит ipsecSecret иipsec.secret, проверить оба публичных GET иограничить выдачу секретов reader, сохранив crypto-state/public metadata иwriter editing.12.5 открыта.
+15 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -3815,3 +3815,17 @@ Actual Portal reader настаром frontend ux-accessibility205 видел50
Production frontend ux-history207/source527 matched, backend ux-lock200/Portal/AUTH_REQUIRED сохранены.24 actual live UI6sections×reader/admin×1440/320 наpopulated historical metadata: readerbuttons disabled, adminenabled послеstable device read, informativecopy, nooverflow, Escape→trigger, mutationrequests0. Первыйadminrecursive check сделан доокончанияread ивиделcorrect temporarybusy; тестисправлен наожиданиеready, productguard неослаблялся. Own Portal users удалены204. Credentials/native configs не менялись.
Протоколы: [live baseline](ux-ui/acceptance/history207-baseline-live-2026-10-13.json), [E2E40](ux-ui/acceptance/history207-e2e-2026-10-13.json), [live24](ux-ui/acceptance/history207-live-2026-10-13.json), [deployment](ux-ui/acceptance/history207-deployment-2026-10-13.json). Следующий208: source GET WireGuard includePrivateKey флагне проверяетwrite permission; scoped nativekey privacy +read-only network workspaces.12.5 открыта.
## 12.5.208 — приватные ключи WireGuard и режим просмотра сетевых разделов (2026-10-13)
Старый production backend выдавал синтетический непустой приватный ключ reader при GET WireGuard с includePrivateKey=1/true. Baseline подтверждён actual compiled auth/mapper на собственной ограниченной PostgreSQL БД и локальном RouterOS HTTP fixture. Теперь явный запрос приватного ключа требует mm:network:write/admin, иначе403 до любых native requests. Обычный GET200 сохраняет public key и не содержит private key. is_admin без необходимого permission не заменяет право. Writer/admin сохраняют прежнее действие, legacy AUTH_REQUIRED=false не менялся.
WireGuard, IPsec, GRE, Firewall и Filters показывают режим просмотра и запрещают writer controls при read-only JWT. Использованы существующие readiness/mutation helpers; WireGuard toolbar/import/key-export/peer actions и callbacks дополнительно защищены. Backend RBAC остаётся авторитетной проверкой. Установленные ReUI primitives, vendor files и theme не менялись: добавлены operation-state props/copy.
11 fixed SQL cases: reader/writer/admin ×обычный GET/два private flags, is_admin alone, безJWT401; reader denied native request count0. Baseline/fixed/profile own DB/role/container удалены. WireGuard profile прошёл14.6s, включая56 node:test проверок; другие скрипты профиля не прибавляются к этому числу. Скопированный JSON label ошибочно называл traffic-rate, фактически runner запускал test:wireguard; label исправлен с сохранением originalReportedCommand. TypeScript/backend build/ESLint0errors,12 старых warnings Filters остаются.53 unique E2E:20 readonly PC/mobile +33 history/readiness/refresh. Два первоначальных GRE writer failures были некорректной fixture без обязательного ipsec:null; исправлены только данные теста,20 повторных cases прошли. Повторы не складываются.
Backend/frontend ux-native208 развёрнуты;470/527 source files и1044 compiled artifacts совпали, backend healthy. На каждом CHR через реальный admin API создан собственный WG-интерфейс с уникальным именем/свободным портом. Real reader обычный GET200 безключа, private flags403, admin получает ключ/public key сохранён. Private material вevidence не сохранялся.20 live UI5sections×reader/admin×1440/320 проверили создание/import/key-export controls, mutation requests0. Затем оба собственных интерфейса иPortal reader удалены; отсутствие интерфейсов проверено. Пароли и исходные native объекты не менялись. Это API privacy/UI proof, не WireGuard handshake/data-plane тест.
Протоколы: [baseline](ux-ui/acceptance/wireguard208-baseline-result.json), [fixed SQL11](ux-ui/acceptance/wireguard208-fixed-result.json), [profile](ux-ui/acceptance/native208-profile-result.json), [E2E53](ux-ui/acceptance/native208-e2e-2026-10-13.json), [live UI20](ux-ui/acceptance/native208-live-ui-2026-10-13.json), [native privacy/cleanup2](ux-ui/acceptance/wireguard208-native-live-2026-10-13.json), [compiled](ux-ui/acceptance/compiled208-result.json), [deployment](ux-ui/acceptance/native208-deployment-2026-10-13.json).
Следующий209: GRE mapper содержит ipsecSecret иipsec.secret, проверить оба публичных GET иограничить выдачу секретов reader, сохранив crypto-state/public metadata иwriter editing.12.5 открыта.
+16 -2
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-10
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -708,7 +708,7 @@ flowchart LR
## 12.5.77 — основной блок IPsec (2026-10-09)
Актуальное продолжение 2026-10-13:207 history restore rights всех6 caller: defaultdeny, reader/disabled/write guards,40 E2E и24 live UI passed; GRE reader50 enabled baseline закрыт. Frontend ux-history207/backend ux-lock200. Следующий208 — WireGuard includePrivateKey GET иread-only controls сетевыхworkspaces.12.5 открыта.
Актуальное продолжение 2026-10-13:208 закрывает WireGuard private-key GET дляreader иread-only операции пятисетевыхразделов; baseline/fixed SQL11, WireGuard profile56,53 unique E2E,20 live UI и2 own native интерфейса passed/cleaned. Backend/frontend ux-native208, source470/527 иcompiled1044 matched. Следующий209 — секреты GRE вGET /gre/tunnels и/filters/gre-tunnels.12.5 открыта.
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
@@ -2241,3 +2241,17 @@ Actual Portal reader настаром frontend ux-accessibility205 видел50
Production frontend ux-history207/source527 matched, backend ux-lock200/Portal/AUTH_REQUIRED сохранены.24 actual live UI6sections×reader/admin×1440/320 наpopulated historical metadata: readerbuttons disabled, adminenabled послеstable device read, informativecopy, nooverflow, Escape→trigger, mutationrequests0. Первыйadminrecursive check сделан доокончанияread ивиделcorrect temporarybusy; тестисправлен наожиданиеready, productguard неослаблялся. Own Portal users удалены204. Credentials/native configs не менялись.
Протоколы: [live baseline](ux-ui/acceptance/history207-baseline-live-2026-10-13.json), [E2E40](ux-ui/acceptance/history207-e2e-2026-10-13.json), [live24](ux-ui/acceptance/history207-live-2026-10-13.json), [deployment](ux-ui/acceptance/history207-deployment-2026-10-13.json). Следующий208: source GET WireGuard includePrivateKey флагне проверяетwrite permission; scoped nativekey privacy +read-only network workspaces.12.5 открыта.
## 12.5.208 — приватные ключи WireGuard и режим просмотра сетевых разделов (2026-10-13)
Старый production backend выдавал синтетический непустой приватный ключ reader при GET WireGuard с includePrivateKey=1/true. Baseline подтверждён actual compiled auth/mapper на собственной ограниченной PostgreSQL БД и локальном RouterOS HTTP fixture. Теперь явный запрос приватного ключа требует mm:network:write/admin, иначе403 до любых native requests. Обычный GET200 сохраняет public key и не содержит private key. is_admin без необходимого permission не заменяет право. Writer/admin сохраняют прежнее действие, legacy AUTH_REQUIRED=false не менялся.
WireGuard, IPsec, GRE, Firewall и Filters показывают режим просмотра и запрещают writer controls при read-only JWT. Использованы существующие readiness/mutation helpers; WireGuard toolbar/import/key-export/peer actions и callbacks дополнительно защищены. Backend RBAC остаётся авторитетной проверкой. Установленные ReUI primitives, vendor files и theme не менялись: добавлены operation-state props/copy.
11 fixed SQL cases: reader/writer/admin ×обычный GET/два private flags, is_admin alone, безJWT401; reader denied native request count0. Baseline/fixed/profile own DB/role/container удалены. WireGuard profile прошёл14.6s, включая56 node:test проверок; другие скрипты профиля не прибавляются к этому числу. Скопированный JSON label ошибочно называл traffic-rate, фактически runner запускал test:wireguard; label исправлен с сохранением originalReportedCommand. TypeScript/backend build/ESLint0errors,12 старых warnings Filters остаются.53 unique E2E:20 readonly PC/mobile +33 history/readiness/refresh. Два первоначальных GRE writer failures были некорректной fixture без обязательного ipsec:null; исправлены только данные теста,20 повторных cases прошли. Повторы не складываются.
Backend/frontend ux-native208 развёрнуты;470/527 source files и1044 compiled artifacts совпали, backend healthy. На каждом CHR через реальный admin API создан собственный WG-интерфейс с уникальным именем/свободным портом. Real reader обычный GET200 безключа, private flags403, admin получает ключ/public key сохранён. Private material вevidence не сохранялся.20 live UI5sections×reader/admin×1440/320 проверили создание/import/key-export controls, mutation requests0. Затем оба собственных интерфейса иPortal reader удалены; отсутствие интерфейсов проверено. Пароли и исходные native объекты не менялись. Это API privacy/UI proof, не WireGuard handshake/data-plane тест.
Протоколы: [baseline](ux-ui/acceptance/wireguard208-baseline-result.json), [fixed SQL11](ux-ui/acceptance/wireguard208-fixed-result.json), [profile](ux-ui/acceptance/native208-profile-result.json), [E2E53](ux-ui/acceptance/native208-e2e-2026-10-13.json), [live UI20](ux-ui/acceptance/native208-live-ui-2026-10-13.json), [native privacy/cleanup2](ux-ui/acceptance/wireguard208-native-live-2026-10-13.json), [compiled](ux-ui/acceptance/compiled208-result.json), [deployment](ux-ui/acceptance/native208-deployment-2026-10-13.json).
Следующий209: GRE mapper содержит ipsecSecret иipsec.secret, проверить оба публичных GET иограничить выдачу секретов reader, сохранив crypto-state/public metadata иwriter editing.12.5 открыта.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,15 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"backendSourceFilesMatched": 470,
"frontendSourceFilesMatched": 527,
"compiledMatched": 1044,
"backendImage": "mmapp-test/backend:ux-native208",
"backendImageId": "sha256:46923e412d3e7c89f79a4c7757a64d8226029988ce4e865398ad224c6fb2b2e7",
"frontendImage": "mmapp-test/frontend:ux-native208",
"frontendImageId": "sha256:5672a5501fb316b5d8885854328607efa6d58ae60804d6b22adab0516b8e0ee56",
"backendHealthy": true,
"ownDatabasesRolesContainersRemoved": 3,
"ownedNativeInterfacesCreatedAndRemoved": 2,
"chrPasswordsChanged": false
}
@@ -0,0 +1,18 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"uniqueCases": 53,
"finalReadonly": {
"startTime": "2026-10-13T12:58:59.011Z",
"duration": 27098.076,
"expected": 20,
"skipped": 0,
"unexpected": 0,
"flaky": 0
},
"unchangedRegressionPassed": 33,
"initialFailedReadonlyFixture": 2,
"initialFailureReason": "GRE fixture omitted required ipsec:null; corrected fixture, writer role UI enabled",
"allUniquePassed": true,
"scope": "20 reader/writer PC/mobile workspaces +33 history/readiness/refresh regressions; no real native mutation"
}
@@ -0,0 +1,175 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"runtime": "ux-native208",
"cases": [
{
"section": "wireguard",
"role": "reader",
"width": 1440,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "ipsec",
"role": "reader",
"width": 1440,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "gre",
"role": "reader",
"width": 1440,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "firewall",
"role": "reader",
"width": 1440,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "filters",
"role": "reader",
"width": 1440,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "wireguard",
"role": "admin",
"width": 1440,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "ipsec",
"role": "admin",
"width": 1440,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "gre",
"role": "admin",
"width": 1440,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "firewall",
"role": "admin",
"width": 1440,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "filters",
"role": "admin",
"width": 1440,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "wireguard",
"role": "reader",
"width": 320,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "ipsec",
"role": "reader",
"width": 320,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "gre",
"role": "reader",
"width": 320,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "firewall",
"role": "reader",
"width": 320,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "filters",
"role": "reader",
"width": 320,
"writeControlAllowed": false,
"actualNativeList": true,
"applied": false
},
{
"section": "wireguard",
"role": "admin",
"width": 320,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "ipsec",
"role": "admin",
"width": 320,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "gre",
"role": "admin",
"width": 320,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "firewall",
"role": "admin",
"width": 320,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
},
{
"section": "filters",
"role": "admin",
"width": 320,
"writeControlAllowed": true,
"actualNativeList": true,
"applied": false
}
],
"realPortalJWT": true,
"apiMocks": false,
"mutationRequests": 0,
"pageErrors": 0,
"ownWireguardInterfacesPresent": true,
"scope": "Default create/import/key-export controls on actual data; no operations applied from UI",
"ownWireguardInterfacesRemoved": true,
"ownPortalUserRemoved": true
}
@@ -0,0 +1,18 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"database": "mm_accept_166_1791896427599",
"scope": "ephemeral role and precreated owned database; no copied production credentials",
"tests": [
{
"command": "npm --prefix backend run test:wireguard",
"passed": true,
"durationMs": 14595,
"externalNativeDevices": false,
"originalReportedCommand": "npm --prefix backend run test:traffic-rate",
"labelCorrection": "Runner executed test:wireguard; copied reporting label incorrectly named traffic-rate. Actual profile stdout assertion verified."
}
],
"scopedRoleVerified": true,
"passed": true
}
@@ -0,0 +1,82 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"database": "mm_accept_166_1791895670647",
"baseline": true,
"cases": [
{
"role": "reader",
"flag": "",
"status": 200,
"privateKeyExposed": false,
"nativeRequestCount": 4
},
{
"role": "reader",
"flag": "?includePrivateKey=1",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "reader",
"flag": "?includePrivateKey=true",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "writer",
"flag": "",
"status": 200,
"privateKeyExposed": false,
"nativeRequestCount": 4
},
{
"role": "writer",
"flag": "?includePrivateKey=1",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "writer",
"flag": "?includePrivateKey=true",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "admin",
"flag": "",
"status": 200,
"privateKeyExposed": false,
"nativeRequestCount": 4
},
{
"role": "admin",
"flag": "?includePrivateKey=1",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "admin",
"flag": "?includePrivateKey=true",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"name": "is_admin alone",
"status": 200,
"permissionRequired": true
},
{
"role": "unauthenticated",
"status": 401
}
],
"scope": "Production compiled WireGuard GET/auth/mapper, own restricted PostgreSQL and local RouterOS HTTP fixture with nonempty synthetic private key; isolated signed JWT",
"passed": true
}
@@ -0,0 +1,82 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"database": "mm_accept_166_1791896339709",
"baseline": false,
"cases": [
{
"role": "reader",
"flag": "",
"status": 200,
"privateKeyExposed": false,
"nativeRequestCount": 4
},
{
"role": "reader",
"flag": "?includePrivateKey=1",
"status": 403,
"privateKeyExposed": false,
"nativeRequestCount": 0
},
{
"role": "reader",
"flag": "?includePrivateKey=true",
"status": 403,
"privateKeyExposed": false,
"nativeRequestCount": 0
},
{
"role": "writer",
"flag": "",
"status": 200,
"privateKeyExposed": false,
"nativeRequestCount": 4
},
{
"role": "writer",
"flag": "?includePrivateKey=1",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "writer",
"flag": "?includePrivateKey=true",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "admin",
"flag": "",
"status": 200,
"privateKeyExposed": false,
"nativeRequestCount": 4
},
{
"role": "admin",
"flag": "?includePrivateKey=1",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"role": "admin",
"flag": "?includePrivateKey=true",
"status": 200,
"privateKeyExposed": true,
"nativeRequestCount": 4
},
{
"name": "is_admin alone",
"status": 403,
"permissionRequired": true
},
{
"role": "unauthenticated",
"status": 401
}
],
"scope": "Production compiled WireGuard GET/auth/mapper, own restricted PostgreSQL and local RouterOS HTTP fixture with nonempty synthetic private key; isolated signed JWT",
"passed": true
}
@@ -0,0 +1,42 @@
{
"date": "2026-10-13",
"block": "12.5.208",
"runtimeBackend": "ux-native208",
"actualPortalJWT": true,
"cases": [
{
"host": "194.226.121.150",
"serverId": 1,
"ownedInterfaceCreated": true,
"createStatus": 201,
"readerPublicList": 200,
"readerPrivateFlags": [
403,
403
],
"readerPrivateKeyAbsent": true,
"adminPrivateKeyAvailable": true,
"publicKeyPreserved": true,
"dataPlaneTest": false
},
{
"host": "104.165.244.7",
"serverId": 2,
"ownedInterfaceCreated": true,
"createStatus": 201,
"readerPublicList": 200,
"readerPrivateFlags": [
403,
403
],
"readerPrivateKeyAbsent": true,
"adminPrivateKeyAvailable": true,
"publicKeyPreserved": true,
"dataPlaneTest": false
}
],
"privateMaterialPublished": false,
"cleanupCompleted": true,
"scope": "Own WireGuard interface on each CHR; private/public API policy, not handshake or encrypted data-plane test",
"ownPortalUserRemoved": true
}