[MM-51329] server/config: add validation for local mode socket file (#23180)

Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2023-05-04 10:17:05 +03:00
коммит произвёл GitHub
родитель b2e0aa7088
Коммит a496c14cc2
3 изменённых файлов: 65 добавлений и 27 удалений

Просмотреть файл

@@ -8811,6 +8811,10 @@
"id": "model.config.is_valid.listen_address.app_error", "id": "model.config.is_valid.listen_address.app_error",
"translation": "Invalid listen address for service settings Must be set." "translation": "Invalid listen address for service settings Must be set."
}, },
{
"id": "model.config.is_valid.local_mode_socket.app_error",
"translation": "Unable to locate local socket file directory."
},
{ {
"id": "model.config.is_valid.localization.available_locales.app_error", "id": "model.config.is_valid.localization.available_locales.app_error",
"translation": "Available Languages must contain Default Client Language." "translation": "Available Languages must contain Default Client Language."

Просмотреть файл

@@ -12,6 +12,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"os" "os"
"path/filepath"
"reflect" "reflect"
"regexp" "regexp"
"strconv" "strconv"
@@ -3749,6 +3750,16 @@ func (s *ServiceSettings) isValid() *AppError {
return NewAppError("Config.IsValid", "model.config.is_valid.collapsed_threads.app_error", nil, "", http.StatusBadRequest) return NewAppError("Config.IsValid", "model.config.is_valid.collapsed_threads.app_error", nil, "", http.StatusBadRequest)
} }
// we check if file has a valid parent, the server will try to create the socket
// file if it doesn't exist, but we need to be sure if the directory exist or not
if *s.EnableLocalMode {
parent := filepath.Dir(*s.LocalModeSocketLocation)
_, err := os.Stat(parent)
if err != nil {
return NewAppError("Config.IsValid", "model.config.is_valid.local_mode_socket.app_error", nil, err.Error(), http.StatusBadRequest)
}
}
return nil return nil
} }

Просмотреть файл

@@ -1409,40 +1409,63 @@ func TestConfigExportSettingsIsValid(t *testing.T) {
} }
func TestConfigServiceSettingsIsValid(t *testing.T) { func TestConfigServiceSettingsIsValid(t *testing.T) {
cfg := Config{} t.Run("local socket file should exist if local mode enabled", func(t *testing.T) {
cfg.SetDefaults() cfg := Config{}
cfg.SetDefaults()
appErr := cfg.ServiceSettings.isValid() appErr := cfg.ServiceSettings.isValid()
require.Nil(t, appErr) require.Nil(t, appErr)
*cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsDisabled *cfg.ServiceSettings.EnableLocalMode = false
appErr = cfg.ServiceSettings.isValid() // we don't need to check as local mode is not enabled
require.Nil(t, appErr) *cfg.ServiceSettings.LocalModeSocketLocation = "an_invalid_path.socket"
appErr = cfg.ServiceSettings.isValid()
require.Nil(t, appErr)
*cfg.ServiceSettings.ThreadAutoFollow = false // now we can check if the file exist or not
appErr = cfg.ServiceSettings.isValid() *cfg.ServiceSettings.EnableLocalMode = true
require.Nil(t, appErr) *cfg.ServiceSettings.LocalModeSocketLocation = "/invalid_directory/mattermost_local.socket"
appErr = cfg.ServiceSettings.isValid()
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.local_mode_socket.app_error", appErr.Id)
})
*cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsDefaultOff t.Run("CRT settings should have consistent values", func(t *testing.T) {
appErr = cfg.ServiceSettings.isValid() cfg := Config{}
require.NotNil(t, appErr) cfg.SetDefaults()
require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", appErr.Id)
*cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsDefaultOn appErr := cfg.ServiceSettings.isValid()
appErr = cfg.ServiceSettings.isValid() require.Nil(t, appErr)
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", appErr.Id)
*cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsAlwaysOn *cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsDisabled
appErr = cfg.ServiceSettings.isValid() appErr = cfg.ServiceSettings.isValid()
require.NotNil(t, appErr) require.Nil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", appErr.Id)
*cfg.ServiceSettings.ThreadAutoFollow = true *cfg.ServiceSettings.ThreadAutoFollow = false
*cfg.ServiceSettings.CollapsedThreads = "test_status" appErr = cfg.ServiceSettings.isValid()
appErr = cfg.ServiceSettings.isValid() require.Nil(t, appErr)
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.app_error", appErr.Id) *cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsDefaultOff
appErr = cfg.ServiceSettings.isValid()
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", appErr.Id)
*cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsDefaultOn
appErr = cfg.ServiceSettings.isValid()
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", appErr.Id)
*cfg.ServiceSettings.CollapsedThreads = CollapsedThreadsAlwaysOn
appErr = cfg.ServiceSettings.isValid()
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.autofollow.app_error", appErr.Id)
*cfg.ServiceSettings.ThreadAutoFollow = true
*cfg.ServiceSettings.CollapsedThreads = "test_status"
appErr = cfg.ServiceSettings.isValid()
require.NotNil(t, appErr)
require.Equal(t, "model.config.is_valid.collapsed_threads.app_error", appErr.Id)
})
} }
func TestConfigDefaultCallsPluginState(t *testing.T) { func TestConfigDefaultCallsPluginState(t *testing.T) {