MM-9547 Added config setting to control url autolinking schemes (#8862)

* MM-9547 Added config setting to control autolinking schemes

* Renamed AutolinkingSchemes to CustomUrlSchemes
Этот коммит содержится в:
Harrison Healey
2018-05-30 10:48:04 -04:00
коммит произвёл GitHub
родитель 81852ab191
Коммит 2fe8878749
5 изменённых файлов: 120 добавлений и 0 удалений

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

@@ -8,6 +8,7 @@ import (
"io"
"net/http"
"net/url"
"regexp"
"strings"
"time"
)
@@ -1772,10 +1773,16 @@ func (s *MessageExportSettings) SetDefaults() {
}
type DisplaySettings struct {
CustomUrlSchemes *[]string
ExperimentalTimezone *bool
}
func (s *DisplaySettings) SetDefaults() {
if s.CustomUrlSchemes == nil {
customUrlSchemes := []string{}
s.CustomUrlSchemes = &customUrlSchemes
}
if s.ExperimentalTimezone == nil {
s.ExperimentalTimezone = NewBool(false)
}
@@ -1968,6 +1975,10 @@ func (o *Config) IsValid() *AppError {
return err
}
if err := o.DisplaySettings.isValid(); err != nil {
return err
}
return nil
}
@@ -2348,6 +2359,26 @@ func (mes *MessageExportSettings) isValid(fs FileSettings) *AppError {
return nil
}
func (ds *DisplaySettings) isValid() *AppError {
if len(*ds.CustomUrlSchemes) != 0 {
validProtocolPattern := regexp.MustCompile(`(?i)^\s*[a-z][a-z0-9+.-]*\s*$`)
for _, scheme := range *ds.CustomUrlSchemes {
if !validProtocolPattern.MatchString(scheme) {
return NewAppError(
"Config.IsValid",
"model.config.is_valid.display.custom_url_schemes.app_error",
map[string]interface{}{"Protocol": scheme},
"",
http.StatusBadRequest,
)
}
}
}
return nil
}
func (o *Config) GetSanitizeOptions() map[string]bool {
options := map[string]bool{}
options["fullname"] = o.PrivacySettings.ShowFullName

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

@@ -436,3 +436,86 @@ func TestMessageExportSetDefaultsExportDisabledExportFromTimestampNonZero(t *tes
require.Equal(t, int64(0), *mes.ExportFromTimestamp)
require.Equal(t, 10000, *mes.BatchSize)
}
func TestDisplaySettingsIsValidCustomUrlSchemes(t *testing.T) {
tests := []struct {
name string
value []string
valid bool
}{
{
name: "empty",
value: []string{},
valid: true,
},
{
name: "custom protocol",
value: []string{"steam"},
valid: true,
},
{
name: "multiple custom protocols",
value: []string{"bitcoin", "rss", "redis"},
valid: true,
},
{
name: "containing numbers",
value: []string{"ut2004", "ts3server", "h323"},
valid: true,
},
{
name: "containing period",
value: []string{"iris.beep"},
valid: true,
},
{
name: "containing hyphen",
value: []string{"ms-excel"},
valid: true,
},
{
name: "containing plus",
value: []string{"coap+tcp", "coap+ws"},
valid: true,
},
{
name: "starting with number",
value: []string{"4four"},
valid: false,
},
{
name: "starting with period",
value: []string{"data", ".dot"},
valid: false,
},
{
name: "starting with hyphen",
value: []string{"-hyphen", "dns"},
valid: false,
},
{
name: "invalid symbols",
value: []string{"!!fun!!"},
valid: false,
},
{
name: "invalid letters",
value: []string{"école"},
valid: false,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
ds := &DisplaySettings{}
ds.SetDefaults()
ds.CustomUrlSchemes = &test.value
if err := ds.isValid(); err != nil && test.valid {
t.Error("Expected CustomUrlSchemes to be valid but got error:", err)
} else if err == nil && !test.valid {
t.Error("Expected CustomUrlSchemes to be invalid but got no error")
}
})
}
}