diff options
Diffstat (limited to 'vendor/github.com/mattermost/mattermost-server/v6/model/preference.go')
-rw-r--r-- | vendor/github.com/mattermost/mattermost-server/v6/model/preference.go | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/vendor/github.com/mattermost/mattermost-server/v6/model/preference.go b/vendor/github.com/mattermost/mattermost-server/v6/model/preference.go new file mode 100644 index 00000000..41a58235 --- /dev/null +++ b/vendor/github.com/mattermost/mattermost-server/v6/model/preference.go @@ -0,0 +1,122 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package model + +import ( + "encoding/json" + "net/http" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + PreferenceCategoryDirectChannelShow = "direct_channel_show" + PreferenceCategoryGroupChannelShow = "group_channel_show" + PreferenceCategoryTutorialSteps = "tutorial_step" + PreferenceCategoryAdvancedSettings = "advanced_settings" + PreferenceCategoryFlaggedPost = "flagged_post" + PreferenceCategoryFavoriteChannel = "favorite_channel" + PreferenceCategorySidebarSettings = "sidebar_settings" + + PreferenceCategoryDisplaySettings = "display_settings" + PreferenceNameCollapsedThreadsEnabled = "collapsed_reply_threads" + PreferenceNameChannelDisplayMode = "channel_display_mode" + PreferenceNameCollapseSetting = "collapse_previews" + PreferenceNameMessageDisplay = "message_display" + PreferenceNameNameFormat = "name_format" + PreferenceNameUseMilitaryTime = "use_military_time" + PreferenceRecommendedNextSteps = "recommended_next_steps" + + PreferenceCategoryTheme = "theme" + // the name for theme props is the team id + + PreferenceCategoryAuthorizedOAuthApp = "oauth_app" + // the name for oauth_app is the client_id and value is the current scope + + PreferenceCategoryLast = "last" + PreferenceNameLastChannel = "channel" + PreferenceNameLastTeam = "team" + + PreferenceCategoryCustomStatus = "custom_status" + PreferenceNameRecentCustomStatuses = "recent_custom_statuses" + PreferenceNameCustomStatusTutorialState = "custom_status_tutorial_state" + + PreferenceCustomStatusModalViewed = "custom_status_modal_viewed" + + PreferenceCategoryNotifications = "notifications" + PreferenceNameEmailInterval = "email_interval" + + PreferenceEmailIntervalNoBatchingSeconds = "30" // the "immediate" setting is actually 30s + PreferenceEmailIntervalBatchingSeconds = "900" // fifteen minutes is 900 seconds + PreferenceEmailIntervalImmediately = "immediately" + PreferenceEmailIntervalFifteen = "fifteen" + PreferenceEmailIntervalFifteenAsSeconds = "900" + PreferenceEmailIntervalHour = "hour" + PreferenceEmailIntervalHourAsSeconds = "3600" +) + +type Preference struct { + UserId string `json:"user_id"` + Category string `json:"category"` + Name string `json:"name"` + Value string `json:"value"` +} + +type Preferences []Preference + +func (o *Preference) IsValid() *AppError { + if !IsValidId(o.UserId) { + return NewAppError("Preference.IsValid", "model.preference.is_valid.id.app_error", nil, "user_id="+o.UserId, http.StatusBadRequest) + } + + if o.Category == "" || len(o.Category) > 32 { + return NewAppError("Preference.IsValid", "model.preference.is_valid.category.app_error", nil, "category="+o.Category, http.StatusBadRequest) + } + + if len(o.Name) > 32 { + return NewAppError("Preference.IsValid", "model.preference.is_valid.name.app_error", nil, "name="+o.Name, http.StatusBadRequest) + } + + if utf8.RuneCountInString(o.Value) > 2000 { + return NewAppError("Preference.IsValid", "model.preference.is_valid.value.app_error", nil, "value="+o.Value, http.StatusBadRequest) + } + + if o.Category == PreferenceCategoryTheme { + var unused map[string]string + if err := json.NewDecoder(strings.NewReader(o.Value)).Decode(&unused); err != nil { + return NewAppError("Preference.IsValid", "model.preference.is_valid.theme.app_error", nil, "value="+o.Value, http.StatusBadRequest) + } + } + + return nil +} + +func (o *Preference) PreUpdate() { + if o.Category == PreferenceCategoryTheme { + // 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) + } + } +} |