Disallow duplicate storage paths (#26484)

Replace #26380
This commit is contained in:
Lunny Xiao 2024-02-09 22:06:03 +08:00 committed by GitHub
parent c7a21cbb0c
commit 92fda9c5a2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 42 additions and 20 deletions

View File

@ -53,21 +53,24 @@ var Indexer = struct {
func loadIndexerFrom(rootCfg ConfigProvider) { func loadIndexerFrom(rootCfg ConfigProvider) {
sec := rootCfg.Section("indexer") sec := rootCfg.Section("indexer")
Indexer.IssueType = sec.Key("ISSUE_INDEXER_TYPE").MustString("bleve") Indexer.IssueType = sec.Key("ISSUE_INDEXER_TYPE").MustString("bleve")
Indexer.IssuePath = filepath.ToSlash(sec.Key("ISSUE_INDEXER_PATH").MustString(filepath.ToSlash(filepath.Join(AppDataPath, "indexers/issues.bleve")))) if Indexer.IssueType == "bleve" {
if !filepath.IsAbs(Indexer.IssuePath) { Indexer.IssuePath = filepath.ToSlash(sec.Key("ISSUE_INDEXER_PATH").MustString(filepath.ToSlash(filepath.Join(AppDataPath, "indexers/issues.bleve"))))
Indexer.IssuePath = filepath.ToSlash(filepath.Join(AppWorkPath, Indexer.IssuePath)) if !filepath.IsAbs(Indexer.IssuePath) {
} Indexer.IssuePath = filepath.ToSlash(filepath.Join(AppWorkPath, Indexer.IssuePath))
Indexer.IssueConnStr = sec.Key("ISSUE_INDEXER_CONN_STR").MustString(Indexer.IssueConnStr) }
fatalDuplicatedPath("issue_indexer", Indexer.IssuePath)
if Indexer.IssueType == "meilisearch" { } else {
u, err := url.Parse(Indexer.IssueConnStr) Indexer.IssueConnStr = sec.Key("ISSUE_INDEXER_CONN_STR").MustString(Indexer.IssueConnStr)
if err != nil { if Indexer.IssueType == "meilisearch" {
log.Warn("Failed to parse ISSUE_INDEXER_CONN_STR: %v", err) u, err := url.Parse(Indexer.IssueConnStr)
u = &url.URL{} if err != nil {
log.Warn("Failed to parse ISSUE_INDEXER_CONN_STR: %v", err)
u = &url.URL{}
}
Indexer.IssueConnAuth, _ = u.User.Password()
u.User = nil
Indexer.IssueConnStr = u.String()
} }
Indexer.IssueConnAuth, _ = u.User.Password()
u.User = nil
Indexer.IssueConnStr = u.String()
} }
Indexer.IssueIndexerName = sec.Key("ISSUE_INDEXER_NAME").MustString(Indexer.IssueIndexerName) Indexer.IssueIndexerName = sec.Key("ISSUE_INDEXER_NAME").MustString(Indexer.IssueIndexerName)

View File

@ -66,8 +66,12 @@ func init() {
AppWorkPath = filepath.Dir(AppPath) AppWorkPath = filepath.Dir(AppPath)
} }
fatalDuplicatedPath("app_work_path", AppWorkPath)
appWorkPathBuiltin = AppWorkPath appWorkPathBuiltin = AppWorkPath
customPathBuiltin = CustomPath customPathBuiltin = CustomPath
fatalDuplicatedPath("custom_path", CustomPath)
customConfBuiltin = CustomConf customConfBuiltin = CustomConf
} }

View File

@ -285,6 +285,9 @@ func loadRepositoryFrom(rootCfg ConfigProvider) {
} else { } else {
RepoRootPath = filepath.Clean(RepoRootPath) RepoRootPath = filepath.Clean(RepoRootPath)
} }
fatalDuplicatedPath("repository.ROOT", RepoRootPath)
defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder)) defaultDetectedCharsetsOrder := make([]string, 0, len(Repository.DetectedCharsetsOrder))
for _, charset := range Repository.DetectedCharsetsOrder { for _, charset := range Repository.DetectedCharsetsOrder {
defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder, strings.ToLower(strings.TrimSpace(charset))) defaultDetectedCharsetsOrder = append(defaultDetectedCharsetsOrder, strings.ToLower(strings.TrimSpace(charset)))

View File

@ -7,7 +7,6 @@ import (
"encoding/base64" "encoding/base64"
"net" "net"
"net/url" "net/url"
"path"
"path/filepath" "path/filepath"
"strconv" "strconv"
"strings" "strings"
@ -321,17 +320,19 @@ func loadServerFrom(rootCfg ConfigProvider) {
} }
StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(StaticRootPath) StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(StaticRootPath)
StaticCacheTime = sec.Key("STATIC_CACHE_TIME").MustDuration(6 * time.Hour) StaticCacheTime = sec.Key("STATIC_CACHE_TIME").MustDuration(6 * time.Hour)
AppDataPath = sec.Key("APP_DATA_PATH").MustString(path.Join(AppWorkPath, "data")) AppDataPath = sec.Key("APP_DATA_PATH").MustString(filepath.Join(AppWorkPath, "data"))
if !filepath.IsAbs(AppDataPath) { if !filepath.IsAbs(AppDataPath) {
AppDataPath = filepath.ToSlash(filepath.Join(AppWorkPath, AppDataPath)) AppDataPath = filepath.ToSlash(filepath.Join(AppWorkPath, AppDataPath))
} }
fatalDuplicatedPath("app_data_path", AppDataPath)
EnableGzip = sec.Key("ENABLE_GZIP").MustBool() EnableGzip = sec.Key("ENABLE_GZIP").MustBool()
EnablePprof = sec.Key("ENABLE_PPROF").MustBool(false) EnablePprof = sec.Key("ENABLE_PPROF").MustBool(false)
PprofDataPath = sec.Key("PPROF_DATA_PATH").MustString(path.Join(AppWorkPath, "data/tmp/pprof")) PprofDataPath = sec.Key("PPROF_DATA_PATH").MustString(filepath.Join(AppWorkPath, "data/tmp/pprof"))
if !filepath.IsAbs(PprofDataPath) { if !filepath.IsAbs(PprofDataPath) {
PprofDataPath = filepath.Join(AppWorkPath, PprofDataPath) PprofDataPath = filepath.Join(AppWorkPath, PprofDataPath)
} }
fatalDuplicatedPath("pprof_data_path", PprofDataPath)
landingPage := sec.Key("LANDING_PAGE").MustString("home") landingPage := sec.Key("LANDING_PAGE").MustString("home")
switch landingPage { switch landingPage {

View File

@ -5,7 +5,6 @@ package setting
import ( import (
"net/http" "net/http"
"path"
"path/filepath" "path/filepath"
"strings" "strings"
@ -44,9 +43,10 @@ func loadSessionFrom(rootCfg ConfigProvider) {
sec := rootCfg.Section("session") sec := rootCfg.Section("session")
SessionConfig.Provider = sec.Key("PROVIDER").In("memory", SessionConfig.Provider = sec.Key("PROVIDER").In("memory",
[]string{"memory", "file", "redis", "mysql", "postgres", "couchbase", "memcache", "db"}) []string{"memory", "file", "redis", "mysql", "postgres", "couchbase", "memcache", "db"})
SessionConfig.ProviderConfig = strings.Trim(sec.Key("PROVIDER_CONFIG").MustString(path.Join(AppDataPath, "sessions")), "\" ") SessionConfig.ProviderConfig = strings.Trim(sec.Key("PROVIDER_CONFIG").MustString(filepath.Join(AppDataPath, "sessions")), "\" ")
if SessionConfig.Provider == "file" && !filepath.IsAbs(SessionConfig.ProviderConfig) { if SessionConfig.Provider == "file" && !filepath.IsAbs(SessionConfig.ProviderConfig) {
SessionConfig.ProviderConfig = path.Join(AppWorkPath, SessionConfig.ProviderConfig) SessionConfig.ProviderConfig = filepath.Join(AppWorkPath, SessionConfig.ProviderConfig)
fatalDuplicatedPath("session", SessionConfig.ProviderConfig)
} }
SessionConfig.CookieName = sec.Key("COOKIE_NAME").MustString("i_like_gitea") SessionConfig.CookieName = sec.Key("COOKIE_NAME").MustString("i_like_gitea")
SessionConfig.CookiePath = AppSubURL + "/" // there was a bug, old code only set CookePath=AppSubURL, no trailing slash SessionConfig.CookiePath = AppSubURL + "/" // there was a bug, old code only set CookePath=AppSubURL, no trailing slash

View File

@ -226,3 +226,12 @@ func LoadSettingsForInstall() {
loadServiceFrom(CfgProvider) loadServiceFrom(CfgProvider)
loadMailerFrom(CfgProvider) loadMailerFrom(CfgProvider)
} }
var uniquePaths = make(map[string]string)
func fatalDuplicatedPath(name, p string) {
if targetName, ok := uniquePaths[p]; ok && targetName != name {
log.Fatal("storage path %q is being used by %q and %q and all storage paths must be unique to prevent data loss.", p, targetName, name)
}
uniquePaths[p] = name
}

View File

@ -240,6 +240,8 @@ func getStorageForLocal(targetSec, overrideSec ConfigSection, tp targetSecType,
} }
} }
fatalDuplicatedPath("storage."+name, storage.Path)
return &storage, nil return &storage, nil
} }