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 @@