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  }