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) }