Модули вне лицензии исчезают из интерфейса: меню, разделы настроек, прямые адреса отвечают «не входит в лицензию»
- 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:
@@ -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) {
|
||||
// пользователь без права просмотра — отправляем на его стартовую страницу
|
||||
|
||||
Reference in New Issue
Block a user