feat(env): allow setting the initial URI path for the web panel (#5149)

* feat(env): allow setting the initial URI path for the web panel

* fix(setting): normalize and guard XUI_INIT_WEB_BASE_PATH default

Address Copilot review on PR #5149: an env value that is empty, whitespace, or lacks slashes (e.g. `panel`) could produce an invalid webBasePath such as `/ /` and reach the frontend un-normalized.

getEnv now trims whitespace and falls back when the value is empty; the env-derived default is passed through the existing normalizeBasePath helper (reused from node.go) so it always carries a leading and trailing slash. GetBasePath reuses the same helper instead of duplicating the slash logic.

---------

Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
Vladimir Avtsenov
2026-06-11 13:51:54 +03:00
committed by GitHub
parent 8f408d2d6a
commit 89b1137b00
11 changed files with 27 additions and 9 deletions
+15 -8
View File
@@ -7,6 +7,7 @@ import (
"fmt"
"net"
"net/http"
"os"
"reflect"
"strconv"
"strings"
@@ -37,7 +38,7 @@ var defaultValueMap = map[string]string{
"secret": random.Seq(32),
"panelGuid": uuid.NewString(),
"apiToken": "",
"webBasePath": "/",
"webBasePath": normalizeBasePath(getEnv("XUI_INIT_WEB_BASE_PATH", "/")),
"sessionMaxAge": "360",
"trustedProxyCIDRs": "127.0.0.1/32,::1/128",
"pageSize": "25",
@@ -237,6 +238,18 @@ func mustString(value string, _ error) string {
return value
}
func getEnv(key, fallback string) string {
val, ok := os.LookupEnv(key)
if !ok {
return fallback
}
val = strings.TrimSpace(val)
if val == "" {
return fallback
}
return val
}
func (s *SettingService) ResetSettings() error {
db := database.GetDB()
err := db.Where("1 = 1").Delete(model.Setting{}).Error
@@ -587,13 +600,7 @@ func (s *SettingService) GetBasePath() (string, error) {
if err != nil {
return "", err
}
if !strings.HasPrefix(basePath, "/") {
basePath = "/" + basePath
}
if !strings.HasSuffix(basePath, "/") {
basePath += "/"
}
return basePath, nil
return normalizeBasePath(basePath), nil
}
func (s *SettingService) GetTimeLocation() (*time.Location, error) {