From f1df6b529bf5e03213321dfaca1ea4ed6c42e2d8 Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 22:14:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B8=D1=81=D1=87=D0=B5=D0=B7=D0=B0=D1=8E=D1=82=20=D0=B8?= =?UTF-8?q?=D0=B7=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D0=B0:=20=D0=BC=D0=B5=D0=BD=D1=8E,=20=D1=80=D0=B0=D0=B7=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8B=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA,=20=D0=BF=D1=80=D1=8F=D0=BC=D1=8B=D0=B5=20=D0=B0=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D1=81=D0=B0=20=D0=BE=D1=82=D0=B2=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D1=8E=D1=82=20=C2=AB=D0=BD=D0=B5=20=D0=B2=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=20=D0=B2=20=D0=BB=D0=B8=D1=86=D0=B5=D0=BD=D0=B7?= =?UTF-8?q?=D0=B8=D1=8E=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - moduleForPath: quik-mnp (QUIK, обмен с DEPO, ручной поиск в DEPO), quik-export, web-cabinet (bj-lk); - в настройках каждый модуль по своему признаку (раньше Экспорт QUIK и Кабинет шли общим условием); - разделы Fancy/QUIK открыты при лицензии QUIK МНП без пароля перспективных модулей. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/lkgateway/admin.go | 3 +- internal/lkgateway/auth.go | 28 +++++++++++++++++++ .../lkgateway/web/templates/admin_setup.html | 20 +++++++------ internal/lkgateway/web/templates/layout.html | 4 +-- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/internal/lkgateway/admin.go b/internal/lkgateway/admin.go index 5f10dec..c72fd07 100644 --- a/internal/lkgateway/admin.go +++ b/internal/lkgateway/admin.go @@ -55,6 +55,7 @@ var templateFuncs = template.FuncMap{ "can": authTemplateFuncs["can"], "devOn": authTemplateFuncs["devOn"], "devLicensed": authTemplateFuncs["devLicensed"], + "mod": func(f string) bool { return globalRC == nil || moduleAllowed(globalRC, f) }, // модуль в лицензии "authOpen": authOpen, "internalDocs": func() bool { return internalDocsBuilt }, "roleTitle": roleTitle, @@ -358,7 +359,7 @@ type page struct { NPR bool // модуль «НПР / УДС» включён и разрешён лицензией IGWDown string // ИШ НРД не отвечает: «N мин» (пусто — отвечает или не проверялся) IGWDetail string - DevMode bool // режим разработки (сервер лицензий): видны служебные разделы + DevMode bool // режим разработки (сервер лицензий): видны служебные разделы } // globalRC — ссылка на runtime-конфиг для template-funcs/page helpers. diff --git a/internal/lkgateway/auth.go b/internal/lkgateway/auth.go index 8a266bc..6923d9b 100644 --- a/internal/lkgateway/auth.go +++ b/internal/lkgateway/auth.go @@ -21,6 +21,7 @@ import ( "encoding/hex" "encoding/json" "fmt" + "html" "html/template" "log" "net" @@ -883,6 +884,29 @@ func devOnlyPath(p string) bool { return false } +// moduleForPath — лицензируемый модуль, которому принадлежит раздел ("" — ядро). Модуль, снятый +// с лицензии, пропадает из меню и настроек, а его адреса отвечают «не входит в лицензию». +func moduleForPath(p string) string { + has := func(pre string) bool { return p == pre || strings.HasPrefix(p, pre+"/") } + switch { + case has("/admin/quik"), has("/admin/setup/quik"), has("/admin/fancy-queue"), has("/admin/setup/fancy"), has("/admin/manual/depo"): + return "quik-mnp" + case has("/admin/setup/quikexport"): + return "quik-export" + case strings.HasPrefix(p, "/admin/setup/lk/"): // личный кабинет клиента (bj-lk); /admin/setup/lk* без «/» — ЕСИА Финанс, ядро + return "web-cabinet" + } + return "" +} + +var moduleTitles = map[string]string{"quik-mnp": "QUIK: неторговые поручения и обмен с DEPO", "quik-export": "Экспорт биржевой информации QUIK", "web-cabinet": "Личный кабинет клиента", "npr": "Риск-монитор НПР / УДС"} + +func moduleNotLicensed(w http.ResponseWriter, f string) { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusForbidden) + fmt.Fprintf(w, `Модуль не входит в лицензию

Модуль не входит в лицензию

«%s» не входит в лицензию этого сервера. Модуль можно добавить в лицензию у ZETIT — после этого раздел появится сам.

На главную · Лицензия

`, html.EscapeString(moduleTitles[f])) +} + // requiredPerm — какое право нужно для пути и метода. func requiredPerm(p, method string) string { if devOnlyPath(p) { @@ -1024,6 +1048,10 @@ func authMiddleware(rc *RuntimeConfig, next http.Handler) http.Handler { http.Redirect(w, r, "/login?next="+url.QueryEscape(next), http.StatusSeeOther) return } + if f := moduleForPath(p); f != "" && globalRC != nil && !moduleAllowed(globalRC, f) { + moduleNotLicensed(w, f) + return + } perm := requiredPerm(p, r.Method) if !u.Can(perm) { // пользователь без права просмотра — отправляем на его стартовую страницу diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index fbbfeed..7ff29d3 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -6,13 +6,13 @@