diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index e670f45..ccc2174 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -53,6 +53,8 @@ var templateFuncs = template.FuncMap{ "quikCodeMap": quikClientCodeMapText, "curUser": authTemplateFuncs["curUser"], "can": authTemplateFuncs["can"], + "devOn": authTemplateFuncs["devOn"], + "devLicensed": authTemplateFuncs["devLicensed"], "authOpen": authOpen, "roleTitle": roleTitle, "stageCls": func(r depoQueueRow) string { c, _ := r.StageRu(); return c }, diff --git a/internal/lkgateway/auth.go b/internal/lkgateway/auth.go index 3b2bf07..e6ab9bb 100644 --- a/internal/lkgateway/auth.go +++ b/internal/lkgateway/auth.go @@ -1272,15 +1272,18 @@ func registerUsersSetup(mux *http.ServeMux, h *setupHandlers) { mux.HandleFunc("/admin/setup/auth", h.saveAuth) mux.HandleFunc("/admin/setup/auth/test", h.testAD) mux.HandleFunc("/admin/setup/auth/recheck", h.recheckAD) + mux.HandleFunc("/admin/dev-toggle", devToggle) // личный выключатель режима разработки } // ---------- функции шаблонов ---------- // authTemplateFuncs — заглушки, переопределяются в render на текущего пользователя. var authTemplateFuncs = template.FuncMap{ - "curUser": func() *User { return nil }, - "can": func(perm string) bool { return true }, - "authOpen": authOpen, + "curUser": func() *User { return nil }, + "can": func(perm string) bool { return true }, + "authOpen": authOpen, + "devOn": func() bool { return devMode(globalRC) }, // режим действует для текущего пользователя + "devLicensed": func() bool { return devMode(globalRC) }, // режим разрешён лицензией (для баннера) } // renderFor — выполняет layout с функциями, привязанными к текущему пользователю. @@ -1290,11 +1293,14 @@ func renderFor(w http.ResponseWriter, t *template.Template, data any) error { if err != nil { return t.ExecuteTemplate(w, "layout", data) } + on := devOnFor(u) t2.Funcs(template.FuncMap{ - "curUser": func() *User { return u }, + "curUser": func() *User { return u }, + "devOn": func() bool { return on }, + "devLicensed": func() bool { return devMode(globalRC) }, "can": func(perm string) bool { if perm == "dev" { - return devMode(globalRC) && (authOpen() || u.Can("settings")) + return on && (authOpen() || u.Can("settings")) } if authOpen() { return true diff --git a/internal/lkgateway/devbanner.go b/internal/lkgateway/devbanner.go new file mode 100644 index 0000000..93180c3 --- /dev/null +++ b/internal/lkgateway/devbanner.go @@ -0,0 +1,57 @@ +package lkgateway + +// devbanner.go — баннер режима разработки в шапке. +// +// Режим разработки разрешает сервер лицензий (dev_until в ключе). Пока он разрешён, в +// шапке висит баннер; нажатие на него выключает режим визуально для этого пользователя +// (служебные разделы прячутся, имитации не показываются) и включает обратно. Это личная +// настройка сотрудника, а не состояние системы: лицензия по-прежнему разрешает режим. +// Когда лицензия режим не разрешает, баннера нет и выключатель ни на что не влияет. + +import ( + "net/http" + "sync" +) + +// devOff — пользователи, выключившие режим разработки у себя (по логину; без +// авторизации — пустой логин). Хранится в памяти: после перезапуска режим снова включён. +var devOff = struct { + mu sync.Mutex + m map[string]bool +}{m: map[string]bool{}} + +func devUserKey(u *User) string { + if u == nil { + return "" + } + return u.Login +} + +// devOnFor — режим разработки действует для пользователя: разрешён лицензией и не выключен им. +func devOnFor(u *User) bool { + if !devMode(globalRC) { + return false + } + devOff.mu.Lock() + defer devOff.mu.Unlock() + return !devOff.m[devUserKey(u)] +} + +// devToggle — POST /admin/dev-toggle: переключить режим у себя и вернуться на ту же страницу. +func devToggle(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "method", http.StatusMethodNotAllowed) + return + } + if devMode(globalRC) { + key := devUserKey(currentUser(w)) + devOff.mu.Lock() + devOff.m[key] = !devOff.m[key] + devOff.mu.Unlock() + } + dest := safeReturnPath(r.FormValue("return_to")) + if dest == "" { + dest = "/admin" + } + http.Redirect(w, r, dest, http.StatusSeeOther) +} diff --git a/internal/lkgateway/web/templates/admin_claim.html b/internal/lkgateway/web/templates/admin_claim.html index d2c5c08..7807048 100644 --- a/internal/lkgateway/web/templates/admin_claim.html +++ b/internal/lkgateway/web/templates/admin_claim.html @@ -58,7 +58,7 @@ {{end}} -{{if .DevMode}}{{with .Claim.TestResult}} +{{if devOn}}{{with .Claim.TestResult}}

{{if eq .Status "ok"}}✓ Тест пройден diff --git a/internal/lkgateway/web/templates/admin_fancy_queue.html b/internal/lkgateway/web/templates/admin_fancy_queue.html index 9dd3107..1e8703f 100644 --- a/internal/lkgateway/web/templates/admin_fancy_queue.html +++ b/internal/lkgateway/web/templates/admin_fancy_queue.html @@ -68,7 +68,7 @@

{{else if not .Error}} -

В трансферных таблицах пока нет переводов. Они появятся при входящем/исходящем переводе M2M{{if .DevMode}} или при прогоне «Тестирование M2M → выгрузка истории в DEPO»{{end}}.

+

В трансферных таблицах пока нет переводов. Они появятся при входящем/исходящем переводе M2M{{if devOn}} или при прогоне «Тестирование M2M → выгрузка истории в DEPO»{{end}}.

{{end}} diff --git a/internal/lkgateway/web/templates/admin_help.html b/internal/lkgateway/web/templates/admin_help.html index c7ba487..6802582 100644 --- a/internal/lkgateway/web/templates/admin_help.html +++ b/internal/lkgateway/web/templates/admin_help.html @@ -26,7 +26,7 @@

Внешние системы →

-

ИШ НРД ({{if .DevMode}}профили GUEST/TEST3/PROD{{else}}тестовый и боевой контуры{{end}}), команда Fansy (ETL в staging), уведомления (e-mail, Yandex Messenger, Telegram), порядок согласования.

+

ИШ НРД ({{if devOn}}профили GUEST/TEST3/PROD{{else}}тестовый и боевой контуры{{end}}), команда Fansy (ETL в staging), уведомления (e-mail, Yandex Messenger, Telegram), порядок согласования.

@@ -35,7 +35,7 @@

Исходящий перевод по бумажному поручению клиента: ввод, сверка с учётной и торговой системами, обязательные отметки, отправка, поручение 16, документы НРД.

- {{if .DevMode}} + {{if devOn}}

Тестирование с роботом MOEX МОСТ →

Робот НРД на TEST3 (код MC0012500000), 4 тестовых сценария (отказ / принять все / частично / встречный перевод), управление через DocumentSeries и DocumentNumber, тестовые наборы депозитариев и кодов ошибок.

@@ -44,7 +44,7 @@

Архитектура обмена с НРД →

-

Полная схема: bj-server → ИШ (на Astra Linux ВМ) → ONYX (НРД) → {{if .DevMode}}робот-автотест{{else}}депозитарий-контрагент{{end}}. Кто на чьей стороне, какое СКЗИ, какие сертификаты, FAQ.

+

Полная схема: bj-server → ИШ (на Astra Linux ВМ) → ONYX (НРД) → {{if devOn}}робот-автотест{{else}}депозитарий-контрагент{{end}}. Кто на чьей стороне, какое СКЗИ, какие сертификаты, FAQ.

diff --git a/internal/lkgateway/web/templates/admin_help_architecture.html b/internal/lkgateway/web/templates/admin_help_architecture.html index 7905094..6099a22 100644 --- a/internal/lkgateway/web/templates/admin_help_architecture.html +++ b/internal/lkgateway/web/templates/admin_help_architecture.html @@ -21,7 +21,7 @@ │ │ • стейт-машина │ │ Делает САМ: │ │ │ │ • PostgreSQL │ │ • подпись │ │ │ │ • админка :8080 │ │ • упаковку ЭДО │ │ -│ │ {{if .DevMode}}• lk-emulator {{else}}• коннектор ЛК {{end}}│ │ • проверку │ │ +│ │ {{if devOn}}• lk-emulator {{else}}• коннектор ЛК {{end}}│ │ • проверку │ │ │ │ │ │ подписей НРД │ │ │ └──────────────────┘ │ • БД PostgreSQL │ │ │ │ (history) │ │ @@ -46,7 +46,7 @@ │ /onyxpr/WslService │ │ │ │ ↓ внутрь НРД │ -{{if .DevMode}} │ • робот-автотест │ +{{if devOn}} │ • робот-автотест │ │ MC0012500000 │ {{end}} │ • реальные депозитарии │ │ • биржевые системы │ @@ -64,7 +64,7 @@ наша Astra Linux SE 1.7 / Linux АПК «Валидата Клиент L» (PKCS#11) - Стейт-машина, журнал в БД, веб-админка{{if .DevMode}}, lk-emulator{{end}} + Стейт-машина, журнал в БД, веб-админка{{if devOn}}, lk-emulator{{end}} ИШ (igate) @@ -80,7 +80,7 @@ — Web-сервис НРД — принимает пакеты от ИШ всех клиентов - {{if .DevMode}} + {{if devOn}} Робот-автотест НРД — @@ -109,7 +109,7 @@

Q: Какой сертификат нужен?

Только от УЦ Московской Биржи (ca.moex.com). Сертификаты других УЦ ИШ не примет. УЦ МБ выпускает сертификаты только для организаций, подключённых к ЭДО НРД (по договору).

- {{if .DevMode}} + {{if devOn}}

Q: Что делать, чтобы протестировать на роботе НРД на TEST3?

  1. Получить сертификат УЦ МБ для нашей организации.
  2. @@ -133,7 +133,7 @@ {{end}}
-{{if .DevMode}} +{{if devOn}}

Что у нас уже готово

@@ -133,7 +133,7 @@ LISTEN=127.0.0.1:8099 ./bj-lk }
-{{if .DevMode}} +{{if devOn}}

7. Эмулятор ЛК для тестов

На дев-стенде доступен lk-emulator на порту 8083 — имитация ЛК. Он сам регистрирует свой URL в bj-server как callback-приёмник.

@@ -146,8 +146,8 @@ LISTEN=127.0.0.1:8099 ./bj-lk {{end}}
-

{{if .DevMode}}8{{else}}7{{end}}. Подписание заявления

+

{{if devOn}}8{{else}}7{{end}}. Подписание заявления

ЛК должен подписать заявление XMLDSig (ГОСТ или RSA) и положить в поле signed_document (base64). Мы проверяем подпись через crypto-service — см. инструкцию по криптографии.

- {{if .DevMode}}

На M2 проверка подписи отключена (stub). На M3-M4 включится после подключения СКЗИ.

{{end}} + {{if devOn}}

На M2 проверка подписи отключена (stub). На M3-M4 включится после подключения СКЗИ.

{{end}}
{{end}} diff --git a/internal/lkgateway/web/templates/admin_help_systems.html b/internal/lkgateway/web/templates/admin_help_systems.html index 5bc7936..521dcdd 100644 --- a/internal/lkgateway/web/templates/admin_help_systems.html +++ b/internal/lkgateway/web/templates/admin_help_systems.html @@ -45,7 +45,7 @@
  • URL ONYX — например https://gost-t3.nsd.ru/onyx-ms/OnyxEdoWSService/OnyxEdo
  • Ключевой контейнер — имя контейнера Валидаты с ключами ЭДО НРД (выдаются УЦ НРД, см. ниже)
  • - {{if .DevMode}}

    Без настроенного ИШ система работает в mock-режиме: bj-server эмитирует синтетический Decision через 3 секунды для каждой заявки. Это удобно для дев-демо и не требует подключения к НРД.

    {{else}}

    Пока ИШ не настроен, обмен с НРД не выполняется: поручения в НРД не отправляются.

    {{end}} + {{if devOn}}

    Без настроенного ИШ система работает в mock-режиме: bj-server эмитирует синтетический Decision через 3 секунды для каждой заявки. Это удобно для дев-демо и не требует подключения к НРД.

    {{else}}

    Пока ИШ не настроен, обмен с НРД не выполняется: поручения в НРД не отправляются.

    {{end}}
    @@ -96,10 +96,10 @@ - - + + - +
    Внешняя сторонаЧто согласовать
    НРД (Национальный расчётный депозитарий){{if .DevMode}}Тестовые сертификаты GUEST/TEST3{{else}}Сертификаты для тестового и боевого контуров{{end}}, дистрибутив ИШ, доступ к личному кабинету УЦ НРД
    Команда ЛК (ESIA Finance)Базовый URL ЛК, Basic-auth учётные данные, {{if .DevMode}}очерёдность подключения (сначала эмулятор, потом реальный ЛК){{else}}окружения ЛК (тест и бой){{end}}
    НРД (Национальный расчётный депозитарий){{if devOn}}Тестовые сертификаты GUEST/TEST3{{else}}Сертификаты для тестового и боевого контуров{{end}}, дистрибутив ИШ, доступ к личному кабинету УЦ НРД
    Команда ЛК (ESIA Finance)Базовый URL ЛК, Basic-auth учётные данные, {{if devOn}}очерёдность подключения (сначала эмулятор, потом реальный ЛК){{else}}окружения ЛК (тест и бой){{end}}
    Команда FansyКонтракт docs/fansy-contract/v1/, SLA, окна обслуживания, IP-allowlist
    Брокеры-контрагенты MOSTБКС (ИНН 5406121446), Ренессанс (7709258228), Альфа-Банк (7728168971){{if .DevMode}} — уже в seed{{end}}
    Брокеры-контрагенты MOSTБКС (ИНН 5406121446), Ренессанс (7709258228), Альфа-Банк (7728168971){{if devOn}} — уже в seed{{end}}
    diff --git a/internal/lkgateway/web/templates/admin_home.html b/internal/lkgateway/web/templates/admin_home.html index 433adf0..17d2df9 100644 --- a/internal/lkgateway/web/templates/admin_home.html +++ b/internal/lkgateway/web/templates/admin_home.html @@ -13,7 +13,7 @@ {{end}} -{{if and .DevMode .LKUrl}} +{{if and devOn .LKUrl}} {{/* ===== Первичный тест интеграции с ЛК (режим разработки) ===== */}}
    @@ -30,10 +30,10 @@ {{/* ===== Крупные плитки задач ===== */}} @@ -122,7 +122,7 @@ {{end}} {{/* ===== Модалка-симулятор: тестовый перевод роботу НРД (режим разработки) ===== */}} -{{if .DevMode}} +{{if devOn}}