diff options
Diffstat (limited to 'model')
-rw-r--r-- | model/client.go | 10 | ||||
-rw-r--r-- | model/preference.go | 44 | ||||
-rw-r--r-- | model/preference_test.go | 39 | ||||
-rw-r--r-- | model/user.go | 21 | ||||
-rw-r--r-- | model/user_test.go | 13 |
5 files changed, 88 insertions, 39 deletions
diff --git a/model/client.go b/model/client.go index 5ccf2c63c..e12cd595d 100644 --- a/model/client.go +++ b/model/client.go @@ -1556,6 +1556,16 @@ func (c *Client) GetPreferenceCategory(category string) (*Result, *AppError) { } } +// DeletePreferences deletes a list of preferences owned by the current user. If successful, +// it will return status=ok. Otherwise, an error will be returned. +func (c *Client) DeletePreferences(preferences *Preferences) (bool, *AppError) { + if r, err := c.DoApiPost("/preferences/delete", preferences.ToJson()); err != nil { + return false, err + } else { + return c.CheckStatusOK(r), nil + } +} + func (c *Client) CreateOutgoingWebhook(hook *OutgoingWebhook) (*Result, *AppError) { if r, err := c.DoApiPost(c.GetTeamRoute()+"/hooks/outgoing/create", hook.ToJson()); err != nil { return nil, err diff --git a/model/preference.go b/model/preference.go index 22858e043..779c41e50 100644 --- a/model/preference.go +++ b/model/preference.go @@ -6,6 +6,8 @@ package model import ( "encoding/json" "io" + "regexp" + "strings" "unicode/utf8" ) @@ -17,6 +19,9 @@ const ( PREFERENCE_CATEGORY_DISPLAY_SETTINGS = "display_settings" PREFERENCE_NAME_COLLAPSE_SETTING = "collapse_previews" + PREFERENCE_CATEGORY_THEME = "theme" + // the name for theme props is the team id + PREFERENCE_CATEGORY_LAST = "last" PREFERENCE_NAME_LAST_CHANNEL = "channel" ) @@ -57,13 +62,48 @@ func (o *Preference) IsValid() *AppError { return NewLocAppError("Preference.IsValid", "model.preference.is_valid.category.app_error", nil, "category="+o.Category) } - if len(o.Name) == 0 || len(o.Name) > 32 { + if len(o.Name) > 32 { return NewLocAppError("Preference.IsValid", "model.preference.is_valid.name.app_error", nil, "name="+o.Name) } - if utf8.RuneCountInString(o.Value) > 128 { + if utf8.RuneCountInString(o.Value) > 2000 { return NewLocAppError("Preference.IsValid", "model.preference.is_valid.value.app_error", nil, "value="+o.Value) } + if o.Category == PREFERENCE_CATEGORY_THEME { + var unused map[string]string + if err := json.NewDecoder(strings.NewReader(o.Value)).Decode(&unused); err != nil { + return NewLocAppError("Preference.IsValid", "model.preference.is_valid.theme.app_error", nil, "value="+o.Value) + } + } + return nil } + +func (o *Preference) PreUpdate() { + if o.Category == PREFERENCE_CATEGORY_THEME { + // decode the value of theme (a map of strings to string) and eliminate any invalid values + var props map[string]string + if err := json.NewDecoder(strings.NewReader(o.Value)).Decode(&props); err != nil { + // just continue, the invalid preference value should get caught by IsValid before saving + return + } + + colorPattern := regexp.MustCompile(`^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$`) + + // blank out any invalid theme values + for name, value := range props { + if name == "image" || name == "type" || name == "codeTheme" { + continue + } + + if !colorPattern.MatchString(value) { + props[name] = "#ffffff" + } + } + + if b, err := json.Marshal(props); err == nil { + o.Value = string(b) + } + } +} diff --git a/model/preference_test.go b/model/preference_test.go index e29250bba..df7fe612d 100644 --- a/model/preference_test.go +++ b/model/preference_test.go @@ -4,6 +4,7 @@ package model import ( + "encoding/json" "strings" "testing" ) @@ -31,7 +32,7 @@ func TestPreferenceIsValid(t *testing.T) { preference.Category = PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW if err := preference.IsValid(); err != nil { - t.Fatal() + t.Fatal(err) } preference.Name = strings.Repeat("01234567890", 20) @@ -41,16 +42,48 @@ func TestPreferenceIsValid(t *testing.T) { preference.Name = NewId() if err := preference.IsValid(); err != nil { - t.Fatal() + t.Fatal(err) } - preference.Value = strings.Repeat("01234567890", 20) + preference.Value = strings.Repeat("01234567890", 201) if err := preference.IsValid(); err == nil { t.Fatal() } preference.Value = "1234garbage" if err := preference.IsValid(); err != nil { + t.Fatal(err) + } + + preference.Category = PREFERENCE_CATEGORY_THEME + if err := preference.IsValid(); err == nil { t.Fatal() } + + preference.Value = `{"color": "#ff0000", "color2": "#faf"}` + if err := preference.IsValid(); err != nil { + t.Fatal(err) + } +} + +func TestPreferencePreUpdate(t *testing.T) { + preference := Preference{ + Category: PREFERENCE_CATEGORY_THEME, + Value: `{"color": "#ff0000", "color2": "#faf", "codeTheme": "github", "invalid": "invalid"}`, + } + + preference.PreUpdate() + + var props map[string]string + if err := json.NewDecoder(strings.NewReader(preference.Value)).Decode(&props); err != nil { + t.Fatal(err) + } + + if props["color"] != "#ff0000" || props["color2"] != "#faf" || props["codeTheme"] != "github" { + t.Fatal("shouldn't have changed valid props") + } + + if props["invalid"] == "invalid" { + t.Fatal("should have changed invalid prop") + } } diff --git a/model/user.go b/model/user.go index c792f80d1..4444352d3 100644 --- a/model/user.go +++ b/model/user.go @@ -49,7 +49,6 @@ type User struct { AllowMarketing bool `json:"allow_marketing,omitempty"` Props StringMap `json:"props,omitempty"` NotifyProps StringMap `json:"notify_props,omitempty"` - ThemeProps StringMap `json:"theme_props,omitempty"` LastPasswordUpdate int64 `json:"last_password_update,omitempty"` LastPictureUpdate int64 `json:"last_picture_update,omitempty"` FailedAttempts int `json:"failed_attempts,omitempty"` @@ -106,10 +105,6 @@ func (u *User) IsValid() *AppError { return NewLocAppError("User.IsValid", "model.user.is_valid.auth_data_pwd.app_error", nil, "user_id="+u.Id) } - if len(u.ThemeProps) > 2000 { - return NewLocAppError("User.IsValid", "model.user.is_valid.theme.app_error", nil, "user_id="+u.Id) - } - return nil } @@ -179,21 +174,6 @@ func (u *User) PreUpdate() { } u.NotifyProps["mention_keys"] = strings.Join(goodKeys, ",") } - - if u.ThemeProps != nil { - colorPattern := regexp.MustCompile(`^#[0-9a-fA-F]{3}([0-9a-fA-F]{3})?$`) - - // blank out any invalid theme values - for name, value := range u.ThemeProps { - if name == "image" || name == "type" || name == "codeTheme" { - continue - } - - if !colorPattern.MatchString(value) { - u.ThemeProps[name] = "#ffffff" - } - } - } } func (u *User) SetDefaultNotifications() { @@ -282,7 +262,6 @@ func (u *User) ClearNonProfileFields() { u.AllowMarketing = false u.Props = StringMap{} u.NotifyProps = StringMap{} - u.ThemeProps = StringMap{} u.LastPasswordUpdate = 0 u.LastPictureUpdate = 0 u.FailedAttempts = 0 diff --git a/model/user_test.go b/model/user_test.go index 899542a05..16ac2583b 100644 --- a/model/user_test.go +++ b/model/user_test.go @@ -39,19 +39,6 @@ func TestUserPreSave(t *testing.T) { func TestUserPreUpdate(t *testing.T) { user := User{Password: "test"} user.PreUpdate() - - user.ThemeProps = StringMap{ - "codeTheme": "github", - "awayIndicator": "#cdbd4e", - "buttonColor": "invalid", - } - user.PreUpdate() - - if user.ThemeProps["codeTheme"] != "github" || user.ThemeProps["awayIndicator"] != "#cdbd4e" { - t.Fatal("shouldn't have changed valid theme props") - } else if user.ThemeProps["buttonColor"] != "#ffffff" { - t.Fatal("should've changed invalid theme prop") - } } func TestUserUpdateMentionKeysFromUsername(t *testing.T) { |