github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/model/scheme.go (about) 1 // Copyright (c) 2015-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 DefaultTeamGuestRole string `json:"default_team_guest_role"` 35 DefaultChannelGuestRole string `json:"default_channel_guest_role"` 36 } 37 38 type SchemePatch struct { 39 Name *string `json:"name"` 40 DisplayName *string `json:"display_name"` 41 Description *string `json:"description"` 42 } 43 44 type SchemeIDPatch struct { 45 SchemeID *string `json:"scheme_id"` 46 } 47 48 // SchemeConveyor is used for importing and exporting a Scheme and its associated Roles. 49 type SchemeConveyor struct { 50 Name string `json:"name"` 51 DisplayName string `json:"display_name"` 52 Description string `json:"description"` 53 Scope string `json:"scope"` 54 TeamAdmin string `json:"default_team_admin_role"` 55 TeamUser string `json:"default_team_user_role"` 56 TeamGuest string `json:"default_team_guest_role"` 57 ChannelAdmin string `json:"default_channel_admin_role"` 58 ChannelUser string `json:"default_channel_user_role"` 59 ChannelGuest string `json:"default_channel_guest_role"` 60 Roles []*Role `json:"roles"` 61 } 62 63 func (sc *SchemeConveyor) Scheme() *Scheme { 64 return &Scheme{ 65 DisplayName: sc.DisplayName, 66 Name: sc.Name, 67 Description: sc.Description, 68 Scope: sc.Scope, 69 DefaultTeamAdminRole: sc.TeamAdmin, 70 DefaultTeamUserRole: sc.TeamUser, 71 DefaultTeamGuestRole: sc.TeamGuest, 72 DefaultChannelAdminRole: sc.ChannelAdmin, 73 DefaultChannelUserRole: sc.ChannelUser, 74 DefaultChannelGuestRole: sc.ChannelGuest, 75 } 76 } 77 78 type SchemeRoles struct { 79 SchemeAdmin bool `json:"scheme_admin"` 80 SchemeUser bool `json:"scheme_user"` 81 SchemeGuest bool `json:"scheme_guest"` 82 } 83 84 func (scheme *Scheme) ToJson() string { 85 b, _ := json.Marshal(scheme) 86 return string(b) 87 } 88 89 func SchemeFromJson(data io.Reader) *Scheme { 90 var scheme *Scheme 91 json.NewDecoder(data).Decode(&scheme) 92 return scheme 93 } 94 95 func SchemesToJson(schemes []*Scheme) string { 96 b, _ := json.Marshal(schemes) 97 return string(b) 98 } 99 100 func SchemesFromJson(data io.Reader) []*Scheme { 101 var schemes []*Scheme 102 if err := json.NewDecoder(data).Decode(&schemes); err == nil { 103 return schemes 104 } else { 105 return nil 106 } 107 } 108 109 func (scheme *Scheme) IsValid() bool { 110 if !IsValidId(scheme.Id) { 111 return false 112 } 113 114 return scheme.IsValidForCreate() 115 } 116 117 func (scheme *Scheme) IsValidForCreate() bool { 118 if len(scheme.DisplayName) == 0 || len(scheme.DisplayName) > SCHEME_DISPLAY_NAME_MAX_LENGTH { 119 return false 120 } 121 122 if !IsValidSchemeName(scheme.Name) { 123 return false 124 } 125 126 if len(scheme.Description) > SCHEME_DESCRIPTION_MAX_LENGTH { 127 return false 128 } 129 130 switch scheme.Scope { 131 case SCHEME_SCOPE_TEAM, SCHEME_SCOPE_CHANNEL: 132 default: 133 return false 134 } 135 136 if !IsValidRoleName(scheme.DefaultChannelAdminRole) { 137 return false 138 } 139 140 if !IsValidRoleName(scheme.DefaultChannelUserRole) { 141 return false 142 } 143 144 if !IsValidRoleName(scheme.DefaultChannelGuestRole) { 145 return false 146 } 147 148 if scheme.Scope == SCHEME_SCOPE_TEAM { 149 if !IsValidRoleName(scheme.DefaultTeamAdminRole) { 150 return false 151 } 152 153 if !IsValidRoleName(scheme.DefaultTeamUserRole) { 154 return false 155 } 156 157 if !IsValidRoleName(scheme.DefaultTeamGuestRole) { 158 return false 159 } 160 } 161 162 if scheme.Scope == SCHEME_SCOPE_CHANNEL { 163 if len(scheme.DefaultTeamAdminRole) != 0 { 164 return false 165 } 166 167 if len(scheme.DefaultTeamUserRole) != 0 { 168 return false 169 } 170 171 if len(scheme.DefaultTeamGuestRole) != 0 { 172 return false 173 } 174 } 175 176 return true 177 } 178 179 func (scheme *Scheme) Patch(patch *SchemePatch) { 180 if patch.DisplayName != nil { 181 scheme.DisplayName = *patch.DisplayName 182 } 183 if patch.Name != nil { 184 scheme.Name = *patch.Name 185 } 186 if patch.Description != nil { 187 scheme.Description = *patch.Description 188 } 189 } 190 191 func (patch *SchemePatch) ToJson() string { 192 b, _ := json.Marshal(patch) 193 return string(b) 194 } 195 196 func SchemePatchFromJson(data io.Reader) *SchemePatch { 197 var patch *SchemePatch 198 json.NewDecoder(data).Decode(&patch) 199 return patch 200 } 201 202 func SchemeIDFromJson(data io.Reader) *string { 203 var p *SchemeIDPatch 204 json.NewDecoder(data).Decode(&p) 205 return p.SchemeID 206 } 207 208 func (p *SchemeIDPatch) ToJson() string { 209 b, _ := json.Marshal(p) 210 return string(b) 211 } 212 213 func IsValidSchemeName(name string) bool { 214 re := regexp.MustCompile(fmt.Sprintf("^[a-z0-9_]{2,%d}$", SCHEME_NAME_MAX_LENGTH)) 215 return re.MatchString(name) 216 } 217 218 func (schemeRoles *SchemeRoles) ToJson() string { 219 b, _ := json.Marshal(schemeRoles) 220 return string(b) 221 } 222 223 func SchemeRolesFromJson(data io.Reader) *SchemeRoles { 224 var schemeRoles *SchemeRoles 225 json.NewDecoder(data).Decode(&schemeRoles) 226 return schemeRoles 227 }