diff --git a/server/channels/db/migrations/migrations.list b/server/channels/db/migrations/migrations.list index 17408699e4..1e16b6e0bf 100644 --- a/server/channels/db/migrations/migrations.list +++ b/server/channels/db/migrations/migrations.list @@ -240,6 +240,8 @@ channels/db/migrations/mysql/000120_create_channelbookmarks_table.down.sql channels/db/migrations/mysql/000120_create_channelbookmarks_table.up.sql channels/db/migrations/mysql/000121_remove_true_up_review_history.down.sql channels/db/migrations/mysql/000121_remove_true_up_review_history.up.sql +channels/db/migrations/mysql/000122_preferences_value_length.down.sql +channels/db/migrations/mysql/000122_preferences_value_length.up.sql channels/db/migrations/postgres/000001_create_teams.down.sql channels/db/migrations/postgres/000001_create_teams.up.sql channels/db/migrations/postgres/000002_create_team_members.down.sql @@ -480,3 +482,5 @@ channels/db/migrations/postgres/000120_create_channelbookmarks_table.down.sql channels/db/migrations/postgres/000120_create_channelbookmarks_table.up.sql channels/db/migrations/postgres/000121_remove_true_up_review_history.down.sql channels/db/migrations/postgres/000121_remove_true_up_review_history.up.sql +channels/db/migrations/postgres/000122_preferences_value_length.down.sql +channels/db/migrations/postgres/000122_preferences_value_length.up.sql diff --git a/server/channels/db/migrations/mysql/000122_preferences_value_length.down.sql b/server/channels/db/migrations/mysql/000122_preferences_value_length.down.sql new file mode 100644 index 0000000000..69a6cd447a --- /dev/null +++ b/server/channels/db/migrations/mysql/000122_preferences_value_length.down.sql @@ -0,0 +1 @@ +-- Only applicable to Postgres diff --git a/server/channels/db/migrations/mysql/000122_preferences_value_length.up.sql b/server/channels/db/migrations/mysql/000122_preferences_value_length.up.sql new file mode 100644 index 0000000000..69a6cd447a --- /dev/null +++ b/server/channels/db/migrations/mysql/000122_preferences_value_length.up.sql @@ -0,0 +1 @@ +-- Only applicable to Postgres diff --git a/server/channels/db/migrations/postgres/000122_preferences_value_length.down.sql b/server/channels/db/migrations/postgres/000122_preferences_value_length.down.sql new file mode 100644 index 0000000000..c98185f322 --- /dev/null +++ b/server/channels/db/migrations/postgres/000122_preferences_value_length.down.sql @@ -0,0 +1 @@ +ALTER TABLE Preferences ALTER COLUMN Value TYPE VARCHAR(2000); diff --git a/server/channels/db/migrations/postgres/000122_preferences_value_length.up.sql b/server/channels/db/migrations/postgres/000122_preferences_value_length.up.sql new file mode 100644 index 0000000000..d8055c89e4 --- /dev/null +++ b/server/channels/db/migrations/postgres/000122_preferences_value_length.up.sql @@ -0,0 +1 @@ +ALTER TABLE preferences ALTER COLUMN value TYPE text; diff --git a/server/public/model/preference.go b/server/public/model/preference.go index bd54a88f66..921e3611d2 100644 --- a/server/public/model/preference.go +++ b/server/public/model/preference.go @@ -60,6 +60,8 @@ const ( PreferenceEmailIntervalHour = "hour" PreferenceEmailIntervalHourAsSeconds = "3600" PreferenceCloudUserEphemeralInfo = "cloud_user_ephemeral_info" + + MaxPreferenceValueLength = 20000 ) type Preference struct { @@ -84,7 +86,7 @@ func (o *Preference) IsValid() *AppError { return NewAppError("Preference.IsValid", "model.preference.is_valid.name.app_error", nil, "name="+o.Name, http.StatusBadRequest) } - if utf8.RuneCountInString(o.Value) > 2000 { + if utf8.RuneCountInString(o.Value) > MaxPreferenceValueLength { return NewAppError("Preference.IsValid", "model.preference.is_valid.value.app_error", nil, "value="+o.Value, http.StatusBadRequest) } diff --git a/server/public/model/preference_test.go b/server/public/model/preference_test.go index b922ac19b1..231130cf98 100644 --- a/server/public/model/preference_test.go +++ b/server/public/model/preference_test.go @@ -18,34 +18,58 @@ func TestPreferenceIsValid(t *testing.T) { Name: NewId(), } - require.NotNil(t, preference.IsValid()) + t.Run("should require a user ID", func(t *testing.T) { + require.NotNil(t, preference.IsValid()) - preference.UserId = NewId() - require.Nil(t, preference.IsValid()) + preference.UserId = NewId() + require.Nil(t, preference.IsValid()) + }) - preference.Category = strings.Repeat("01234567890", 20) - require.NotNil(t, preference.IsValid()) + t.Run("should require a valid category", func(t *testing.T) { + preference.Category = strings.Repeat("01234567890", 20) + require.NotNil(t, preference.IsValid()) - preference.Category = PreferenceCategoryDirectChannelShow - require.Nil(t, preference.IsValid()) + preference.Category = PreferenceCategoryDirectChannelShow + require.Nil(t, preference.IsValid()) + }) - preference.Name = strings.Repeat("01234567890", 20) - require.NotNil(t, preference.IsValid()) + t.Run("should require a valid name", func(t *testing.T) { + preference.Name = strings.Repeat("01234567890", 20) + require.NotNil(t, preference.IsValid()) - preference.Name = NewId() - require.Nil(t, preference.IsValid()) + preference.Name = NewId() + require.Nil(t, preference.IsValid()) + }) - preference.Value = strings.Repeat("01234567890", 201) - require.NotNil(t, preference.IsValid()) + t.Run("should require a valid value", func(t *testing.T) { + preference.Value = strings.Repeat("01234567890", 2001) + require.NotNil(t, preference.IsValid()) - preference.Value = "1234garbage" - require.Nil(t, preference.IsValid()) + preference.Value = "1234garbage" + require.Nil(t, preference.IsValid()) + }) - preference.Category = PreferenceCategoryTheme - require.NotNil(t, preference.IsValid()) + t.Run("should validate that a theme preference's value is a map", func(t *testing.T) { + preference.Category = PreferenceCategoryTheme + require.NotNil(t, preference.IsValid()) - preference.Value = `{"color": "#ff0000", "color2": "#faf"}` - require.Nil(t, preference.IsValid()) + preference.Value = `{"color": "#ff0000", "color2": "#faf"}` + require.Nil(t, preference.IsValid()) + }) + + t.Run("MM-57913 should be able to store an array of 200 IDs for the team sidebar order preference", func(t *testing.T) { + preference.Category = "teams_order" + preference.Name = "" + + teamIds := make([]string, 200) + for i := range teamIds { + teamIds[i] = NewId() + } + teamIdsBytes, _ := json.Marshal(teamIds) + preference.Value = string(teamIdsBytes) + + require.Nil(t, preference.IsValid()) + }) } func TestPreferencePreUpdate(t *testing.T) {