github.com/qichengzx/mattermost-server@v4.5.1-0.20180604164826-2c75247c97d0+incompatible/model/scheme.go (about) 1 // Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "io" 10 "regexp" 11 ) 12 13 const ( 14 SCHEME_DISPLAY_NAME_MAX_LENGTH = 128 15 SCHEME_NAME_MAX_LENGTH = 64 16 SCHEME_DESCRIPTION_MAX_LENGTH = 1024 17 SCHEME_SCOPE_TEAM = "team" 18 SCHEME_SCOPE_CHANNEL = "channel" 19 ) 20 21 type Scheme struct { 22 Id string `json:"id"` 23 Name string `json:"name"` 24 DisplayName string `json:"display_name"` 25 Description string `json:"description"` 26 CreateAt int64 `json:"create_at"` 27 UpdateAt int64 `json:"update_at"` 28 DeleteAt int64 `json:"delete_at"` 29 Scope string `json:"scope"` 30 DefaultTeamAdminRole string `json:"default_team_admin_role"` 31 DefaultTeamUserRole string `json:"default_team_user_role"` 32 DefaultChannelAdminRole string `json:"default_channel_admin_role"` 33 DefaultChannelUserRole string `json:"default_channel_user_role"` 34 } 35 36 type SchemePatch struct { 37 Name *string `json:"name"` 38 DisplayName *string `json:"display_name"` 39 Description *string `json:"description"` 40 } 41 42 type SchemeIDPatch struct { 43 SchemeID *string `json:"scheme_id"` 44 } 45 46 // SchemeConveyor is used for importing and exporting a Scheme and its associated Roles. 47 type SchemeConveyor struct { 48 Name string `json:"name"` 49 DisplayName string `json:"display_name"` 50 Description string `json:"description"` 51 Scope string `json:"scope"` 52 TeamAdmin string `json:"default_team_admin_role"` 53 TeamUser string `json:"default_team_user_role"` 54 ChannelAdmin string `json:"default_channel_admin_role"` 55 ChannelUser string `json:"default_channel_user_role"` 56 Roles []*Role `json:"roles"` 57 } 58 59 func (sc *SchemeConveyor) Scheme() *Scheme { 60 return &Scheme{ 61 DisplayName: sc.DisplayName, 62 Name: sc.Name, 63 Description: sc.Description, 64 Scope: sc.Scope, 65 DefaultTeamAdminRole: sc.TeamAdmin, 66 DefaultTeamUserRole: sc.TeamUser, 67 DefaultChannelAdminRole: sc.ChannelAdmin, 68 DefaultChannelUserRole: sc.ChannelUser, 69 } 70 } 71 72 func (scheme *Scheme) ToJson() string { 73 b, _ := json.Marshal(scheme) 74 return string(b) 75 } 76 77 func SchemeFromJson(data io.Reader) *Scheme { 78 var scheme *Scheme 79 json.NewDecoder(data).Decode(&scheme) 80 return scheme 81 } 82 83 func SchemesToJson(schemes []*Scheme) string { 84 b, _ := json.Marshal(schemes) 85 return string(b) 86 } 87 88 func SchemesFromJson(data io.Reader) []*Scheme { 89 var schemes []*Scheme 90 if err := json.NewDecoder(data).Decode(&schemes); err == nil { 91 return schemes 92 } else { 93 return nil 94 } 95 } 96 97 func (scheme *Scheme) IsValid() bool { 98 if len(scheme.Id) != 26 { 99 return false 100 } 101 102 return scheme.IsValidForCreate() 103 } 104 105 func (scheme *Scheme) IsValidForCreate() bool { 106 if len(scheme.DisplayName) == 0 || len(scheme.DisplayName) > SCHEME_DISPLAY_NAME_MAX_LENGTH { 107 return false 108 } 109 110 if !IsValidSchemeName(scheme.Name) { 111 return false 112 } 113 114 if len(scheme.Description) > SCHEME_DESCRIPTION_MAX_LENGTH { 115 return false 116 } 117 118 switch scheme.Scope { 119 case SCHEME_SCOPE_TEAM, SCHEME_SCOPE_CHANNEL: 120 default: 121 return false 122 } 123 124 if !IsValidRoleName(scheme.DefaultChannelAdminRole) { 125 return false 126 } 127 128 if !IsValidRoleName(scheme.DefaultChannelUserRole) { 129 return false 130 } 131 132 if scheme.Scope == SCHEME_SCOPE_TEAM { 133 if !IsValidRoleName(scheme.DefaultTeamAdminRole) { 134 return false 135 } 136 137 if !IsValidRoleName(scheme.DefaultTeamUserRole) { 138 return false 139 } 140 } 141 142 if scheme.Scope == SCHEME_SCOPE_CHANNEL { 143 if len(scheme.DefaultTeamAdminRole) != 0 { 144 return false 145 } 146 147 if len(scheme.DefaultTeamUserRole) != 0 { 148 return false 149 } 150 } 151 152 return true 153 } 154 155 func (scheme *Scheme) Patch(patch *SchemePatch) { 156 if patch.DisplayName != nil { 157 scheme.DisplayName = *patch.DisplayName 158 } 159 if patch.Name != nil { 160 scheme.Name = *patch.Name 161 } 162 if patch.Description != nil { 163 scheme.Description = *patch.Description 164 } 165 } 166 167 func (patch *SchemePatch) ToJson() string { 168 b, _ := json.Marshal(patch) 169 return string(b) 170 } 171 172 func SchemePatchFromJson(data io.Reader) *SchemePatch { 173 var patch *SchemePatch 174 json.NewDecoder(data).Decode(&patch) 175 return patch 176 } 177 178 func SchemeIDFromJson(data io.Reader) *string { 179 var p *SchemeIDPatch 180 json.NewDecoder(data).Decode(&p) 181 return p.SchemeID 182 } 183 184 func (p *SchemeIDPatch) ToJson() string { 185 b, _ := json.Marshal(p) 186 return string(b) 187 } 188 189 func IsValidSchemeName(name string) bool { 190 re := regexp.MustCompile(fmt.Sprintf("^[a-z0-9_]{0,%d}$", SCHEME_NAME_MAX_LENGTH)) 191 return re.MatchString(name) 192 }