b4b4788035
Пока лицензия разрешает режим разработки, в шапке висит баннер; нажатие выключает режим визуально для этого пользователя и включает обратно. В шаблонах .DevMode заменён на devOn. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
58 lines
2.2 KiB
Go
58 lines
2.2 KiB
Go
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)
|
|
}
|