MM-9547 Added config setting to control url autolinking schemes (#8862)
* MM-9547 Added config setting to control autolinking schemes * Renamed AutolinkingSchemes to CustomUrlSchemes
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
81852ab191
Коммит
2fe8878749
@@ -97,6 +97,7 @@
|
|||||||
"ExperimentalPrimaryTeam": ""
|
"ExperimentalPrimaryTeam": ""
|
||||||
},
|
},
|
||||||
"DisplaySettings": {
|
"DisplaySettings": {
|
||||||
|
"CustomUrlSchemes": [],
|
||||||
"ExperimentalTimezone": false
|
"ExperimentalTimezone": false
|
||||||
},
|
},
|
||||||
"ClientRequirements": {
|
"ClientRequirements": {
|
||||||
|
|||||||
@@ -4950,6 +4950,10 @@
|
|||||||
"id": "model.config.is_valid.data_retention.message_retention_days_too_low.app_error",
|
"id": "model.config.is_valid.data_retention.message_retention_days_too_low.app_error",
|
||||||
"translation": "Message retention must be one day or longer."
|
"translation": "Message retention must be one day or longer."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "model.config.is_valid.display.custom_url_schemes.app_error",
|
||||||
|
"translation": "The custom URL scheme {{.Scheme}} is invalid. Custom URL schemes must start with a letter and contain only letters, numbers, plus (+), period (.), and hyphen (-)."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "model.config.is_valid.elastic_search.aggregate_posts_after_days.app_error",
|
"id": "model.config.is_valid.elastic_search.aggregate_posts_after_days.app_error",
|
||||||
"translation": "Elasticsearch AggregatePostsAfterDays setting must be a number greater than or equal to 1"
|
"translation": "Elasticsearch AggregatePostsAfterDays setting must be a number greater than or equal to 1"
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -1772,10 +1773,16 @@ func (s *MessageExportSettings) SetDefaults() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type DisplaySettings struct {
|
type DisplaySettings struct {
|
||||||
|
CustomUrlSchemes *[]string
|
||||||
ExperimentalTimezone *bool
|
ExperimentalTimezone *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DisplaySettings) SetDefaults() {
|
func (s *DisplaySettings) SetDefaults() {
|
||||||
|
if s.CustomUrlSchemes == nil {
|
||||||
|
customUrlSchemes := []string{}
|
||||||
|
s.CustomUrlSchemes = &customUrlSchemes
|
||||||
|
}
|
||||||
|
|
||||||
if s.ExperimentalTimezone == nil {
|
if s.ExperimentalTimezone == nil {
|
||||||
s.ExperimentalTimezone = NewBool(false)
|
s.ExperimentalTimezone = NewBool(false)
|
||||||
}
|
}
|
||||||
@@ -1968,6 +1975,10 @@ func (o *Config) IsValid() *AppError {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := o.DisplaySettings.isValid(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2348,6 +2359,26 @@ func (mes *MessageExportSettings) isValid(fs FileSettings) *AppError {
|
|||||||
return nil
|
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 {
|
func (o *Config) GetSanitizeOptions() map[string]bool {
|
||||||
options := map[string]bool{}
|
options := map[string]bool{}
|
||||||
options["fullname"] = o.PrivacySettings.ShowFullName
|
options["fullname"] = o.PrivacySettings.ShowFullName
|
||||||
|
|||||||
@@ -436,3 +436,86 @@ func TestMessageExportSetDefaultsExportDisabledExportFromTimestampNonZero(t *tes
|
|||||||
require.Equal(t, int64(0), *mes.ExportFromTimestamp)
|
require.Equal(t, int64(0), *mes.ExportFromTimestamp)
|
||||||
require.Equal(t, 10000, *mes.BatchSize)
|
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")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -609,6 +609,7 @@ func GenerateClientConfig(c *model.Config, diagnosticId string, license *model.L
|
|||||||
props["PasswordRequireUppercase"] = strconv.FormatBool(*c.PasswordSettings.Uppercase)
|
props["PasswordRequireUppercase"] = strconv.FormatBool(*c.PasswordSettings.Uppercase)
|
||||||
props["PasswordRequireNumber"] = strconv.FormatBool(*c.PasswordSettings.Number)
|
props["PasswordRequireNumber"] = strconv.FormatBool(*c.PasswordSettings.Number)
|
||||||
props["PasswordRequireSymbol"] = strconv.FormatBool(*c.PasswordSettings.Symbol)
|
props["PasswordRequireSymbol"] = strconv.FormatBool(*c.PasswordSettings.Symbol)
|
||||||
|
props["CustomUrlSchemes"] = strings.Join(*c.DisplaySettings.CustomUrlSchemes, ",")
|
||||||
|
|
||||||
if license != nil {
|
if license != nil {
|
||||||
props["ExperimentalHideTownSquareinLHS"] = strconv.FormatBool(*c.TeamSettings.ExperimentalHideTownSquareinLHS)
|
props["ExperimentalHideTownSquareinLHS"] = strconv.FormatBool(*c.TeamSettings.ExperimentalHideTownSquareinLHS)
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user