Модули вне лицензии исчезают из интерфейса: меню, разделы настроек, прямые адреса отвечают «не входит в лицензию»

- moduleForPath: quik-mnp (QUIK, обмен с DEPO, ручной поиск в DEPO), quik-export, web-cabinet (bj-lk);
- в настройках каждый модуль по своему признаку (раньше Экспорт QUIK и Кабинет шли общим условием);
- разделы Fancy/QUIK открыты при лицензии QUIK МНП без пароля перспективных модулей.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-24 22:14:47 +03:00
parent e043e7c371
commit f1df6b529b
4 changed files with 44 additions and 11 deletions
+28
View File
@@ -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, `<!doctype html><meta charset="utf-8"><title>Модуль не входит в лицензию</title><body style="font-family:system-ui,sans-serif;max-width:640px;margin:60px auto;padding:0 16px"><h2>Модуль не входит в лицензию</h2><p>«%s» не входит в лицензию этого сервера. Модуль можно добавить в лицензию у ZETIT — после этого раздел появится сам.</p><p><a href="/admin/">На главную</a> · <a href="/admin/setup#sec-license">Лицензия</a></p></body>`, 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) {
// пользователь без права просмотра — отправляем на его стартовую страницу