Files
vpwg/Go/internal/web/handlers/admin_settings.go
T

123 lines
4.1 KiB
Go

package handlers
import (
"fmt"
"net/http"
"strings"
"amnezia-share/internal/panel"
"amnezia-share/internal/settings"
"amnezia-share/internal/web"
)
type adminSettingsView struct {
adminLayout
PanelURL string
APIToken string
ServerLabelsJSON string
TrafficNotices string
Maintenance bool
PocketURL string
PocketClientID string
PocketSecret string
MemberDays string
MemberMaxUses string
TestResult string
TestError string
}
func loadAdminSettingsView(a *web.App, r *http.Request) adminSettingsView {
ctx := r.Context()
vals, _ := a.Settings.GetMany(ctx,
settings.KeyPanelURL, settings.KeyAPIToken, settings.KeyServerLabelsJSON,
settings.KeyTrafficNotices, settings.KeyMaintenance,
settings.KeyPocketURL, settings.KeyPocketClientID, settings.KeyPocketSecret,
settings.KeyMemberDays, settings.KeyMemberMaxUses,
)
return adminSettingsView{
adminLayout: newAdminLayout(a, r, "settings"),
PanelURL: vals[settings.KeyPanelURL],
APIToken: vals[settings.KeyAPIToken],
ServerLabelsJSON: vals[settings.KeyServerLabelsJSON],
TrafficNotices: vals[settings.KeyTrafficNotices],
Maintenance: vals[settings.KeyMaintenance] == "1",
PocketURL: vals[settings.KeyPocketURL],
PocketClientID: vals[settings.KeyPocketClientID],
PocketSecret: vals[settings.KeyPocketSecret],
MemberDays: vals[settings.KeyMemberDays],
MemberMaxUses: vals[settings.KeyMemberMaxUses],
}
}
// AdminSettingsGet renders the settings form (admin/settings.php GET).
func AdminSettingsGet(a *web.App) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
view := loadAdminSettingsView(a, r)
view.OK, view.Error = flashFromQuery(r)
a.Render(w, r, "page_admin_settings", view)
}
}
// AdminSettingsPost saves settings, or runs a connectivity test against the
// Amnezia panel without saving (admin/settings.php POST).
func AdminSettingsPost(a *web.App) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
if r.FormValue("action") == "test" {
view := loadAdminSettingsView(a, r)
baseURL := strings.TrimSpace(r.FormValue("panel_url"))
token := panel.NormalizeToken(r.FormValue("api_token"))
if baseURL == "" || token == "" {
view.TestError = "Укажите URL панели и токен."
} else if !panel.TokenOK(token) {
view.TestError = "Токен имеет неверный формат (ожидается awp_...)."
} else {
servers, err := a.Panel.ListServers(ctx, baseURL, token)
if err != nil {
view.TestError = err.Error()
} else {
view.TestResult = fmt.Sprintf("Соединение установлено. Серверов обнаружено: %d.", len(servers))
}
}
view.PanelURL = baseURL
view.APIToken = r.FormValue("api_token")
a.Render(w, r, "page_admin_settings", view)
return
}
set := func(key, value string) error { return a.Settings.Set(ctx, key, value) }
maintenance := "0"
if r.FormValue("maintenance") == "1" {
maintenance = "1"
}
var err error
for _, kv := range []struct{ key, value string }{
{settings.KeyPanelURL, strings.TrimSpace(r.FormValue("panel_url"))},
{settings.KeyAPIToken, panel.NormalizeToken(r.FormValue("api_token"))},
{settings.KeyServerLabelsJSON, r.FormValue("server_labels_json")},
{settings.KeyTrafficNotices, r.FormValue("traffic_notices_json")},
{settings.KeyMaintenance, maintenance},
{settings.KeyPocketURL, strings.TrimSpace(r.FormValue("pocket_url"))},
{settings.KeyPocketClientID, strings.TrimSpace(r.FormValue("pocket_client_id"))},
{settings.KeyPocketSecret, strings.TrimSpace(r.FormValue("pocket_secret"))},
{settings.KeyMemberDays, strings.TrimSpace(r.FormValue("member_days"))},
{settings.KeyMemberMaxUses, strings.TrimSpace(r.FormValue("member_max_uses"))},
} {
if serr := set(kv.key, kv.value); serr != nil {
err = serr
}
}
a.Panel.ClearCache()
okMsg := "Настройки сохранены."
errText := ""
if err != nil {
okMsg = ""
errText = err.Error()
}
redirectWithFlash(w, r, a, "admin/settings", okMsg, errText)
}
}