diff options
Diffstat (limited to 'utils/config.go')
-rw-r--r-- | utils/config.go | 108 |
1 files changed, 86 insertions, 22 deletions
diff --git a/utils/config.go b/utils/config.go index 64085fcff..e42c2820b 100644 --- a/utils/config.go +++ b/utils/config.go @@ -16,8 +16,8 @@ import ( "strings" "github.com/fsnotify/fsnotify" + "github.com/mattermost/viper" "github.com/pkg/errors" - "github.com/spf13/viper" "net/http" @@ -32,36 +32,96 @@ const ( LOG_FILENAME = "mattermost.log" ) -// FindConfigFile attempts to find an existing configuration file. fileName can be an absolute or -// relative path or name such as "/opt/mattermost/config.json" or simply "config.json". An empty -// string is returned if no configuration is found. -func FindConfigFile(fileName string) (path string) { - if filepath.IsAbs(fileName) { - if _, err := os.Stat(fileName); err == nil { - return fileName +var ( + commonBaseSearchPaths = []string{ + ".", + "..", + "../..", + "../../..", + } +) + +func FindPath(path string, baseSearchPaths []string, filter func(os.FileInfo) bool) string { + if filepath.IsAbs(path) { + if _, err := os.Stat(path); err == nil { + return path } - } else { - for _, dir := range []string{"./config", "../config", "../../config", "../../../config", "."} { - path, _ := filepath.Abs(filepath.Join(dir, fileName)) - if _, err := os.Stat(path); err == nil { - return path + + return "" + } + + searchPaths := []string{} + for _, baseSearchPath := range baseSearchPaths { + searchPaths = append(searchPaths, baseSearchPath) + } + + // Additionally attempt to search relative to the location of the running binary. + var binaryDir string + if exe, err := os.Executable(); err == nil { + if exe, err = filepath.EvalSymlinks(exe); err == nil { + if exe, err = filepath.Abs(exe); err == nil { + binaryDir = filepath.Dir(exe) } } } - return "" -} + if binaryDir != "" { + for _, baseSearchPath := range baseSearchPaths { + searchPaths = append( + searchPaths, + filepath.Join(binaryDir, baseSearchPath), + ) + } + } -// FindDir looks for the given directory in nearby ancestors, falling back to `./` if not found. -func FindDir(dir string) (string, bool) { - for _, parent := range []string{".", "..", "../..", "../../.."} { - foundDir, err := filepath.Abs(filepath.Join(parent, dir)) + for _, parent := range searchPaths { + found, err := filepath.Abs(filepath.Join(parent, path)) if err != nil { continue - } else if _, err := os.Stat(foundDir); err == nil { - return foundDir, true + } else if fileInfo, err := os.Stat(found); err == nil { + if filter != nil { + if filter(fileInfo) { + return found + } + } else { + return found + } } } - return "./", false + + return "" +} + +// FindConfigFile attempts to find an existing configuration file. fileName can be an absolute or +// relative path or name such as "/opt/mattermost/config.json" or simply "config.json". An empty +// string is returned if no configuration is found. +func FindConfigFile(fileName string) (path string) { + found := FindFile(filepath.Join("config", fileName)) + if found == "" { + found = FindPath(fileName, []string{"."}, nil) + } + + return found +} + +// FindFile looks for the given file in nearby ancestors relative to the current working +// directory as well as the directory of the executable. +func FindFile(path string) string { + return FindPath(path, commonBaseSearchPaths, func(fileInfo os.FileInfo) bool { + return !fileInfo.IsDir() + }) +} + +// FindDir looks for the given directory in nearby ancestors relative to the current working +// directory as well as the directory of the executable, falling back to `./` if not found. +func FindDir(dir string) (string, bool) { + found := FindPath(dir, commonBaseSearchPaths, func(fileInfo os.FileInfo) bool { + return fileInfo.IsDir() + }) + if found == "" { + return "./", false + } + + return found, true } func MloggerConfigFromLoggerConfig(s *model.LogSettings) *mlog.LoggerConfiguration { @@ -652,6 +712,10 @@ func GenerateClientConfig(c *model.Config, diagnosticId string, license *model.L props["SamlLoginButtonColor"] = *c.SamlSettings.LoginButtonColor props["SamlLoginButtonBorderColor"] = *c.SamlSettings.LoginButtonBorderColor props["SamlLoginButtonTextColor"] = *c.SamlSettings.LoginButtonTextColor + + // do this under the correct licensed feature + props["ExperimentalClientSideCertEnable"] = strconv.FormatBool(*c.ExperimentalSettings.ClientSideCertEnable) + props["ExperimentalClientSideCertCheck"] = *c.ExperimentalSettings.ClientSideCertCheck } if *license.Features.Cluster { |