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  }