diff options
Diffstat (limited to 'modules/setting/setting.go')
-rw-r--r-- | modules/setting/setting.go | 88 |
1 files changed, 45 insertions, 43 deletions
diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 15cdc1fe3a..d219dbaafd 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -546,9 +546,27 @@ func SetCustomPathAndConf(providedCustom, providedConf, providedWorkPath string) } } -// NewContext initializes configuration context. +// LoadFromExisting initializes setting options from an existing config file (app.ini) +func LoadFromExisting() { + loadFromConf(false) +} + +// LoadAllowEmpty initializes setting options, it's also fine that if the config file (app.ini) doesn't exist +func LoadAllowEmpty() { + loadFromConf(true) +} + +// LoadForTest initializes setting options for tests +func LoadForTest() { + loadFromConf(true) + if err := PrepareAppDataPath(); err != nil { + log.Fatal("Can not prepare APP_DATA_PATH: %v", err) + } +} + +// loadFromConf initializes configuration context. // NOTE: do not print any log except error. -func NewContext() { +func loadFromConf(allowEmpty bool) { Cfg = ini.Empty() if WritePIDFile && len(PIDFile) > 0 { @@ -563,9 +581,10 @@ func NewContext() { if err := Cfg.Append(CustomConf); err != nil { log.Fatal("Failed to load custom conf '%s': %v", CustomConf, err) } - } else { - log.Warn("Custom config '%s' not found, ignore this if you're running first time", CustomConf) - } + } else if !allowEmpty { + log.Fatal("Unable to find configuration file: %q.\nEnsure you are running in the correct environment or set the correct configuration file with -c.", CustomConf) + } // else: no config file, a config file might be created at CustomConf later (might not) + Cfg.NameMapper = ini.SnackCase homeDir, err := com.HomeDir() @@ -698,18 +717,7 @@ func NewContext() { StaticRootPath = sec.Key("STATIC_ROOT_PATH").MustString(StaticRootPath) StaticCacheTime = sec.Key("STATIC_CACHE_TIME").MustDuration(6 * time.Hour) AppDataPath = sec.Key("APP_DATA_PATH").MustString(path.Join(AppWorkPath, "data")) - if _, err = os.Stat(AppDataPath); err != nil { - // FIXME: There are too many calls to MkdirAll in old code. It is incorrect. - // For example, if someDir=/mnt/vol1/gitea-home/data, if the mount point /mnt/vol1 is not mounted when Gitea runs, - // then gitea will make new empty directories in /mnt/vol1, all are stored in the root filesystem. - // The correct behavior should be: creating parent directories is end users' duty. We only create sub-directories in existing parent directories. - // For quickstart, the parent directories should be created automatically for first startup (eg: a flag or a check of INSTALL_LOCK). - // Now we can take the first step to do correctly (using Mkdir) in other packages, and prepare the AppDataPath here, then make a refactor in future. - err = os.MkdirAll(AppDataPath, os.ModePerm) - if err != nil { - log.Fatal("Failed to create the directory for app data path '%s'", AppDataPath) - } - } + EnableGzip = sec.Key("ENABLE_GZIP").MustBool() EnablePprof = sec.Key("ENABLE_PPROF").MustBool(false) PprofDataPath = sec.Key("PPROF_DATA_PATH").MustString(path.Join(AppWorkPath, "data/tmp/pprof")) @@ -864,6 +872,10 @@ func NewContext() { SuccessfulTokensCacheSize = sec.Key("SUCCESSFUL_TOKENS_CACHE_SIZE").MustInt(20) InternalToken = loadInternalToken(sec) + if InstallLock && InternalToken == "" { + // if Gitea has been installed but the InternalToken hasn't been generated (upgrade from an old release), we should generate + generateSaveInternalToken() + } cfgdata := sec.Key("PASSWORD_COMPLEXITY").Strings(",") if len(cfgdata) == 0 { @@ -975,19 +987,11 @@ func NewContext() { Langs = Cfg.Section("i18n").Key("LANGS").Strings(",") if len(Langs) == 0 { - Langs = []string{ - "en-US", "zh-CN", "zh-HK", "zh-TW", "de-DE", "fr-FR", "nl-NL", "lv-LV", - "ru-RU", "uk-UA", "ja-JP", "es-ES", "pt-BR", "pt-PT", "pl-PL", "bg-BG", - "it-IT", "fi-FI", "tr-TR", "cs-CZ", "sr-SP", "sv-SE", "ko-KR", "el-GR", - "fa-IR", "hu-HU", "id-ID", "ml-IN"} + Langs = defaultI18nLangs() } Names = Cfg.Section("i18n").Key("NAMES").Strings(",") if len(Names) == 0 { - Names = []string{"English", "简体中文", "繁體中文(香港)", "繁體中文(台灣)", "Deutsch", - "français", "Nederlands", "latviešu", "русский", "Українська", "日本語", - "español", "português do Brasil", "Português de Portugal", "polski", "български", - "italiano", "suomi", "Türkçe", "čeština", "српски", "svenska", "한국어", "ελληνικά", - "فارسی", "magyar nyelv", "bahasa Indonesia", "മലയാളം"} + Names = defaultI18nNames() } ShowFooterBranding = Cfg.Section("other").Key("SHOW_FOOTER_BRANDING").MustBool(false) @@ -1054,8 +1058,8 @@ func parseAuthorizedPrincipalsAllow(values []string) ([]string, bool) { func loadInternalToken(sec *ini.Section) string { uri := sec.Key("INTERNAL_TOKEN_URI").String() - if len(uri) == 0 { - return loadOrGenerateInternalToken(sec) + if uri == "" { + return sec.Key("INTERNAL_TOKEN").String() } tempURI, err := url.Parse(uri) if err != nil { @@ -1092,21 +1096,17 @@ func loadInternalToken(sec *ini.Section) string { return "" } -func loadOrGenerateInternalToken(sec *ini.Section) string { - var err error - token := sec.Key("INTERNAL_TOKEN").String() - if len(token) == 0 { - token, err = generate.NewInternalToken() - if err != nil { - log.Fatal("Error generate internal token: %v", err) - } - - // Save secret - CreateOrAppendToCustomConf(func(cfg *ini.File) { - cfg.Section("security").Key("INTERNAL_TOKEN").SetValue(token) - }) +// generateSaveInternalToken generates and saves the internal token to app.ini +func generateSaveInternalToken() { + token, err := generate.NewInternalToken() + if err != nil { + log.Fatal("Error generate internal token: %v", err) } - return token + + InternalToken = token + CreateOrAppendToCustomConf(func(cfg *ini.File) { + cfg.Section("security").Key("INTERNAL_TOKEN").SetValue(token) + }) } // MakeAbsoluteAssetURL returns the absolute asset url prefix without a trailing slash @@ -1186,6 +1186,8 @@ func CreateOrAppendToCustomConf(callback func(cfg *ini.File)) { callback(cfg) + log.Info("Settings saved to: %q", CustomConf) + if err := os.MkdirAll(filepath.Dir(CustomConf), os.ModePerm); err != nil { log.Fatal("failed to create '%s': %v", CustomConf, err) return |