From 7a58f472b31827704d30a7518e91b57774c4edce Mon Sep 17 00:00:00 2001 From: Denozordec Date: Tue, 13 Oct 2026 16:32:58 +0700 Subject: [PATCH] =?UTF-8?q?chore(tests):=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B4=D0=B8=D1=82=D1=8C=20=D0=BC=D0=B0=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=B5=D0=BA=D1=80=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B8=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acceptance/integration-secrets-sql.mjs | 22 ++++++ docs/ux-ui-external-acceptance.md | 12 ++- docs/ux-ui-plan.md | 6 +- docs/ux-ui-progress.md | 10 ++- docs/ux-ui-remaining-acceptance.md | 14 +++- docs/ux-ui-stage-12.md | 10 ++- docs/ux-ui-test-server.md | 12 ++- .../acceptance/secret203-sql-2026-10-13.json | 75 +++++++++++++++++++ 8 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 backend/scripts/acceptance/integration-secrets-sql.mjs create mode 100644 docs/ux-ui/acceptance/secret203-sql-2026-10-13.json diff --git a/backend/scripts/acceptance/integration-secrets-sql.mjs b/backend/scripts/acceptance/integration-secrets-sql.mjs new file mode 100644 index 00000000..8f1f2d87 --- /dev/null +++ b/backend/scripts/acceptance/integration-secrets-sql.mjs @@ -0,0 +1,22 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import {randomBytes} from 'node:crypto' +const database=process.env.MMAPP_OWN_SQL_DB,url=new URL(process.env.DATABASE_URL) +assert(/^mm_accept_166_\d+$/.test(database??''));assert.equal(url.pathname,'/'+database);assert.equal(url.username,database) +process.env.AUTH_REQUIRED='true';process.env.AUTH_JWT_SECRET=randomBytes(32).toString('hex');process.env.AUTH_ISSUER='https://own203.invalid';process.env.AUTH_PORTAL_URL='https://own203.invalid' +const {pool,closePool}=await import('/app/backend/dist/db/index.js'),{initDatabase}=await import('/app/backend/dist/db/bootstrap.js'),{buildApp}=await import('/app/backend/dist/index.js') +assert.equal((await pool.query('SELECT current_database() AS name')).rows[0].name,database);assert(Object.values((await pool.query('SELECT rolsuper,rolcreatedb,rolcreaterole,rolbypassrls FROM pg_roles WHERE rolname=current_user')).rows[0]).every(v=>v===false)) +const secrets={s3:'own203-'+randomBytes(16).toString('hex'),evo:'own203-'+randomBytes(16).toString('hex'),telegram:'12345:'+randomBytes(24).toString('base64url')},cases=[];let app,requests=0;const originalFetch=globalThis.fetch;globalThis.fetch=async()=>{requests++;throw Error('External fetch forbidden in owned secret DTO test')} +const report={date:'2026-10-13',block:'12.5.203',database,scope:'Actual compiled buildApp/auth/GET handlers and own restricted PostgreSQL with nonempty synthetic credentials; isolated signed test JWT, not real Portal login',cases,passed:false} +try{ + await initDatabase() + await pool.query("INSERT INTO backup_storage_settings(id,provider,s3_endpoint,s3_access_key_id,s3_secret_access_key) VALUES(1,'local','https://s3.own.invalid','OWN203_PUBLIC_ACCESS_ID',$1) ON CONFLICT(id) DO UPDATE SET s3_secret_access_key=$1",[secrets.s3]) + await pool.query("INSERT INTO evobgp_settings(id,base_url,api_key,enabled) VALUES(1,'https://evo.own.invalid',$1,false) ON CONFLICT(id) DO UPDATE SET api_key=$1",[secrets.evo]) + await pool.query("INSERT INTO alert_telegram_settings(id,bot_token,chat_id) VALUES(1,$1,'0') ON CONFLICT(id) DO UPDATE SET bot_token=$1",[secrets.telegram]) + app=await buildApp({logger:false,startScheduler:false});await app.ready() + for(const role of ['reader','admin']){const permissions=['mm:backups:read','mm:alerts:read',...(role==='admin'?['mm:settings:admin']:[])];const jwt=app.jwt.sign({sub:'own203-'+role,apps:['mm'],permissions,iss:process.env.AUTH_ISSUER},{expiresIn:'5m'});for(const path of ['/api/backups/storage','/api/evobgp/settings','/api/alerts']){const r=await app.inject({method:'GET',url:path,headers:{authorization:'Bearer '+jwt}});assert.equal(r.statusCode,role==='reader'&&path.includes('evobgp')?403:200);for(const secret of Object.values(secrets))assert(!r.body.includes(secret));if(r.statusCode===200){const dto=r.json();if(path.includes('storage')||path.includes('evobgp'))assert.equal(dto.secretConfigured,true);else assert.equal(dto.telegram.tokenConfigured,true)}cases.push({role,path,status:r.statusCode,syntheticSecretExposed:false,configuredFlag:r.statusCode===200});}} + for(const path of ['/api/backups/storage','/api/evobgp/settings','/api/alerts']){assert.equal((await app.inject({method:'GET',url:path})).statusCode,401);cases.push({role:'unauthenticated',path,status:401})} + assert.equal((await pool.query('SELECT s3_secret_access_key FROM backup_storage_settings WHERE id=1')).rows[0].s3_secret_access_key,secrets.s3);assert.equal((await pool.query('SELECT api_key FROM evobgp_settings WHERE id=1')).rows[0].api_key,secrets.evo);assert.equal((await pool.query('SELECT bot_token FROM alert_telegram_settings WHERE id=1')).rows[0].bot_token,secrets.telegram);assert.equal(requests,0);report.externalRequests=0;report.storedSyntheticSecretsUnchanged=true;report.passed=true +}catch(e){report.errorName=e.name;fs.writeFileSync('/app/backend/acceptance/secret203-private.log',String(e.stack??e),{mode:0o600})} +finally{globalThis.fetch=originalFetch;if(app)await app.close();await closePool();fs.writeFileSync('/app/backend/acceptance/secret203-result.json',JSON.stringify(report,null,2));console.log(JSON.stringify(report))} +if(!report.passed)process.exitCode=1 diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index c73f485a..0ad1926e 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:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.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:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -2464,3 +2464,11 @@ Own DB/role/container и Portal reader user удалены, отдельный p Telegram в рабочем приложении действительно настроен и доставлял сообщения201: reader alerts DTO не содержит raw bot token. S3/EvoBGP secrets в текущем стенде не заполнены; их маскирование populated credentials не объявляется доказанным данным read-only прогоном. Source audit подтвердил DTO secretConfigured уbackup/EvoBGP, GeoIP только metadata, speedProbeRead безpassword. App config/credentials не менялись, native commands не запрашивались. Собственный reader удалён204. Вспомогательный драйвер сначала ошибся на JSON parsing пустого204cleanup; исправлен на nullable response body, actual removal уже произошёл; финальный прогон successful/cleaned. Протокол: [actual reader API](ux-ui/acceptance/reader202-live-api-2026-10-13.json). Это scoped DTO audit10 endpoints, не аудит binary backup/cert export или произвольных embedded credentials в errors. Следующий203: собственная ограниченная PostgreSQL DB с синтетическими заполненными S3/EvoBGP/Telegram secrets, actual compiled handlers/JWT, без send/network probe.12.5 открыта. + +## 12.5.203 — маскирование заполненных секретов интеграций (2026-10-13) + +Actual compiled buildApp/auth/GET handlers ux-lock200 проверены на собственной ограниченной PostgreSQL роли/БД с непустыми синтетическими S3 secret access key, EvoBGP API key и Telegram bot token. JWT подписаны штатным Fastify тестовым RAM-secret/issuer: это изолированные test JWT, не real Portal login (реальный reader был проверен202). startScheduler=false, global fetch запрещён и считает обращения. + +9 проверок reader/admin/noJWT ×backup storage/EvoBGP settings/alerts: разрешённые DTO200 содержат secretConfigured/tokenConfigured=true, но не сохранённые секреты. Reader EvoBGP403, безJWT401. Хранимые значения всех3 секретов неизменны, externalRequests0. S3 provider local/EvoBGP disabled, реальных probe/send/job не выполнялось. Own DB/role/container удалены. Первый драйвер попытался импортировать dev-only jose из production image и не запустил cases; исправлен на штатный app.jwt.sign, никакой зависимости/продуктового кода не добавлялось. Оба временных окружения очищены. PostgreSQL выдал warning о concurrent query наclient в существующем repeatable-read alerts overview; это совместимо с текущим pg8, не объявлено pg9 acceptance. + +Протокол: [owned SQL masks9](ux-ui/acceptance/secret203-sql-2026-10-13.json). Это scoped DTO proof, не S3 connectivity, EvoBGP execution, Telegram transport (принят201) или аудит всехexport/error text. Runtime не менялся. Следующий204: actual Portal reader/admin navigation основных разделов ПК/телефон после auth199, GET/overflow/page errors и отсутствие mutation requests.12.5 открыта. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 01e8b42d..f61bc736 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-13:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-13. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-13 -Актуальное продолжение 2026-10-13:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.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:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 4cac06fa..d53ae8e6 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-13:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,14 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–196 и ограничения ниже. Runtime backend/frontend ux-peak196. | +## 12.5.203 — маскирование заполненных секретов интеграций (2026-10-13) + +Actual compiled buildApp/auth/GET handlers ux-lock200 проверены на собственной ограниченной PostgreSQL роли/БД с непустыми синтетическими S3 secret access key, EvoBGP API key и Telegram bot token. JWT подписаны штатным Fastify тестовым RAM-secret/issuer: это изолированные test JWT, не real Portal login (реальный reader был проверен202). startScheduler=false, global fetch запрещён и считает обращения. + +9 проверок reader/admin/noJWT ×backup storage/EvoBGP settings/alerts: разрешённые DTO200 содержат secretConfigured/tokenConfigured=true, но не сохранённые секреты. Reader EvoBGP403, безJWT401. Хранимые значения всех3 секретов неизменны, externalRequests0. S3 provider local/EvoBGP disabled, реальных probe/send/job не выполнялось. Own DB/role/container удалены. Первый драйвер попытался импортировать dev-only jose из production image и не запустил cases; исправлен на штатный app.jwt.sign, никакой зависимости/продуктового кода не добавлялось. Оба временных окружения очищены. PostgreSQL выдал warning о concurrent query наclient в существующем repeatable-read alerts overview; это совместимо с текущим pg8, не объявлено pg9 acceptance. + +Протокол: [owned SQL masks9](ux-ui/acceptance/secret203-sql-2026-10-13.json). Это scoped DTO proof, не S3 connectivity, EvoBGP execution, Telegram transport (принят201) или аудит всехexport/error text. Runtime не менялся. Следующий204: actual Portal reader/admin navigation основных разделов ПК/телефон после auth199, GET/overflow/page errors и отсутствие mutation requests.12.5 открыта. + ## 12.5.202 — чтение административных интеграций без раскрытия секретов (2026-10-13) На actual deployed ux-lock200 создан собственный Portal reader с mm:servers/alerts/backups/uptime/traffic:read, без writer/admin.10 real GET endpoints: servers, alerts, outbox, backup storage, uptime settings/speed probes, traffic flow settings, GeoIP200; EvoBGP settings/scheduler403. Для тех же10 endpoints безJWT401. Дополнительно server details200 с password пустым. Recursive response check не нашёл непустых password/botToken/token/apiKey/secretAccessKey/privateKey/licenseKey и известных CHR/bot test secrets. Значения credentials в evidence не сохранены. diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 9b496137..a3cf4a3b 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:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. -Это актуальная матрица после 12.5.202. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.203. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-lock200`, frontend `ux-portal199`; 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. **203 — populated secret DTOs:** собственная DB, синтетические S3/EvoBGP/Telegram credentials, real compiled handlers/JWT; без внешних probe/send или изменений рабочих credentials. +1. **204 — live section navigation:** actual Portal reader/admin, ПК/телефон; scoped check общего auth возврата, API GET, errors/overflow, без mutations. 2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания. 3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций. @@ -1380,3 +1380,11 @@ Own DB/role/container и Portal reader user удалены, отдельный p Telegram в рабочем приложении действительно настроен и доставлял сообщения201: reader alerts DTO не содержит raw bot token. S3/EvoBGP secrets в текущем стенде не заполнены; их маскирование populated credentials не объявляется доказанным данным read-only прогоном. Source audit подтвердил DTO secretConfigured уbackup/EvoBGP, GeoIP только metadata, speedProbeRead безpassword. App config/credentials не менялись, native commands не запрашивались. Собственный reader удалён204. Вспомогательный драйвер сначала ошибся на JSON parsing пустого204cleanup; исправлен на nullable response body, actual removal уже произошёл; финальный прогон successful/cleaned. Протокол: [actual reader API](ux-ui/acceptance/reader202-live-api-2026-10-13.json). Это scoped DTO audit10 endpoints, не аудит binary backup/cert export или произвольных embedded credentials в errors. Следующий203: собственная ограниченная PostgreSQL DB с синтетическими заполненными S3/EvoBGP/Telegram secrets, actual compiled handlers/JWT, без send/network probe.12.5 открыта. + +## 12.5.203 — маскирование заполненных секретов интеграций (2026-10-13) + +Actual compiled buildApp/auth/GET handlers ux-lock200 проверены на собственной ограниченной PostgreSQL роли/БД с непустыми синтетическими S3 secret access key, EvoBGP API key и Telegram bot token. JWT подписаны штатным Fastify тестовым RAM-secret/issuer: это изолированные test JWT, не real Portal login (реальный reader был проверен202). startScheduler=false, global fetch запрещён и считает обращения. + +9 проверок reader/admin/noJWT ×backup storage/EvoBGP settings/alerts: разрешённые DTO200 содержат secretConfigured/tokenConfigured=true, но не сохранённые секреты. Reader EvoBGP403, безJWT401. Хранимые значения всех3 секретов неизменны, externalRequests0. S3 provider local/EvoBGP disabled, реальных probe/send/job не выполнялось. Own DB/role/container удалены. Первый драйвер попытался импортировать dev-only jose из production image и не запустил cases; исправлен на штатный app.jwt.sign, никакой зависимости/продуктового кода не добавлялось. Оба временных окружения очищены. PostgreSQL выдал warning о concurrent query наclient в существующем repeatable-read alerts overview; это совместимо с текущим pg8, не объявлено pg9 acceptance. + +Протокол: [owned SQL masks9](ux-ui/acceptance/secret203-sql-2026-10-13.json). Это scoped DTO proof, не S3 connectivity, EvoBGP execution, Telegram transport (принят201) или аудит всехexport/error text. Runtime не менялся. Следующий204: actual Portal reader/admin navigation основных разделов ПК/телефон после auth199, GET/overflow/page errors и отсутствие mutation requests.12.5 открыта. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index bf298922..e0309edf 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:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -3769,3 +3769,11 @@ Own DB/role/container и Portal reader user удалены, отдельный p Telegram в рабочем приложении действительно настроен и доставлял сообщения201: reader alerts DTO не содержит raw bot token. S3/EvoBGP secrets в текущем стенде не заполнены; их маскирование populated credentials не объявляется доказанным данным read-only прогоном. Source audit подтвердил DTO secretConfigured уbackup/EvoBGP, GeoIP только metadata, speedProbeRead безpassword. App config/credentials не менялись, native commands не запрашивались. Собственный reader удалён204. Вспомогательный драйвер сначала ошибся на JSON parsing пустого204cleanup; исправлен на nullable response body, actual removal уже произошёл; финальный прогон successful/cleaned. Протокол: [actual reader API](ux-ui/acceptance/reader202-live-api-2026-10-13.json). Это scoped DTO audit10 endpoints, не аудит binary backup/cert export или произвольных embedded credentials в errors. Следующий203: собственная ограниченная PostgreSQL DB с синтетическими заполненными S3/EvoBGP/Telegram secrets, actual compiled handlers/JWT, без send/network probe.12.5 открыта. + +## 12.5.203 — маскирование заполненных секретов интеграций (2026-10-13) + +Actual compiled buildApp/auth/GET handlers ux-lock200 проверены на собственной ограниченной PostgreSQL роли/БД с непустыми синтетическими S3 secret access key, EvoBGP API key и Telegram bot token. JWT подписаны штатным Fastify тестовым RAM-secret/issuer: это изолированные test JWT, не real Portal login (реальный reader был проверен202). startScheduler=false, global fetch запрещён и считает обращения. + +9 проверок reader/admin/noJWT ×backup storage/EvoBGP settings/alerts: разрешённые DTO200 содержат secretConfigured/tokenConfigured=true, но не сохранённые секреты. Reader EvoBGP403, безJWT401. Хранимые значения всех3 секретов неизменны, externalRequests0. S3 provider local/EvoBGP disabled, реальных probe/send/job не выполнялось. Own DB/role/container удалены. Первый драйвер попытался импортировать dev-only jose из production image и не запустил cases; исправлен на штатный app.jwt.sign, никакой зависимости/продуктового кода не добавлялось. Оба временных окружения очищены. PostgreSQL выдал warning о concurrent query наclient в существующем repeatable-read alerts overview; это совместимо с текущим pg8, не объявлено pg9 acceptance. + +Протокол: [owned SQL masks9](ux-ui/acceptance/secret203-sql-2026-10-13.json). Это scoped DTO proof, не S3 connectivity, EvoBGP execution, Telegram transport (принят201) или аудит всехexport/error text. Runtime не менялся. Следующий204: actual Portal reader/admin navigation основных разделов ПК/телефон после auth199, GET/overflow/page errors и отсутствие mutation requests.12.5 открыта. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index b97ff190..f7d163c0 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:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. | Параметр | Проверенное состояние | | --- | --- | @@ -708,7 +708,7 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13:202 reader actual Portal JWT audit10 GET endpoints +server detail passed, secrets absent, admin-only403/noJWT401; fixture удалена.201 цельный Telegram live/human receipt принят;200 collector crash/observed lock-loss fixed/deployed. Runtime backend ux-lock200/frontend ux-portal199. Следующий203 — заполненные S3/EvoBGP/Telegram secrets в own SQL, не рабочие credentials.12.5 открыта. +Актуальное продолжение 2026-10-13:203 populated secret DTO tests9 passed (reader/admin/noJWT) на actual compiled backend/own PG, nonempty synthetic S3/EvoBGP/Telegram secrets скрыты, flags true, stored values unchanged, external fetch0. Backend ux-lock200/frontend ux-portal199. Следующий204 — scoped live PC/mobile section navigation reader/admin после общих auth changes.12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -2195,3 +2195,11 @@ Own DB/role/container и Portal reader user удалены, отдельный p Telegram в рабочем приложении действительно настроен и доставлял сообщения201: reader alerts DTO не содержит raw bot token. S3/EvoBGP secrets в текущем стенде не заполнены; их маскирование populated credentials не объявляется доказанным данным read-only прогоном. Source audit подтвердил DTO secretConfigured уbackup/EvoBGP, GeoIP только metadata, speedProbeRead безpassword. App config/credentials не менялись, native commands не запрашивались. Собственный reader удалён204. Вспомогательный драйвер сначала ошибся на JSON parsing пустого204cleanup; исправлен на nullable response body, actual removal уже произошёл; финальный прогон successful/cleaned. Протокол: [actual reader API](ux-ui/acceptance/reader202-live-api-2026-10-13.json). Это scoped DTO audit10 endpoints, не аудит binary backup/cert export или произвольных embedded credentials в errors. Следующий203: собственная ограниченная PostgreSQL DB с синтетическими заполненными S3/EvoBGP/Telegram secrets, actual compiled handlers/JWT, без send/network probe.12.5 открыта. + +## 12.5.203 — маскирование заполненных секретов интеграций (2026-10-13) + +Actual compiled buildApp/auth/GET handlers ux-lock200 проверены на собственной ограниченной PostgreSQL роли/БД с непустыми синтетическими S3 secret access key, EvoBGP API key и Telegram bot token. JWT подписаны штатным Fastify тестовым RAM-secret/issuer: это изолированные test JWT, не real Portal login (реальный reader был проверен202). startScheduler=false, global fetch запрещён и считает обращения. + +9 проверок reader/admin/noJWT ×backup storage/EvoBGP settings/alerts: разрешённые DTO200 содержат secretConfigured/tokenConfigured=true, но не сохранённые секреты. Reader EvoBGP403, безJWT401. Хранимые значения всех3 секретов неизменны, externalRequests0. S3 provider local/EvoBGP disabled, реальных probe/send/job не выполнялось. Own DB/role/container удалены. Первый драйвер попытался импортировать dev-only jose из production image и не запустил cases; исправлен на штатный app.jwt.sign, никакой зависимости/продуктового кода не добавлялось. Оба временных окружения очищены. PostgreSQL выдал warning о concurrent query наclient в существующем repeatable-read alerts overview; это совместимо с текущим pg8, не объявлено pg9 acceptance. + +Протокол: [owned SQL masks9](ux-ui/acceptance/secret203-sql-2026-10-13.json). Это scoped DTO proof, не S3 connectivity, EvoBGP execution, Telegram transport (принят201) или аудит всехexport/error text. Runtime не менялся. Следующий204: actual Portal reader/admin navigation основных разделов ПК/телефон после auth199, GET/overflow/page errors и отсутствие mutation requests.12.5 открыта. diff --git a/docs/ux-ui/acceptance/secret203-sql-2026-10-13.json b/docs/ux-ui/acceptance/secret203-sql-2026-10-13.json new file mode 100644 index 00000000..2767a6d6 --- /dev/null +++ b/docs/ux-ui/acceptance/secret203-sql-2026-10-13.json @@ -0,0 +1,75 @@ +{ + "date": "2026-10-13", + "block": "12.5.203", + "database": "mm_accept_166_1791883862303", + "scope": "Actual compiled buildApp/auth/GET handlers and own restricted PostgreSQL with nonempty synthetic credentials; isolated signed test JWT, not real Portal login", + "cases": [ + { + "role": "reader", + "path": "/api/backups/storage", + "status": 200, + "syntheticSecretExposed": false, + "configuredFlag": true + }, + { + "role": "reader", + "path": "/api/evobgp/settings", + "status": 403, + "syntheticSecretExposed": false, + "configuredFlag": false + }, + { + "role": "reader", + "path": "/api/alerts", + "status": 200, + "syntheticSecretExposed": false, + "configuredFlag": true + }, + { + "role": "admin", + "path": "/api/backups/storage", + "status": 200, + "syntheticSecretExposed": false, + "configuredFlag": true + }, + { + "role": "admin", + "path": "/api/evobgp/settings", + "status": 200, + "syntheticSecretExposed": false, + "configuredFlag": true + }, + { + "role": "admin", + "path": "/api/alerts", + "status": 200, + "syntheticSecretExposed": false, + "configuredFlag": true + }, + { + "role": "unauthenticated", + "path": "/api/backups/storage", + "status": 401 + }, + { + "role": "unauthenticated", + "path": "/api/evobgp/settings", + "status": 401 + }, + { + "role": "unauthenticated", + "path": "/api/alerts", + "status": 401 + } + ], + "passed": true, + "externalRequests": 0, + "storedSyntheticSecretsUnchanged": true, + "cleanup": { + "ownedDatabaseRoleContainerRemoved": true + }, + "bounds": [ + "No S3/EvoBGP connection or Telegram send tested", + "Known DTO fields only; binary backups/exports and arbitrary embedded error credentials not audited" + ] +}