github.com/jfrerich/mattermost-server@v5.8.0-rc2+incompatible/model/config.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  	"crypto/tls"
     8  	"encoding/json"
     9  	"io"
    10  	"math"
    11  	"net"
    12  	"net/http"
    13  	"net/url"
    14  	"os"
    15  	"regexp"
    16  	"strconv"
    17  	"strings"
    18  	"time"
    19  )
    20  
    21  const (
    22  	CONN_SECURITY_NONE     = ""
    23  	CONN_SECURITY_PLAIN    = "PLAIN"
    24  	CONN_SECURITY_TLS      = "TLS"
    25  	CONN_SECURITY_STARTTLS = "STARTTLS"
    26  
    27  	IMAGE_DRIVER_LOCAL = "local"
    28  	IMAGE_DRIVER_S3    = "amazons3"
    29  
    30  	DATABASE_DRIVER_SQLITE   = "sqlite3"
    31  	DATABASE_DRIVER_MYSQL    = "mysql"
    32  	DATABASE_DRIVER_POSTGRES = "postgres"
    33  
    34  	MINIO_ACCESS_KEY = "minioaccesskey"
    35  	MINIO_SECRET_KEY = "miniosecretkey"
    36  	MINIO_BUCKET     = "mattermost-test"
    37  
    38  	PASSWORD_MAXIMUM_LENGTH = 64
    39  	PASSWORD_MINIMUM_LENGTH = 5
    40  
    41  	SERVICE_GITLAB    = "gitlab"
    42  	SERVICE_GOOGLE    = "google"
    43  	SERVICE_OFFICE365 = "office365"
    44  
    45  	GENERIC_NO_CHANNEL_NOTIFICATION = "generic_no_channel"
    46  	GENERIC_NOTIFICATION            = "generic"
    47  	FULL_NOTIFICATION               = "full"
    48  
    49  	DIRECT_MESSAGE_ANY  = "any"
    50  	DIRECT_MESSAGE_TEAM = "team"
    51  
    52  	SHOW_USERNAME          = "username"
    53  	SHOW_NICKNAME_FULLNAME = "nickname_full_name"
    54  	SHOW_FULLNAME          = "full_name"
    55  
    56  	PERMISSIONS_ALL           = "all"
    57  	PERMISSIONS_CHANNEL_ADMIN = "channel_admin"
    58  	PERMISSIONS_TEAM_ADMIN    = "team_admin"
    59  	PERMISSIONS_SYSTEM_ADMIN  = "system_admin"
    60  
    61  	FAKE_SETTING = "********************************"
    62  
    63  	RESTRICT_EMOJI_CREATION_ALL          = "all"
    64  	RESTRICT_EMOJI_CREATION_ADMIN        = "admin"
    65  	RESTRICT_EMOJI_CREATION_SYSTEM_ADMIN = "system_admin"
    66  
    67  	PERMISSIONS_DELETE_POST_ALL          = "all"
    68  	PERMISSIONS_DELETE_POST_TEAM_ADMIN   = "team_admin"
    69  	PERMISSIONS_DELETE_POST_SYSTEM_ADMIN = "system_admin"
    70  
    71  	ALLOW_EDIT_POST_ALWAYS     = "always"
    72  	ALLOW_EDIT_POST_NEVER      = "never"
    73  	ALLOW_EDIT_POST_TIME_LIMIT = "time_limit"
    74  
    75  	GROUP_UNREAD_CHANNELS_DISABLED    = "disabled"
    76  	GROUP_UNREAD_CHANNELS_DEFAULT_ON  = "default_on"
    77  	GROUP_UNREAD_CHANNELS_DEFAULT_OFF = "default_off"
    78  
    79  	EMAIL_BATCHING_BUFFER_SIZE = 256
    80  	EMAIL_BATCHING_INTERVAL    = 30
    81  
    82  	EMAIL_NOTIFICATION_CONTENTS_FULL    = "full"
    83  	EMAIL_NOTIFICATION_CONTENTS_GENERIC = "generic"
    84  
    85  	SITENAME_MAX_LENGTH = 30
    86  
    87  	SERVICE_SETTINGS_DEFAULT_SITE_URL           = ""
    88  	SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE      = ""
    89  	SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE       = ""
    90  	SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT       = 300
    91  	SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT      = 300
    92  	SERVICE_SETTINGS_DEFAULT_MAX_LOGIN_ATTEMPTS = 10
    93  	SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM    = ""
    94  	SERVICE_SETTINGS_DEFAULT_LISTEN_AND_ADDRESS = ":8065"
    95  	SERVICE_SETTINGS_DEFAULT_GFYCAT_API_KEY     = "2_KtH_W5"
    96  	SERVICE_SETTINGS_DEFAULT_GFYCAT_API_SECRET  = "3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof"
    97  
    98  	TEAM_SETTINGS_DEFAULT_MAX_USERS_PER_TEAM       = 50
    99  	TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT        = ""
   100  	TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT  = ""
   101  	TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT = 300
   102  
   103  	SQL_SETTINGS_DEFAULT_DATA_SOURCE = "mmuser:mostest@tcp(dockerhost:3306)/mattermost_test?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s"
   104  
   105  	FILE_SETTINGS_DEFAULT_DIRECTORY = "./data/"
   106  
   107  	EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION = ""
   108  
   109  	SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK = "https://about.mattermost.com/default-terms/"
   110  	SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK   = "https://about.mattermost.com/default-privacy-policy/"
   111  	SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK            = "https://about.mattermost.com/default-about/"
   112  	SUPPORT_SETTINGS_DEFAULT_HELP_LINK             = "https://about.mattermost.com/default-help/"
   113  	SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK = "https://about.mattermost.com/default-report-a-problem/"
   114  	SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL         = "feedback@mattermost.com"
   115  	SUPPORT_SETTINGS_DEFAULT_RE_ACCEPTANCE_PERIOD  = 365
   116  
   117  	LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE         = ""
   118  	LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE          = ""
   119  	LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE              = ""
   120  	LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE           = ""
   121  	LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE           = ""
   122  	LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE                 = ""
   123  	LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE           = ""
   124  	LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME             = ""
   125  	LDAP_SETTINGS_DEFAULT_GROUP_DISPLAY_NAME_ATTRIBUTE = ""
   126  	LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE           = ""
   127  
   128  	SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE         = ""
   129  	SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = ""
   130  	SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE  = ""
   131  	SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE      = ""
   132  	SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE   = ""
   133  	SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE   = ""
   134  	SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE     = ""
   135  	SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE   = ""
   136  
   137  	NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK         = "https://about.mattermost.com/downloads/"
   138  	NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK = "https://about.mattermost.com/mattermost-android-app/"
   139  	NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK     = "https://about.mattermost.com/mattermost-ios-app/"
   140  
   141  	EXPERIMENTAL_SETTINGS_DEFAULT_LINK_METADATA_TIMEOUT_MILLISECONDS = 5000
   142  
   143  	ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS = 2500
   144  
   145  	ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_COLOR      = "#f2a93b"
   146  	ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_TEXT_COLOR = "#333333"
   147  
   148  	TEAM_SETTINGS_DEFAULT_TEAM_TEXT = "default"
   149  
   150  	ELASTICSEARCH_SETTINGS_DEFAULT_CONNECTION_URL                    = ""
   151  	ELASTICSEARCH_SETTINGS_DEFAULT_USERNAME                          = ""
   152  	ELASTICSEARCH_SETTINGS_DEFAULT_PASSWORD                          = ""
   153  	ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_REPLICAS               = 1
   154  	ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_SHARDS                 = 1
   155  	ELASTICSEARCH_SETTINGS_DEFAULT_AGGREGATE_POSTS_AFTER_DAYS        = 365
   156  	ELASTICSEARCH_SETTINGS_DEFAULT_POSTS_AGGREGATOR_JOB_START_TIME   = "03:00"
   157  	ELASTICSEARCH_SETTINGS_DEFAULT_INDEX_PREFIX                      = ""
   158  	ELASTICSEARCH_SETTINGS_DEFAULT_LIVE_INDEXING_BATCH_SIZE          = 1
   159  	ELASTICSEARCH_SETTINGS_DEFAULT_BULK_INDEXING_TIME_WINDOW_SECONDS = 3600
   160  	ELASTICSEARCH_SETTINGS_DEFAULT_REQUEST_TIMEOUT_SECONDS           = 30
   161  
   162  	DATA_RETENTION_SETTINGS_DEFAULT_MESSAGE_RETENTION_DAYS  = 365
   163  	DATA_RETENTION_SETTINGS_DEFAULT_FILE_RETENTION_DAYS     = 365
   164  	DATA_RETENTION_SETTINGS_DEFAULT_DELETION_JOB_START_TIME = "02:00"
   165  
   166  	PLUGIN_SETTINGS_DEFAULT_DIRECTORY        = "./plugins"
   167  	PLUGIN_SETTINGS_DEFAULT_CLIENT_DIRECTORY = "./client/plugins"
   168  
   169  	TIMEZONE_SETTINGS_DEFAULT_SUPPORTED_TIMEZONES_PATH = "timezones.json"
   170  
   171  	COMPLIANCE_EXPORT_TYPE_CSV         = "csv"
   172  	COMPLIANCE_EXPORT_TYPE_ACTIANCE    = "actiance"
   173  	COMPLIANCE_EXPORT_TYPE_GLOBALRELAY = "globalrelay"
   174  	GLOBALRELAY_CUSTOMER_TYPE_A9       = "A9"
   175  	GLOBALRELAY_CUSTOMER_TYPE_A10      = "A10"
   176  
   177  	CLIENT_SIDE_CERT_CHECK_PRIMARY_AUTH   = "primary"
   178  	CLIENT_SIDE_CERT_CHECK_SECONDARY_AUTH = "secondary"
   179  
   180  	IMAGE_PROXY_TYPE_LOCAL      = "local"
   181  	IMAGE_PROXY_TYPE_ATMOS_CAMO = "atmos/camo"
   182  )
   183  
   184  var ServerTLSSupportedCiphers = map[string]uint16{
   185  	"TLS_RSA_WITH_RC4_128_SHA":                tls.TLS_RSA_WITH_RC4_128_SHA,
   186  	"TLS_RSA_WITH_3DES_EDE_CBC_SHA":           tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
   187  	"TLS_RSA_WITH_AES_128_CBC_SHA":            tls.TLS_RSA_WITH_AES_128_CBC_SHA,
   188  	"TLS_RSA_WITH_AES_256_CBC_SHA":            tls.TLS_RSA_WITH_AES_256_CBC_SHA,
   189  	"TLS_RSA_WITH_AES_128_CBC_SHA256":         tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
   190  	"TLS_RSA_WITH_AES_128_GCM_SHA256":         tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
   191  	"TLS_RSA_WITH_AES_256_GCM_SHA384":         tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
   192  	"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":        tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
   193  	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
   194  	"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
   195  	"TLS_ECDHE_RSA_WITH_RC4_128_SHA":          tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
   196  	"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":     tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
   197  	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
   198  	"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
   199  	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
   200  	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
   201  	"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
   202  	"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
   203  	"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":   tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
   204  	"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
   205  	"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305":    tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
   206  	"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305":  tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
   207  }
   208  
   209  type ServiceSettings struct {
   210  	SiteURL                                           *string
   211  	WebsocketURL                                      *string
   212  	LicenseFileLocation                               *string
   213  	ListenAddress                                     *string
   214  	ConnectionSecurity                                *string
   215  	TLSCertFile                                       *string
   216  	TLSKeyFile                                        *string
   217  	TLSMinVer                                         *string
   218  	TLSStrictTransport                                *bool
   219  	TLSStrictTransportMaxAge                          *int64
   220  	TLSOverwriteCiphers                               []string
   221  	UseLetsEncrypt                                    *bool
   222  	LetsEncryptCertificateCacheFile                   *string
   223  	Forward80To443                                    *bool
   224  	ReadTimeout                                       *int
   225  	WriteTimeout                                      *int
   226  	MaximumLoginAttempts                              *int
   227  	GoroutineHealthThreshold                          *int
   228  	GoogleDeveloperKey                                string
   229  	EnableOAuthServiceProvider                        bool
   230  	EnableIncomingWebhooks                            bool
   231  	EnableOutgoingWebhooks                            bool
   232  	EnableCommands                                    *bool
   233  	DEPRECATED_DO_NOT_USE_EnableOnlyAdminIntegrations *bool `json:"EnableOnlyAdminIntegrations"` // This field is deprecated and must not be used.
   234  	EnablePostUsernameOverride                        bool
   235  	EnablePostIconOverride                            bool
   236  	EnableLinkPreviews                                *bool
   237  	EnableTesting                                     bool
   238  	EnableDeveloper                                   *bool
   239  	EnableSecurityFixAlert                            *bool
   240  	EnableInsecureOutgoingConnections                 *bool
   241  	AllowedUntrustedInternalConnections               *string
   242  	EnableMultifactorAuthentication                   *bool
   243  	EnforceMultifactorAuthentication                  *bool
   244  	EnableUserAccessTokens                            *bool
   245  	AllowCorsFrom                                     *string
   246  	CorsExposedHeaders                                *string
   247  	CorsAllowCredentials                              *bool
   248  	CorsDebug                                         *bool
   249  	AllowCookiesForSubdomains                         *bool
   250  	SessionLengthWebInDays                            *int
   251  	SessionLengthMobileInDays                         *int
   252  	SessionLengthSSOInDays                            *int
   253  	SessionCacheInMinutes                             *int
   254  	SessionIdleTimeoutInMinutes                       *int
   255  	WebsocketSecurePort                               *int
   256  	WebsocketPort                                     *int
   257  	WebserverMode                                     *string
   258  	EnableCustomEmoji                                 *bool
   259  	EnableEmojiPicker                                 *bool
   260  	EnableGifPicker                                   *bool
   261  	GfycatApiKey                                      *string
   262  	GfycatApiSecret                                   *string
   263  	DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation *string `json:"RestrictCustomEmojiCreation"` // This field is deprecated and must not be used.
   264  	DEPRECATED_DO_NOT_USE_RestrictPostDelete          *string `json:"RestrictPostDelete"`          // This field is deprecated and must not be used.
   265  	DEPRECATED_DO_NOT_USE_AllowEditPost               *string `json:"AllowEditPost"`               // This field is deprecated and must not be used.
   266  	PostEditTimeLimit                                 *int
   267  	TimeBetweenUserTypingUpdatesMilliseconds          *int64
   268  	EnablePostSearch                                  *bool
   269  	EnableUserTypingMessages                          *bool
   270  	EnableChannelViewedMessages                       *bool
   271  	EnableUserStatuses                                *bool
   272  	ExperimentalEnableAuthenticationTransfer          *bool
   273  	ClusterLogTimeoutMilliseconds                     *int
   274  	CloseUnusedDirectMessages                         *bool
   275  	EnablePreviewFeatures                             *bool
   276  	EnableTutorial                                    *bool
   277  	ExperimentalEnableDefaultChannelLeaveJoinMessages *bool
   278  	ExperimentalGroupUnreadChannels                   *string
   279  	ExperimentalChannelOrganization                   *bool
   280  	DEPRECATED_DO_NOT_USE_ImageProxyType              *string `json:"ImageProxyType"`    // This field is deprecated and must not be used.
   281  	DEPRECATED_DO_NOT_USE_ImageProxyURL               *string `json:"ImageProxyURL"`     // This field is deprecated and must not be used.
   282  	DEPRECATED_DO_NOT_USE_ImageProxyOptions           *string `json:"ImageProxyOptions"` // This field is deprecated and must not be used.
   283  	EnableAPITeamDeletion                             *bool
   284  	ExperimentalEnableHardenedMode                    *bool
   285  	EnableEmailInvitations                            *bool
   286  	ExperimentalLdapGroupSync                         *bool
   287  }
   288  
   289  func (s *ServiceSettings) SetDefaults() {
   290  	if s.EnableEmailInvitations == nil {
   291  		// If the site URL is also not present then assume this is a clean install
   292  		if s.SiteURL == nil {
   293  			s.EnableEmailInvitations = NewBool(false)
   294  		} else {
   295  			s.EnableEmailInvitations = NewBool(true)
   296  		}
   297  	}
   298  
   299  	if s.SiteURL == nil {
   300  		s.SiteURL = NewString(SERVICE_SETTINGS_DEFAULT_SITE_URL)
   301  	}
   302  
   303  	if s.WebsocketURL == nil {
   304  		s.WebsocketURL = NewString("")
   305  	}
   306  
   307  	if s.LicenseFileLocation == nil {
   308  		s.LicenseFileLocation = NewString("")
   309  	}
   310  
   311  	if s.ListenAddress == nil {
   312  		s.ListenAddress = NewString(SERVICE_SETTINGS_DEFAULT_LISTEN_AND_ADDRESS)
   313  	}
   314  
   315  	if s.EnableLinkPreviews == nil {
   316  		s.EnableLinkPreviews = NewBool(false)
   317  	}
   318  
   319  	if s.EnableDeveloper == nil {
   320  		s.EnableDeveloper = NewBool(false)
   321  	}
   322  
   323  	if s.EnableSecurityFixAlert == nil {
   324  		s.EnableSecurityFixAlert = NewBool(true)
   325  	}
   326  
   327  	if s.EnableInsecureOutgoingConnections == nil {
   328  		s.EnableInsecureOutgoingConnections = NewBool(false)
   329  	}
   330  
   331  	if s.AllowedUntrustedInternalConnections == nil {
   332  		s.AllowedUntrustedInternalConnections = NewString("")
   333  	}
   334  
   335  	if s.EnableMultifactorAuthentication == nil {
   336  		s.EnableMultifactorAuthentication = NewBool(false)
   337  	}
   338  
   339  	if s.EnforceMultifactorAuthentication == nil {
   340  		s.EnforceMultifactorAuthentication = NewBool(false)
   341  	}
   342  
   343  	if s.EnableUserAccessTokens == nil {
   344  		s.EnableUserAccessTokens = NewBool(false)
   345  	}
   346  
   347  	if s.GoroutineHealthThreshold == nil {
   348  		s.GoroutineHealthThreshold = NewInt(-1)
   349  	}
   350  
   351  	if s.ConnectionSecurity == nil {
   352  		s.ConnectionSecurity = NewString("")
   353  	}
   354  
   355  	if s.TLSKeyFile == nil {
   356  		s.TLSKeyFile = NewString(SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE)
   357  	}
   358  
   359  	if s.TLSCertFile == nil {
   360  		s.TLSCertFile = NewString(SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE)
   361  	}
   362  
   363  	if s.TLSMinVer == nil {
   364  		s.TLSMinVer = NewString("1.2")
   365  	}
   366  
   367  	if s.TLSStrictTransport == nil {
   368  		s.TLSStrictTransport = NewBool(false)
   369  	}
   370  
   371  	if s.TLSStrictTransportMaxAge == nil {
   372  		s.TLSStrictTransportMaxAge = NewInt64(63072000)
   373  	}
   374  
   375  	if s.TLSOverwriteCiphers == nil {
   376  		s.TLSOverwriteCiphers = []string{}
   377  	}
   378  
   379  	if s.UseLetsEncrypt == nil {
   380  		s.UseLetsEncrypt = NewBool(false)
   381  	}
   382  
   383  	if s.LetsEncryptCertificateCacheFile == nil {
   384  		s.LetsEncryptCertificateCacheFile = NewString("./config/letsencrypt.cache")
   385  	}
   386  
   387  	if s.ReadTimeout == nil {
   388  		s.ReadTimeout = NewInt(SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT)
   389  	}
   390  
   391  	if s.WriteTimeout == nil {
   392  		s.WriteTimeout = NewInt(SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT)
   393  	}
   394  
   395  	if s.MaximumLoginAttempts == nil {
   396  		s.MaximumLoginAttempts = NewInt(SERVICE_SETTINGS_DEFAULT_MAX_LOGIN_ATTEMPTS)
   397  	}
   398  
   399  	if s.Forward80To443 == nil {
   400  		s.Forward80To443 = NewBool(false)
   401  	}
   402  
   403  	if s.TimeBetweenUserTypingUpdatesMilliseconds == nil {
   404  		s.TimeBetweenUserTypingUpdatesMilliseconds = NewInt64(5000)
   405  	}
   406  
   407  	if s.EnablePostSearch == nil {
   408  		s.EnablePostSearch = NewBool(true)
   409  	}
   410  
   411  	if s.EnableUserTypingMessages == nil {
   412  		s.EnableUserTypingMessages = NewBool(true)
   413  	}
   414  
   415  	if s.EnableChannelViewedMessages == nil {
   416  		s.EnableChannelViewedMessages = NewBool(true)
   417  	}
   418  
   419  	if s.EnableUserStatuses == nil {
   420  		s.EnableUserStatuses = NewBool(true)
   421  	}
   422  
   423  	if s.ClusterLogTimeoutMilliseconds == nil {
   424  		s.ClusterLogTimeoutMilliseconds = NewInt(2000)
   425  	}
   426  
   427  	if s.CloseUnusedDirectMessages == nil {
   428  		s.CloseUnusedDirectMessages = NewBool(false)
   429  	}
   430  
   431  	if s.EnableTutorial == nil {
   432  		s.EnableTutorial = NewBool(true)
   433  	}
   434  
   435  	if s.SessionLengthWebInDays == nil {
   436  		s.SessionLengthWebInDays = NewInt(30)
   437  	}
   438  
   439  	if s.SessionLengthMobileInDays == nil {
   440  		s.SessionLengthMobileInDays = NewInt(30)
   441  	}
   442  
   443  	if s.SessionLengthSSOInDays == nil {
   444  		s.SessionLengthSSOInDays = NewInt(30)
   445  	}
   446  
   447  	if s.SessionCacheInMinutes == nil {
   448  		s.SessionCacheInMinutes = NewInt(10)
   449  	}
   450  
   451  	if s.SessionIdleTimeoutInMinutes == nil {
   452  		s.SessionIdleTimeoutInMinutes = NewInt(0)
   453  	}
   454  
   455  	if s.EnableCommands == nil {
   456  		s.EnableCommands = NewBool(false)
   457  	}
   458  
   459  	if s.DEPRECATED_DO_NOT_USE_EnableOnlyAdminIntegrations == nil {
   460  		s.DEPRECATED_DO_NOT_USE_EnableOnlyAdminIntegrations = NewBool(true)
   461  	}
   462  
   463  	if s.WebsocketPort == nil {
   464  		s.WebsocketPort = NewInt(80)
   465  	}
   466  
   467  	if s.WebsocketSecurePort == nil {
   468  		s.WebsocketSecurePort = NewInt(443)
   469  	}
   470  
   471  	if s.AllowCorsFrom == nil {
   472  		s.AllowCorsFrom = NewString(SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM)
   473  	}
   474  
   475  	if s.CorsExposedHeaders == nil {
   476  		s.CorsExposedHeaders = NewString("")
   477  	}
   478  
   479  	if s.CorsAllowCredentials == nil {
   480  		s.CorsAllowCredentials = NewBool(false)
   481  	}
   482  
   483  	if s.CorsDebug == nil {
   484  		s.CorsDebug = NewBool(false)
   485  	}
   486  
   487  	if s.AllowCookiesForSubdomains == nil {
   488  		s.AllowCookiesForSubdomains = NewBool(false)
   489  	}
   490  
   491  	if s.WebserverMode == nil {
   492  		s.WebserverMode = NewString("gzip")
   493  	} else if *s.WebserverMode == "regular" {
   494  		*s.WebserverMode = "gzip"
   495  	}
   496  
   497  	if s.EnableCustomEmoji == nil {
   498  		s.EnableCustomEmoji = NewBool(false)
   499  	}
   500  
   501  	if s.EnableEmojiPicker == nil {
   502  		s.EnableEmojiPicker = NewBool(true)
   503  	}
   504  
   505  	if s.EnableGifPicker == nil {
   506  		s.EnableGifPicker = NewBool(false)
   507  	}
   508  
   509  	if s.GfycatApiKey == nil || *s.GfycatApiKey == "" {
   510  		s.GfycatApiKey = NewString(SERVICE_SETTINGS_DEFAULT_GFYCAT_API_KEY)
   511  	}
   512  
   513  	if s.GfycatApiSecret == nil || *s.GfycatApiSecret == "" {
   514  		s.GfycatApiSecret = NewString(SERVICE_SETTINGS_DEFAULT_GFYCAT_API_SECRET)
   515  	}
   516  
   517  	if s.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation == nil {
   518  		s.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation = NewString(RESTRICT_EMOJI_CREATION_ALL)
   519  	}
   520  
   521  	if s.DEPRECATED_DO_NOT_USE_RestrictPostDelete == nil {
   522  		s.DEPRECATED_DO_NOT_USE_RestrictPostDelete = NewString(PERMISSIONS_DELETE_POST_ALL)
   523  	}
   524  
   525  	if s.DEPRECATED_DO_NOT_USE_AllowEditPost == nil {
   526  		s.DEPRECATED_DO_NOT_USE_AllowEditPost = NewString(ALLOW_EDIT_POST_ALWAYS)
   527  	}
   528  
   529  	if s.ExperimentalEnableAuthenticationTransfer == nil {
   530  		s.ExperimentalEnableAuthenticationTransfer = NewBool(true)
   531  	}
   532  
   533  	if s.PostEditTimeLimit == nil {
   534  		s.PostEditTimeLimit = NewInt(-1)
   535  	}
   536  
   537  	if s.EnablePreviewFeatures == nil {
   538  		s.EnablePreviewFeatures = NewBool(true)
   539  	}
   540  
   541  	if s.ExperimentalEnableDefaultChannelLeaveJoinMessages == nil {
   542  		s.ExperimentalEnableDefaultChannelLeaveJoinMessages = NewBool(true)
   543  	}
   544  
   545  	if s.ExperimentalGroupUnreadChannels == nil {
   546  		s.ExperimentalGroupUnreadChannels = NewString(GROUP_UNREAD_CHANNELS_DISABLED)
   547  	} else if *s.ExperimentalGroupUnreadChannels == "0" {
   548  		s.ExperimentalGroupUnreadChannels = NewString(GROUP_UNREAD_CHANNELS_DISABLED)
   549  	} else if *s.ExperimentalGroupUnreadChannels == "1" {
   550  		s.ExperimentalGroupUnreadChannels = NewString(GROUP_UNREAD_CHANNELS_DEFAULT_ON)
   551  	}
   552  
   553  	if s.ExperimentalChannelOrganization == nil {
   554  		experimentalUnreadEnabled := *s.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DISABLED
   555  		s.ExperimentalChannelOrganization = NewBool(experimentalUnreadEnabled)
   556  	}
   557  
   558  	if s.DEPRECATED_DO_NOT_USE_ImageProxyType == nil {
   559  		s.DEPRECATED_DO_NOT_USE_ImageProxyType = NewString("")
   560  	}
   561  
   562  	if s.DEPRECATED_DO_NOT_USE_ImageProxyURL == nil {
   563  		s.DEPRECATED_DO_NOT_USE_ImageProxyURL = NewString("")
   564  	}
   565  
   566  	if s.DEPRECATED_DO_NOT_USE_ImageProxyOptions == nil {
   567  		s.DEPRECATED_DO_NOT_USE_ImageProxyOptions = NewString("")
   568  	}
   569  
   570  	if s.EnableAPITeamDeletion == nil {
   571  		s.EnableAPITeamDeletion = NewBool(false)
   572  	}
   573  
   574  	if s.ExperimentalEnableHardenedMode == nil {
   575  		s.ExperimentalEnableHardenedMode = NewBool(false)
   576  	}
   577  
   578  	if s.ExperimentalLdapGroupSync == nil {
   579  		s.ExperimentalLdapGroupSync = NewBool(false)
   580  	}
   581  }
   582  
   583  type ClusterSettings struct {
   584  	Enable                      *bool
   585  	ClusterName                 *string
   586  	OverrideHostname            *string
   587  	UseIpAddress                *bool
   588  	UseExperimentalGossip       *bool
   589  	ReadOnlyConfig              *bool
   590  	GossipPort                  *int
   591  	StreamingPort               *int
   592  	MaxIdleConns                *int
   593  	MaxIdleConnsPerHost         *int
   594  	IdleConnTimeoutMilliseconds *int
   595  }
   596  
   597  func (s *ClusterSettings) SetDefaults() {
   598  	if s.Enable == nil {
   599  		s.Enable = NewBool(false)
   600  	}
   601  
   602  	if s.ClusterName == nil {
   603  		s.ClusterName = NewString("")
   604  	}
   605  
   606  	if s.OverrideHostname == nil {
   607  		s.OverrideHostname = NewString("")
   608  	}
   609  
   610  	if s.UseIpAddress == nil {
   611  		s.UseIpAddress = NewBool(true)
   612  	}
   613  
   614  	if s.UseExperimentalGossip == nil {
   615  		s.UseExperimentalGossip = NewBool(false)
   616  	}
   617  
   618  	if s.ReadOnlyConfig == nil {
   619  		s.ReadOnlyConfig = NewBool(true)
   620  	}
   621  
   622  	if s.GossipPort == nil {
   623  		s.GossipPort = NewInt(8074)
   624  	}
   625  
   626  	if s.StreamingPort == nil {
   627  		s.StreamingPort = NewInt(8075)
   628  	}
   629  
   630  	if s.MaxIdleConns == nil {
   631  		s.MaxIdleConns = NewInt(100)
   632  	}
   633  
   634  	if s.MaxIdleConnsPerHost == nil {
   635  		s.MaxIdleConnsPerHost = NewInt(128)
   636  	}
   637  
   638  	if s.IdleConnTimeoutMilliseconds == nil {
   639  		s.IdleConnTimeoutMilliseconds = NewInt(90000)
   640  	}
   641  }
   642  
   643  type MetricsSettings struct {
   644  	Enable           *bool
   645  	BlockProfileRate *int
   646  	ListenAddress    *string
   647  }
   648  
   649  func (s *MetricsSettings) SetDefaults() {
   650  	if s.ListenAddress == nil {
   651  		s.ListenAddress = NewString(":8067")
   652  	}
   653  
   654  	if s.Enable == nil {
   655  		s.Enable = NewBool(false)
   656  	}
   657  
   658  	if s.BlockProfileRate == nil {
   659  		s.BlockProfileRate = NewInt(0)
   660  	}
   661  }
   662  
   663  type ExperimentalSettings struct {
   664  	ClientSideCertEnable            *bool
   665  	ClientSideCertCheck             *string
   666  	DisablePostMetadata             *bool
   667  	LinkMetadataTimeoutMilliseconds *int64
   668  }
   669  
   670  func (s *ExperimentalSettings) SetDefaults() {
   671  	if s.ClientSideCertEnable == nil {
   672  		s.ClientSideCertEnable = NewBool(false)
   673  	}
   674  
   675  	if s.ClientSideCertCheck == nil {
   676  		s.ClientSideCertCheck = NewString(CLIENT_SIDE_CERT_CHECK_SECONDARY_AUTH)
   677  	}
   678  
   679  	if s.DisablePostMetadata == nil {
   680  		s.DisablePostMetadata = NewBool(false)
   681  	}
   682  
   683  	if s.LinkMetadataTimeoutMilliseconds == nil {
   684  		s.LinkMetadataTimeoutMilliseconds = NewInt64(EXPERIMENTAL_SETTINGS_DEFAULT_LINK_METADATA_TIMEOUT_MILLISECONDS)
   685  	}
   686  }
   687  
   688  type AnalyticsSettings struct {
   689  	MaxUsersForStatistics *int
   690  }
   691  
   692  func (s *AnalyticsSettings) SetDefaults() {
   693  	if s.MaxUsersForStatistics == nil {
   694  		s.MaxUsersForStatistics = NewInt(ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS)
   695  	}
   696  }
   697  
   698  type SSOSettings struct {
   699  	Enable          bool
   700  	Secret          string
   701  	Id              string
   702  	Scope           string
   703  	AuthEndpoint    string
   704  	TokenEndpoint   string
   705  	UserApiEndpoint string
   706  }
   707  
   708  type SqlSettings struct {
   709  	DriverName                  *string
   710  	DataSource                  *string
   711  	DataSourceReplicas          []string
   712  	DataSourceSearchReplicas    []string
   713  	MaxIdleConns                *int
   714  	ConnMaxLifetimeMilliseconds *int
   715  	MaxOpenConns                *int
   716  	Trace                       bool
   717  	AtRestEncryptKey            string
   718  	QueryTimeout                *int
   719  }
   720  
   721  func (s *SqlSettings) SetDefaults() {
   722  	if s.DriverName == nil {
   723  		s.DriverName = NewString(DATABASE_DRIVER_MYSQL)
   724  	}
   725  
   726  	if s.DataSource == nil {
   727  		s.DataSource = NewString(SQL_SETTINGS_DEFAULT_DATA_SOURCE)
   728  	}
   729  
   730  	if len(s.AtRestEncryptKey) == 0 {
   731  		s.AtRestEncryptKey = NewRandomString(32)
   732  	}
   733  
   734  	if s.MaxIdleConns == nil {
   735  		s.MaxIdleConns = NewInt(20)
   736  	}
   737  
   738  	if s.MaxOpenConns == nil {
   739  		s.MaxOpenConns = NewInt(300)
   740  	}
   741  
   742  	if s.ConnMaxLifetimeMilliseconds == nil {
   743  		s.ConnMaxLifetimeMilliseconds = NewInt(3600000)
   744  	}
   745  
   746  	if s.QueryTimeout == nil {
   747  		s.QueryTimeout = NewInt(30)
   748  	}
   749  }
   750  
   751  type LogSettings struct {
   752  	EnableConsole          bool
   753  	ConsoleLevel           string
   754  	ConsoleJson            *bool
   755  	EnableFile             bool
   756  	FileLevel              string
   757  	FileJson               *bool
   758  	FileLocation           string
   759  	EnableWebhookDebugging bool
   760  	EnableDiagnostics      *bool
   761  }
   762  
   763  func (s *LogSettings) SetDefaults() {
   764  	if s.EnableDiagnostics == nil {
   765  		s.EnableDiagnostics = NewBool(true)
   766  	}
   767  
   768  	if s.ConsoleJson == nil {
   769  		s.ConsoleJson = NewBool(true)
   770  	}
   771  
   772  	if s.FileJson == nil {
   773  		s.FileJson = NewBool(true)
   774  	}
   775  }
   776  
   777  type PasswordSettings struct {
   778  	MinimumLength *int
   779  	Lowercase     *bool
   780  	Number        *bool
   781  	Uppercase     *bool
   782  	Symbol        *bool
   783  }
   784  
   785  func (s *PasswordSettings) SetDefaults() {
   786  	if s.MinimumLength == nil {
   787  		s.MinimumLength = NewInt(PASSWORD_MINIMUM_LENGTH)
   788  	}
   789  
   790  	if s.Lowercase == nil {
   791  		s.Lowercase = NewBool(false)
   792  	}
   793  
   794  	if s.Number == nil {
   795  		s.Number = NewBool(false)
   796  	}
   797  
   798  	if s.Uppercase == nil {
   799  		s.Uppercase = NewBool(false)
   800  	}
   801  
   802  	if s.Symbol == nil {
   803  		s.Symbol = NewBool(false)
   804  	}
   805  }
   806  
   807  type FileSettings struct {
   808  	EnableFileAttachments   *bool
   809  	EnableMobileUpload      *bool
   810  	EnableMobileDownload    *bool
   811  	MaxFileSize             *int64
   812  	DriverName              *string
   813  	Directory               string
   814  	EnablePublicLink        bool
   815  	PublicLinkSalt          *string
   816  	InitialFont             string
   817  	AmazonS3AccessKeyId     string
   818  	AmazonS3SecretAccessKey string
   819  	AmazonS3Bucket          string
   820  	AmazonS3Region          string
   821  	AmazonS3Endpoint        string
   822  	AmazonS3SSL             *bool
   823  	AmazonS3SignV2          *bool
   824  	AmazonS3SSE             *bool
   825  	AmazonS3Trace           *bool
   826  }
   827  
   828  func (s *FileSettings) SetDefaults() {
   829  	if s.DriverName == nil {
   830  		s.DriverName = NewString(IMAGE_DRIVER_LOCAL)
   831  	}
   832  
   833  	if s.AmazonS3Endpoint == "" {
   834  		// Defaults to "s3.amazonaws.com"
   835  		s.AmazonS3Endpoint = "s3.amazonaws.com"
   836  	}
   837  
   838  	if s.AmazonS3SSL == nil {
   839  		s.AmazonS3SSL = NewBool(true) // Secure by default.
   840  	}
   841  
   842  	if s.AmazonS3SignV2 == nil {
   843  		s.AmazonS3SignV2 = new(bool)
   844  		// Signature v2 is not enabled by default.
   845  	}
   846  
   847  	if s.AmazonS3SSE == nil {
   848  		s.AmazonS3SSE = NewBool(false) // Not Encrypted by default.
   849  	}
   850  
   851  	if s.AmazonS3Trace == nil {
   852  		s.AmazonS3Trace = NewBool(false)
   853  	}
   854  
   855  	if s.EnableFileAttachments == nil {
   856  		s.EnableFileAttachments = NewBool(true)
   857  	}
   858  
   859  	if s.EnableMobileUpload == nil {
   860  		s.EnableMobileUpload = NewBool(true)
   861  	}
   862  
   863  	if s.EnableMobileDownload == nil {
   864  		s.EnableMobileDownload = NewBool(true)
   865  	}
   866  
   867  	if s.MaxFileSize == nil {
   868  		s.MaxFileSize = NewInt64(52428800) // 50 MB
   869  	}
   870  
   871  	if s.PublicLinkSalt == nil || len(*s.PublicLinkSalt) == 0 {
   872  		s.PublicLinkSalt = NewString(NewRandomString(32))
   873  	}
   874  
   875  	if s.InitialFont == "" {
   876  		// Defaults to "nunito-bold.ttf"
   877  		s.InitialFont = "nunito-bold.ttf"
   878  	}
   879  
   880  	if s.Directory == "" {
   881  		s.Directory = FILE_SETTINGS_DEFAULT_DIRECTORY
   882  	}
   883  }
   884  
   885  type EmailSettings struct {
   886  	EnableSignUpWithEmail             bool
   887  	EnableSignInWithEmail             *bool
   888  	EnableSignInWithUsername          *bool
   889  	SendEmailNotifications            bool
   890  	UseChannelInEmailNotifications    *bool
   891  	RequireEmailVerification          bool
   892  	FeedbackName                      string
   893  	FeedbackEmail                     string
   894  	FeedbackOrganization              *string
   895  	EnableSMTPAuth                    *bool
   896  	SMTPUsername                      string
   897  	SMTPPassword                      string
   898  	SMTPServer                        string
   899  	SMTPPort                          string
   900  	ConnectionSecurity                string
   901  	InviteSalt                        string
   902  	SendPushNotifications             *bool
   903  	PushNotificationServer            *string
   904  	PushNotificationContents          *string
   905  	EnableEmailBatching               *bool
   906  	EmailBatchingBufferSize           *int
   907  	EmailBatchingInterval             *int
   908  	EnablePreviewModeBanner           *bool
   909  	SkipServerCertificateVerification *bool
   910  	EmailNotificationContentsType     *string
   911  	LoginButtonColor                  *string
   912  	LoginButtonBorderColor            *string
   913  	LoginButtonTextColor              *string
   914  }
   915  
   916  func (s *EmailSettings) SetDefaults() {
   917  	if len(s.InviteSalt) == 0 {
   918  		s.InviteSalt = NewRandomString(32)
   919  	}
   920  
   921  	if s.EnableSignInWithEmail == nil {
   922  		s.EnableSignInWithEmail = NewBool(s.EnableSignUpWithEmail)
   923  	}
   924  
   925  	if s.EnableSignInWithUsername == nil {
   926  		s.EnableSignInWithUsername = NewBool(false)
   927  	}
   928  
   929  	if s.UseChannelInEmailNotifications == nil {
   930  		s.UseChannelInEmailNotifications = NewBool(false)
   931  	}
   932  
   933  	if s.SendPushNotifications == nil {
   934  		s.SendPushNotifications = NewBool(false)
   935  	}
   936  
   937  	if s.PushNotificationServer == nil {
   938  		s.PushNotificationServer = NewString("")
   939  	}
   940  
   941  	if s.PushNotificationContents == nil {
   942  		s.PushNotificationContents = NewString(GENERIC_NOTIFICATION)
   943  	}
   944  
   945  	if s.FeedbackOrganization == nil {
   946  		s.FeedbackOrganization = NewString(EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION)
   947  	}
   948  
   949  	if s.EnableEmailBatching == nil {
   950  		s.EnableEmailBatching = NewBool(false)
   951  	}
   952  
   953  	if s.EmailBatchingBufferSize == nil {
   954  		s.EmailBatchingBufferSize = NewInt(EMAIL_BATCHING_BUFFER_SIZE)
   955  	}
   956  
   957  	if s.EmailBatchingInterval == nil {
   958  		s.EmailBatchingInterval = NewInt(EMAIL_BATCHING_INTERVAL)
   959  	}
   960  
   961  	if s.EnablePreviewModeBanner == nil {
   962  		s.EnablePreviewModeBanner = NewBool(true)
   963  	}
   964  
   965  	if s.EnableSMTPAuth == nil {
   966  		s.EnableSMTPAuth = new(bool)
   967  		if s.ConnectionSecurity == CONN_SECURITY_NONE {
   968  			*s.EnableSMTPAuth = false
   969  		} else {
   970  			*s.EnableSMTPAuth = true
   971  		}
   972  	}
   973  
   974  	if s.ConnectionSecurity == CONN_SECURITY_PLAIN {
   975  		s.ConnectionSecurity = CONN_SECURITY_NONE
   976  	}
   977  
   978  	if s.SkipServerCertificateVerification == nil {
   979  		s.SkipServerCertificateVerification = NewBool(false)
   980  	}
   981  
   982  	if s.EmailNotificationContentsType == nil {
   983  		s.EmailNotificationContentsType = NewString(EMAIL_NOTIFICATION_CONTENTS_FULL)
   984  	}
   985  
   986  	if s.LoginButtonColor == nil {
   987  		s.LoginButtonColor = NewString("#0000")
   988  	}
   989  
   990  	if s.LoginButtonBorderColor == nil {
   991  		s.LoginButtonBorderColor = NewString("#2389D7")
   992  	}
   993  
   994  	if s.LoginButtonTextColor == nil {
   995  		s.LoginButtonTextColor = NewString("#2389D7")
   996  	}
   997  }
   998  
   999  type RateLimitSettings struct {
  1000  	Enable           *bool
  1001  	PerSec           *int
  1002  	MaxBurst         *int
  1003  	MemoryStoreSize  *int
  1004  	VaryByRemoteAddr *bool
  1005  	VaryByUser       *bool
  1006  	VaryByHeader     string
  1007  }
  1008  
  1009  func (s *RateLimitSettings) SetDefaults() {
  1010  	if s.Enable == nil {
  1011  		s.Enable = NewBool(false)
  1012  	}
  1013  
  1014  	if s.PerSec == nil {
  1015  		s.PerSec = NewInt(10)
  1016  	}
  1017  
  1018  	if s.MaxBurst == nil {
  1019  		s.MaxBurst = NewInt(100)
  1020  	}
  1021  
  1022  	if s.MemoryStoreSize == nil {
  1023  		s.MemoryStoreSize = NewInt(10000)
  1024  	}
  1025  
  1026  	if s.VaryByRemoteAddr == nil {
  1027  		s.VaryByRemoteAddr = NewBool(true)
  1028  	}
  1029  
  1030  	if s.VaryByUser == nil {
  1031  		s.VaryByUser = NewBool(false)
  1032  	}
  1033  }
  1034  
  1035  type PrivacySettings struct {
  1036  	ShowEmailAddress bool
  1037  	ShowFullName     bool
  1038  }
  1039  
  1040  type SupportSettings struct {
  1041  	TermsOfServiceLink                     *string
  1042  	PrivacyPolicyLink                      *string
  1043  	AboutLink                              *string
  1044  	HelpLink                               *string
  1045  	ReportAProblemLink                     *string
  1046  	SupportEmail                           *string
  1047  	CustomTermsOfServiceEnabled            *bool
  1048  	CustomTermsOfServiceReAcceptancePeriod *int
  1049  }
  1050  
  1051  func (s *SupportSettings) SetDefaults() {
  1052  	if !IsSafeLink(s.TermsOfServiceLink) {
  1053  		*s.TermsOfServiceLink = SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK
  1054  	}
  1055  
  1056  	if s.TermsOfServiceLink == nil {
  1057  		s.TermsOfServiceLink = NewString(SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK)
  1058  	}
  1059  
  1060  	if !IsSafeLink(s.PrivacyPolicyLink) {
  1061  		*s.PrivacyPolicyLink = ""
  1062  	}
  1063  
  1064  	if s.PrivacyPolicyLink == nil {
  1065  		s.PrivacyPolicyLink = NewString(SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK)
  1066  	}
  1067  
  1068  	if !IsSafeLink(s.AboutLink) {
  1069  		*s.AboutLink = ""
  1070  	}
  1071  
  1072  	if s.AboutLink == nil {
  1073  		s.AboutLink = NewString(SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK)
  1074  	}
  1075  
  1076  	if !IsSafeLink(s.HelpLink) {
  1077  		*s.HelpLink = ""
  1078  	}
  1079  
  1080  	if s.HelpLink == nil {
  1081  		s.HelpLink = NewString(SUPPORT_SETTINGS_DEFAULT_HELP_LINK)
  1082  	}
  1083  
  1084  	if !IsSafeLink(s.ReportAProblemLink) {
  1085  		*s.ReportAProblemLink = ""
  1086  	}
  1087  
  1088  	if s.ReportAProblemLink == nil {
  1089  		s.ReportAProblemLink = NewString(SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK)
  1090  	}
  1091  
  1092  	if s.SupportEmail == nil {
  1093  		s.SupportEmail = NewString(SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL)
  1094  	}
  1095  
  1096  	if s.CustomTermsOfServiceEnabled == nil {
  1097  		s.CustomTermsOfServiceEnabled = NewBool(false)
  1098  	}
  1099  
  1100  	if s.CustomTermsOfServiceReAcceptancePeriod == nil {
  1101  		s.CustomTermsOfServiceReAcceptancePeriod = NewInt(SUPPORT_SETTINGS_DEFAULT_RE_ACCEPTANCE_PERIOD)
  1102  	}
  1103  }
  1104  
  1105  type AnnouncementSettings struct {
  1106  	EnableBanner         *bool
  1107  	BannerText           *string
  1108  	BannerColor          *string
  1109  	BannerTextColor      *string
  1110  	AllowBannerDismissal *bool
  1111  }
  1112  
  1113  func (s *AnnouncementSettings) SetDefaults() {
  1114  	if s.EnableBanner == nil {
  1115  		s.EnableBanner = NewBool(false)
  1116  	}
  1117  
  1118  	if s.BannerText == nil {
  1119  		s.BannerText = NewString("")
  1120  	}
  1121  
  1122  	if s.BannerColor == nil {
  1123  		s.BannerColor = NewString(ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_COLOR)
  1124  	}
  1125  
  1126  	if s.BannerTextColor == nil {
  1127  		s.BannerTextColor = NewString(ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_TEXT_COLOR)
  1128  	}
  1129  
  1130  	if s.AllowBannerDismissal == nil {
  1131  		s.AllowBannerDismissal = NewBool(true)
  1132  	}
  1133  }
  1134  
  1135  type ThemeSettings struct {
  1136  	EnableThemeSelection *bool
  1137  	DefaultTheme         *string
  1138  	AllowCustomThemes    *bool
  1139  	AllowedThemes        []string
  1140  }
  1141  
  1142  func (s *ThemeSettings) SetDefaults() {
  1143  	if s.EnableThemeSelection == nil {
  1144  		s.EnableThemeSelection = NewBool(true)
  1145  	}
  1146  
  1147  	if s.DefaultTheme == nil {
  1148  		s.DefaultTheme = NewString(TEAM_SETTINGS_DEFAULT_TEAM_TEXT)
  1149  	}
  1150  
  1151  	if s.AllowCustomThemes == nil {
  1152  		s.AllowCustomThemes = NewBool(true)
  1153  	}
  1154  
  1155  	if s.AllowedThemes == nil {
  1156  		s.AllowedThemes = []string{}
  1157  	}
  1158  }
  1159  
  1160  type TeamSettings struct {
  1161  	SiteName                                                  string
  1162  	MaxUsersPerTeam                                           *int
  1163  	DEPRECATED_DO_NOT_USE_EnableTeamCreation                  *bool `json:"EnableTeamCreation"` // This field is deprecated and must not be used.
  1164  	EnableUserCreation                                        *bool
  1165  	EnableOpenServer                                          *bool
  1166  	EnableUserDeactivation                                    *bool
  1167  	RestrictCreationToDomains                                 string
  1168  	EnableCustomBrand                                         *bool
  1169  	CustomBrandText                                           *string
  1170  	CustomDescriptionText                                     *string
  1171  	RestrictDirectMessage                                     *string
  1172  	DEPRECATED_DO_NOT_USE_RestrictTeamInvite                  *string `json:"RestrictTeamInvite"`                  // This field is deprecated and must not be used.
  1173  	DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement     *string `json:"RestrictPublicChannelManagement"`     // This field is deprecated and must not be used.
  1174  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement    *string `json:"RestrictPrivateChannelManagement"`    // This field is deprecated and must not be used.
  1175  	DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation       *string `json:"RestrictPublicChannelCreation"`       // This field is deprecated and must not be used.
  1176  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation      *string `json:"RestrictPrivateChannelCreation"`      // This field is deprecated and must not be used.
  1177  	DEPRECATED_DO_NOT_USE_RestrictPublicChannelDeletion       *string `json:"RestrictPublicChannelDeletion"`       // This field is deprecated and must not be used.
  1178  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelDeletion      *string `json:"RestrictPrivateChannelDeletion"`      // This field is deprecated and must not be used.
  1179  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManageMembers *string `json:"RestrictPrivateChannelManageMembers"` // This field is deprecated and must not be used.
  1180  	EnableXToLeaveChannelsFromLHS                             *bool
  1181  	UserStatusAwayTimeout                                     *int64
  1182  	MaxChannelsPerTeam                                        *int64
  1183  	MaxNotificationsPerChannel                                *int64
  1184  	EnableConfirmNotificationsToChannel                       *bool
  1185  	TeammateNameDisplay                                       *string
  1186  	ExperimentalViewArchivedChannels                          *bool
  1187  	ExperimentalEnableAutomaticReplies                        *bool
  1188  	ExperimentalHideTownSquareinLHS                           *bool
  1189  	ExperimentalTownSquareIsReadOnly                          *bool
  1190  	ExperimentalPrimaryTeam                                   *string
  1191  	ExperimentalDefaultChannels                               []string
  1192  }
  1193  
  1194  func (s *TeamSettings) SetDefaults() {
  1195  	if s.MaxUsersPerTeam == nil {
  1196  		s.MaxUsersPerTeam = NewInt(TEAM_SETTINGS_DEFAULT_MAX_USERS_PER_TEAM)
  1197  	}
  1198  
  1199  	if s.EnableCustomBrand == nil {
  1200  		s.EnableCustomBrand = NewBool(false)
  1201  	}
  1202  
  1203  	if s.EnableUserDeactivation == nil {
  1204  		s.EnableUserDeactivation = NewBool(false)
  1205  	}
  1206  
  1207  	if s.CustomBrandText == nil {
  1208  		s.CustomBrandText = NewString(TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT)
  1209  	}
  1210  
  1211  	if s.CustomDescriptionText == nil {
  1212  		s.CustomDescriptionText = NewString(TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT)
  1213  	}
  1214  
  1215  	if s.EnableOpenServer == nil {
  1216  		s.EnableOpenServer = NewBool(false)
  1217  	}
  1218  
  1219  	if s.RestrictDirectMessage == nil {
  1220  		s.RestrictDirectMessage = NewString(DIRECT_MESSAGE_ANY)
  1221  	}
  1222  
  1223  	if s.DEPRECATED_DO_NOT_USE_RestrictTeamInvite == nil {
  1224  		s.DEPRECATED_DO_NOT_USE_RestrictTeamInvite = NewString(PERMISSIONS_ALL)
  1225  	}
  1226  
  1227  	if s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement == nil {
  1228  		s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement = NewString(PERMISSIONS_ALL)
  1229  	}
  1230  
  1231  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement == nil {
  1232  		s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement = NewString(PERMISSIONS_ALL)
  1233  	}
  1234  
  1235  	if s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation == nil {
  1236  		s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation = new(string)
  1237  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1238  		if *s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement == PERMISSIONS_CHANNEL_ADMIN {
  1239  			*s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation = PERMISSIONS_TEAM_ADMIN
  1240  		} else {
  1241  			*s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation = *s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement
  1242  		}
  1243  	}
  1244  
  1245  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation == nil {
  1246  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1247  		if *s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement == PERMISSIONS_CHANNEL_ADMIN {
  1248  			s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation = NewString(PERMISSIONS_TEAM_ADMIN)
  1249  		} else {
  1250  			s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation = NewString(*s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement)
  1251  		}
  1252  	}
  1253  
  1254  	if s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelDeletion == nil {
  1255  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1256  		s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelDeletion = NewString(*s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement)
  1257  	}
  1258  
  1259  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelDeletion == nil {
  1260  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1261  		s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelDeletion = NewString(*s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement)
  1262  	}
  1263  
  1264  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManageMembers == nil {
  1265  		s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManageMembers = NewString(PERMISSIONS_ALL)
  1266  	}
  1267  
  1268  	if s.EnableXToLeaveChannelsFromLHS == nil {
  1269  		s.EnableXToLeaveChannelsFromLHS = NewBool(false)
  1270  	}
  1271  
  1272  	if s.UserStatusAwayTimeout == nil {
  1273  		s.UserStatusAwayTimeout = NewInt64(TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT)
  1274  	}
  1275  
  1276  	if s.MaxChannelsPerTeam == nil {
  1277  		s.MaxChannelsPerTeam = NewInt64(2000)
  1278  	}
  1279  
  1280  	if s.MaxNotificationsPerChannel == nil {
  1281  		s.MaxNotificationsPerChannel = NewInt64(1000)
  1282  	}
  1283  
  1284  	if s.EnableConfirmNotificationsToChannel == nil {
  1285  		s.EnableConfirmNotificationsToChannel = NewBool(true)
  1286  	}
  1287  
  1288  	if s.ExperimentalEnableAutomaticReplies == nil {
  1289  		s.ExperimentalEnableAutomaticReplies = NewBool(false)
  1290  	}
  1291  
  1292  	if s.ExperimentalHideTownSquareinLHS == nil {
  1293  		s.ExperimentalHideTownSquareinLHS = NewBool(false)
  1294  	}
  1295  
  1296  	if s.ExperimentalTownSquareIsReadOnly == nil {
  1297  		s.ExperimentalTownSquareIsReadOnly = NewBool(false)
  1298  	}
  1299  
  1300  	if s.ExperimentalPrimaryTeam == nil {
  1301  		s.ExperimentalPrimaryTeam = NewString("")
  1302  	}
  1303  
  1304  	if s.ExperimentalDefaultChannels == nil {
  1305  		s.ExperimentalDefaultChannels = []string{}
  1306  	}
  1307  
  1308  	if s.DEPRECATED_DO_NOT_USE_EnableTeamCreation == nil {
  1309  		s.DEPRECATED_DO_NOT_USE_EnableTeamCreation = NewBool(true)
  1310  	}
  1311  
  1312  	if s.EnableUserCreation == nil {
  1313  		s.EnableUserCreation = NewBool(true)
  1314  	}
  1315  
  1316  	if s.ExperimentalViewArchivedChannels == nil {
  1317  		s.ExperimentalViewArchivedChannels = NewBool(false)
  1318  	}
  1319  }
  1320  
  1321  type ClientRequirements struct {
  1322  	AndroidLatestVersion string
  1323  	AndroidMinVersion    string
  1324  	DesktopLatestVersion string
  1325  	DesktopMinVersion    string
  1326  	IosLatestVersion     string
  1327  	IosMinVersion        string
  1328  }
  1329  
  1330  type LdapSettings struct {
  1331  	// Basic
  1332  	Enable             *bool
  1333  	EnableSync         *bool
  1334  	LdapServer         *string
  1335  	LdapPort           *int
  1336  	ConnectionSecurity *string
  1337  	BaseDN             *string
  1338  	BindUsername       *string
  1339  	BindPassword       *string
  1340  
  1341  	// Filtering
  1342  	UserFilter  *string
  1343  	GroupFilter *string
  1344  
  1345  	// Group Mapping
  1346  	GroupDisplayNameAttribute *string
  1347  	GroupIdAttribute          *string
  1348  
  1349  	// User Mapping
  1350  	FirstNameAttribute *string
  1351  	LastNameAttribute  *string
  1352  	EmailAttribute     *string
  1353  	UsernameAttribute  *string
  1354  	NicknameAttribute  *string
  1355  	IdAttribute        *string
  1356  	PositionAttribute  *string
  1357  	LoginIdAttribute   *string
  1358  
  1359  	// Synchronization
  1360  	SyncIntervalMinutes *int
  1361  
  1362  	// Advanced
  1363  	SkipCertificateVerification *bool
  1364  	QueryTimeout                *int
  1365  	MaxPageSize                 *int
  1366  
  1367  	// Customization
  1368  	LoginFieldName *string
  1369  
  1370  	LoginButtonColor       *string
  1371  	LoginButtonBorderColor *string
  1372  	LoginButtonTextColor   *string
  1373  }
  1374  
  1375  func (s *LdapSettings) SetDefaults() {
  1376  	if s.Enable == nil {
  1377  		s.Enable = NewBool(false)
  1378  	}
  1379  
  1380  	// When unset should default to LDAP Enabled
  1381  	if s.EnableSync == nil {
  1382  		s.EnableSync = NewBool(*s.Enable)
  1383  	}
  1384  
  1385  	if s.LdapServer == nil {
  1386  		s.LdapServer = NewString("")
  1387  	}
  1388  
  1389  	if s.LdapPort == nil {
  1390  		s.LdapPort = NewInt(389)
  1391  	}
  1392  
  1393  	if s.ConnectionSecurity == nil {
  1394  		s.ConnectionSecurity = NewString("")
  1395  	}
  1396  
  1397  	if s.BaseDN == nil {
  1398  		s.BaseDN = NewString("")
  1399  	}
  1400  
  1401  	if s.BindUsername == nil {
  1402  		s.BindUsername = NewString("")
  1403  	}
  1404  
  1405  	if s.BindPassword == nil {
  1406  		s.BindPassword = NewString("")
  1407  	}
  1408  
  1409  	if s.UserFilter == nil {
  1410  		s.UserFilter = NewString("")
  1411  	}
  1412  
  1413  	if s.GroupFilter == nil {
  1414  		s.GroupFilter = NewString("")
  1415  	}
  1416  
  1417  	if s.GroupDisplayNameAttribute == nil {
  1418  		s.GroupDisplayNameAttribute = NewString(LDAP_SETTINGS_DEFAULT_GROUP_DISPLAY_NAME_ATTRIBUTE)
  1419  	}
  1420  
  1421  	if s.GroupIdAttribute == nil {
  1422  		s.GroupIdAttribute = NewString(LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE)
  1423  	}
  1424  
  1425  	if s.FirstNameAttribute == nil {
  1426  		s.FirstNameAttribute = NewString(LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE)
  1427  	}
  1428  
  1429  	if s.LastNameAttribute == nil {
  1430  		s.LastNameAttribute = NewString(LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE)
  1431  	}
  1432  
  1433  	if s.EmailAttribute == nil {
  1434  		s.EmailAttribute = NewString(LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE)
  1435  	}
  1436  
  1437  	if s.UsernameAttribute == nil {
  1438  		s.UsernameAttribute = NewString(LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE)
  1439  	}
  1440  
  1441  	if s.NicknameAttribute == nil {
  1442  		s.NicknameAttribute = NewString(LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE)
  1443  	}
  1444  
  1445  	if s.IdAttribute == nil {
  1446  		s.IdAttribute = NewString(LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE)
  1447  	}
  1448  
  1449  	if s.PositionAttribute == nil {
  1450  		s.PositionAttribute = NewString(LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE)
  1451  	}
  1452  
  1453  	// For those upgrading to the version when LoginIdAttribute was added
  1454  	// they need IdAttribute == LoginIdAttribute not to break
  1455  	if s.LoginIdAttribute == nil {
  1456  		s.LoginIdAttribute = s.IdAttribute
  1457  	}
  1458  
  1459  	if s.SyncIntervalMinutes == nil {
  1460  		s.SyncIntervalMinutes = NewInt(60)
  1461  	}
  1462  
  1463  	if s.SkipCertificateVerification == nil {
  1464  		s.SkipCertificateVerification = NewBool(false)
  1465  	}
  1466  
  1467  	if s.QueryTimeout == nil {
  1468  		s.QueryTimeout = NewInt(60)
  1469  	}
  1470  
  1471  	if s.MaxPageSize == nil {
  1472  		s.MaxPageSize = NewInt(0)
  1473  	}
  1474  
  1475  	if s.LoginFieldName == nil {
  1476  		s.LoginFieldName = NewString(LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME)
  1477  	}
  1478  
  1479  	if s.LoginButtonColor == nil {
  1480  		s.LoginButtonColor = NewString("#0000")
  1481  	}
  1482  
  1483  	if s.LoginButtonBorderColor == nil {
  1484  		s.LoginButtonBorderColor = NewString("#2389D7")
  1485  	}
  1486  
  1487  	if s.LoginButtonTextColor == nil {
  1488  		s.LoginButtonTextColor = NewString("#2389D7")
  1489  	}
  1490  }
  1491  
  1492  type ComplianceSettings struct {
  1493  	Enable      *bool
  1494  	Directory   *string
  1495  	EnableDaily *bool
  1496  }
  1497  
  1498  func (s *ComplianceSettings) SetDefaults() {
  1499  	if s.Enable == nil {
  1500  		s.Enable = NewBool(false)
  1501  	}
  1502  
  1503  	if s.Directory == nil {
  1504  		s.Directory = NewString("./data/")
  1505  	}
  1506  
  1507  	if s.EnableDaily == nil {
  1508  		s.EnableDaily = NewBool(false)
  1509  	}
  1510  }
  1511  
  1512  type LocalizationSettings struct {
  1513  	DefaultServerLocale *string
  1514  	DefaultClientLocale *string
  1515  	AvailableLocales    *string
  1516  }
  1517  
  1518  func (s *LocalizationSettings) SetDefaults() {
  1519  	if s.DefaultServerLocale == nil {
  1520  		s.DefaultServerLocale = NewString(DEFAULT_LOCALE)
  1521  	}
  1522  
  1523  	if s.DefaultClientLocale == nil {
  1524  		s.DefaultClientLocale = NewString(DEFAULT_LOCALE)
  1525  	}
  1526  
  1527  	if s.AvailableLocales == nil {
  1528  		s.AvailableLocales = NewString("")
  1529  	}
  1530  }
  1531  
  1532  type SamlSettings struct {
  1533  	// Basic
  1534  	Enable                        *bool
  1535  	EnableSyncWithLdap            *bool
  1536  	EnableSyncWithLdapIncludeAuth *bool
  1537  
  1538  	Verify  *bool
  1539  	Encrypt *bool
  1540  
  1541  	IdpUrl                      *string
  1542  	IdpDescriptorUrl            *string
  1543  	AssertionConsumerServiceURL *string
  1544  
  1545  	ScopingIDPProviderId *string
  1546  	ScopingIDPName       *string
  1547  
  1548  	IdpCertificateFile    *string
  1549  	PublicCertificateFile *string
  1550  	PrivateKeyFile        *string
  1551  
  1552  	// User Mapping
  1553  	IdAttribute        *string
  1554  	FirstNameAttribute *string
  1555  	LastNameAttribute  *string
  1556  	EmailAttribute     *string
  1557  	UsernameAttribute  *string
  1558  	NicknameAttribute  *string
  1559  	LocaleAttribute    *string
  1560  	PositionAttribute  *string
  1561  
  1562  	LoginButtonText *string
  1563  
  1564  	LoginButtonColor       *string
  1565  	LoginButtonBorderColor *string
  1566  	LoginButtonTextColor   *string
  1567  }
  1568  
  1569  func (s *SamlSettings) SetDefaults() {
  1570  	if s.Enable == nil {
  1571  		s.Enable = NewBool(false)
  1572  	}
  1573  
  1574  	if s.EnableSyncWithLdap == nil {
  1575  		s.EnableSyncWithLdap = NewBool(false)
  1576  	}
  1577  
  1578  	if s.EnableSyncWithLdapIncludeAuth == nil {
  1579  		s.EnableSyncWithLdapIncludeAuth = NewBool(false)
  1580  	}
  1581  
  1582  	if s.Verify == nil {
  1583  		s.Verify = NewBool(true)
  1584  	}
  1585  
  1586  	if s.Encrypt == nil {
  1587  		s.Encrypt = NewBool(true)
  1588  	}
  1589  
  1590  	if s.IdpUrl == nil {
  1591  		s.IdpUrl = NewString("")
  1592  	}
  1593  
  1594  	if s.IdpDescriptorUrl == nil {
  1595  		s.IdpDescriptorUrl = NewString("")
  1596  	}
  1597  
  1598  	if s.IdpCertificateFile == nil {
  1599  		s.IdpCertificateFile = NewString("")
  1600  	}
  1601  
  1602  	if s.PublicCertificateFile == nil {
  1603  		s.PublicCertificateFile = NewString("")
  1604  	}
  1605  
  1606  	if s.PrivateKeyFile == nil {
  1607  		s.PrivateKeyFile = NewString("")
  1608  	}
  1609  
  1610  	if s.AssertionConsumerServiceURL == nil {
  1611  		s.AssertionConsumerServiceURL = NewString("")
  1612  	}
  1613  
  1614  	if s.ScopingIDPProviderId == nil {
  1615  		s.ScopingIDPProviderId = NewString("")
  1616  	}
  1617  
  1618  	if s.ScopingIDPName == nil {
  1619  		s.ScopingIDPName = NewString("")
  1620  	}
  1621  
  1622  	if s.LoginButtonText == nil || *s.LoginButtonText == "" {
  1623  		s.LoginButtonText = NewString(USER_AUTH_SERVICE_SAML_TEXT)
  1624  	}
  1625  
  1626  	if s.IdAttribute == nil {
  1627  		s.IdAttribute = NewString(SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE)
  1628  	}
  1629  
  1630  	if s.FirstNameAttribute == nil {
  1631  		s.FirstNameAttribute = NewString(SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE)
  1632  	}
  1633  
  1634  	if s.LastNameAttribute == nil {
  1635  		s.LastNameAttribute = NewString(SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE)
  1636  	}
  1637  
  1638  	if s.EmailAttribute == nil {
  1639  		s.EmailAttribute = NewString(SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE)
  1640  	}
  1641  
  1642  	if s.UsernameAttribute == nil {
  1643  		s.UsernameAttribute = NewString(SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE)
  1644  	}
  1645  
  1646  	if s.NicknameAttribute == nil {
  1647  		s.NicknameAttribute = NewString(SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE)
  1648  	}
  1649  
  1650  	if s.PositionAttribute == nil {
  1651  		s.PositionAttribute = NewString(SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE)
  1652  	}
  1653  
  1654  	if s.LocaleAttribute == nil {
  1655  		s.LocaleAttribute = NewString(SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE)
  1656  	}
  1657  
  1658  	if s.LoginButtonColor == nil {
  1659  		s.LoginButtonColor = NewString("#34a28b")
  1660  	}
  1661  
  1662  	if s.LoginButtonBorderColor == nil {
  1663  		s.LoginButtonBorderColor = NewString("#2389D7")
  1664  	}
  1665  
  1666  	if s.LoginButtonTextColor == nil {
  1667  		s.LoginButtonTextColor = NewString("#ffffff")
  1668  	}
  1669  }
  1670  
  1671  type NativeAppSettings struct {
  1672  	AppDownloadLink        *string
  1673  	AndroidAppDownloadLink *string
  1674  	IosAppDownloadLink     *string
  1675  }
  1676  
  1677  func (s *NativeAppSettings) SetDefaults() {
  1678  	if s.AppDownloadLink == nil {
  1679  		s.AppDownloadLink = NewString(NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK)
  1680  	}
  1681  
  1682  	if s.AndroidAppDownloadLink == nil {
  1683  		s.AndroidAppDownloadLink = NewString(NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK)
  1684  	}
  1685  
  1686  	if s.IosAppDownloadLink == nil {
  1687  		s.IosAppDownloadLink = NewString(NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK)
  1688  	}
  1689  }
  1690  
  1691  type ElasticsearchSettings struct {
  1692  	ConnectionUrl                 *string
  1693  	Username                      *string
  1694  	Password                      *string
  1695  	EnableIndexing                *bool
  1696  	EnableSearching               *bool
  1697  	Sniff                         *bool
  1698  	PostIndexReplicas             *int
  1699  	PostIndexShards               *int
  1700  	AggregatePostsAfterDays       *int
  1701  	PostsAggregatorJobStartTime   *string
  1702  	IndexPrefix                   *string
  1703  	LiveIndexingBatchSize         *int
  1704  	BulkIndexingTimeWindowSeconds *int
  1705  	RequestTimeoutSeconds         *int
  1706  }
  1707  
  1708  func (s *ElasticsearchSettings) SetDefaults() {
  1709  	if s.ConnectionUrl == nil {
  1710  		s.ConnectionUrl = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_CONNECTION_URL)
  1711  	}
  1712  
  1713  	if s.Username == nil {
  1714  		s.Username = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_USERNAME)
  1715  	}
  1716  
  1717  	if s.Password == nil {
  1718  		s.Password = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_PASSWORD)
  1719  	}
  1720  
  1721  	if s.EnableIndexing == nil {
  1722  		s.EnableIndexing = NewBool(false)
  1723  	}
  1724  
  1725  	if s.EnableSearching == nil {
  1726  		s.EnableSearching = NewBool(false)
  1727  	}
  1728  
  1729  	if s.Sniff == nil {
  1730  		s.Sniff = NewBool(true)
  1731  	}
  1732  
  1733  	if s.PostIndexReplicas == nil {
  1734  		s.PostIndexReplicas = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_REPLICAS)
  1735  	}
  1736  
  1737  	if s.PostIndexShards == nil {
  1738  		s.PostIndexShards = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_SHARDS)
  1739  	}
  1740  
  1741  	if s.AggregatePostsAfterDays == nil {
  1742  		s.AggregatePostsAfterDays = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_AGGREGATE_POSTS_AFTER_DAYS)
  1743  	}
  1744  
  1745  	if s.PostsAggregatorJobStartTime == nil {
  1746  		s.PostsAggregatorJobStartTime = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_POSTS_AGGREGATOR_JOB_START_TIME)
  1747  	}
  1748  
  1749  	if s.IndexPrefix == nil {
  1750  		s.IndexPrefix = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_INDEX_PREFIX)
  1751  	}
  1752  
  1753  	if s.LiveIndexingBatchSize == nil {
  1754  		s.LiveIndexingBatchSize = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_LIVE_INDEXING_BATCH_SIZE)
  1755  	}
  1756  
  1757  	if s.BulkIndexingTimeWindowSeconds == nil {
  1758  		s.BulkIndexingTimeWindowSeconds = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_BULK_INDEXING_TIME_WINDOW_SECONDS)
  1759  	}
  1760  
  1761  	if s.RequestTimeoutSeconds == nil {
  1762  		s.RequestTimeoutSeconds = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_REQUEST_TIMEOUT_SECONDS)
  1763  	}
  1764  }
  1765  
  1766  type DataRetentionSettings struct {
  1767  	EnableMessageDeletion *bool
  1768  	EnableFileDeletion    *bool
  1769  	MessageRetentionDays  *int
  1770  	FileRetentionDays     *int
  1771  	DeletionJobStartTime  *string
  1772  }
  1773  
  1774  func (s *DataRetentionSettings) SetDefaults() {
  1775  	if s.EnableMessageDeletion == nil {
  1776  		s.EnableMessageDeletion = NewBool(false)
  1777  	}
  1778  
  1779  	if s.EnableFileDeletion == nil {
  1780  		s.EnableFileDeletion = NewBool(false)
  1781  	}
  1782  
  1783  	if s.MessageRetentionDays == nil {
  1784  		s.MessageRetentionDays = NewInt(DATA_RETENTION_SETTINGS_DEFAULT_MESSAGE_RETENTION_DAYS)
  1785  	}
  1786  
  1787  	if s.FileRetentionDays == nil {
  1788  		s.FileRetentionDays = NewInt(DATA_RETENTION_SETTINGS_DEFAULT_FILE_RETENTION_DAYS)
  1789  	}
  1790  
  1791  	if s.DeletionJobStartTime == nil {
  1792  		s.DeletionJobStartTime = NewString(DATA_RETENTION_SETTINGS_DEFAULT_DELETION_JOB_START_TIME)
  1793  	}
  1794  }
  1795  
  1796  type JobSettings struct {
  1797  	RunJobs      *bool
  1798  	RunScheduler *bool
  1799  }
  1800  
  1801  func (s *JobSettings) SetDefaults() {
  1802  	if s.RunJobs == nil {
  1803  		s.RunJobs = NewBool(true)
  1804  	}
  1805  
  1806  	if s.RunScheduler == nil {
  1807  		s.RunScheduler = NewBool(true)
  1808  	}
  1809  }
  1810  
  1811  type PluginState struct {
  1812  	Enable bool
  1813  }
  1814  
  1815  type PluginSettings struct {
  1816  	Enable          *bool
  1817  	EnableUploads   *bool
  1818  	Directory       *string
  1819  	ClientDirectory *string
  1820  	Plugins         map[string]map[string]interface{}
  1821  	PluginStates    map[string]*PluginState
  1822  }
  1823  
  1824  func (s *PluginSettings) SetDefaults() {
  1825  	if s.Enable == nil {
  1826  		s.Enable = NewBool(true)
  1827  	}
  1828  
  1829  	if s.EnableUploads == nil {
  1830  		s.EnableUploads = NewBool(false)
  1831  	}
  1832  
  1833  	if s.Directory == nil {
  1834  		s.Directory = NewString(PLUGIN_SETTINGS_DEFAULT_DIRECTORY)
  1835  	}
  1836  
  1837  	if *s.Directory == "" {
  1838  		*s.Directory = PLUGIN_SETTINGS_DEFAULT_DIRECTORY
  1839  	}
  1840  
  1841  	if s.ClientDirectory == nil {
  1842  		s.ClientDirectory = NewString(PLUGIN_SETTINGS_DEFAULT_CLIENT_DIRECTORY)
  1843  	}
  1844  
  1845  	if *s.ClientDirectory == "" {
  1846  		*s.ClientDirectory = PLUGIN_SETTINGS_DEFAULT_CLIENT_DIRECTORY
  1847  	}
  1848  
  1849  	if s.Plugins == nil {
  1850  		s.Plugins = make(map[string]map[string]interface{})
  1851  	}
  1852  
  1853  	if s.PluginStates == nil {
  1854  		s.PluginStates = make(map[string]*PluginState)
  1855  	}
  1856  }
  1857  
  1858  type GlobalRelayMessageExportSettings struct {
  1859  	CustomerType *string // must be either A9 or A10, dictates SMTP server url
  1860  	SmtpUsername *string
  1861  	SmtpPassword *string
  1862  	EmailAddress *string // the address to send messages to
  1863  }
  1864  
  1865  func (s *GlobalRelayMessageExportSettings) SetDefaults() {
  1866  	if s.CustomerType == nil {
  1867  		s.CustomerType = NewString(GLOBALRELAY_CUSTOMER_TYPE_A9)
  1868  	}
  1869  	if s.SmtpUsername == nil {
  1870  		s.SmtpUsername = NewString("")
  1871  	}
  1872  	if s.SmtpPassword == nil {
  1873  		s.SmtpPassword = NewString("")
  1874  	}
  1875  	if s.EmailAddress == nil {
  1876  		s.EmailAddress = NewString("")
  1877  	}
  1878  }
  1879  
  1880  type MessageExportSettings struct {
  1881  	EnableExport        *bool
  1882  	ExportFormat        *string
  1883  	DailyRunTime        *string
  1884  	ExportFromTimestamp *int64
  1885  	BatchSize           *int
  1886  
  1887  	// formatter-specific settings - these are only expected to be non-nil if ExportFormat is set to the associated format
  1888  	GlobalRelaySettings *GlobalRelayMessageExportSettings
  1889  }
  1890  
  1891  func (s *MessageExportSettings) SetDefaults() {
  1892  	if s.EnableExport == nil {
  1893  		s.EnableExport = NewBool(false)
  1894  	}
  1895  
  1896  	if s.ExportFormat == nil {
  1897  		s.ExportFormat = NewString(COMPLIANCE_EXPORT_TYPE_ACTIANCE)
  1898  	}
  1899  
  1900  	if s.DailyRunTime == nil {
  1901  		s.DailyRunTime = NewString("01:00")
  1902  	}
  1903  
  1904  	if s.ExportFromTimestamp == nil {
  1905  		s.ExportFromTimestamp = NewInt64(0)
  1906  	}
  1907  
  1908  	if s.BatchSize == nil {
  1909  		s.BatchSize = NewInt(10000)
  1910  	}
  1911  
  1912  	if s.GlobalRelaySettings == nil {
  1913  		s.GlobalRelaySettings = &GlobalRelayMessageExportSettings{}
  1914  	}
  1915  	s.GlobalRelaySettings.SetDefaults()
  1916  }
  1917  
  1918  type DisplaySettings struct {
  1919  	CustomUrlSchemes     []string
  1920  	ExperimentalTimezone *bool
  1921  }
  1922  
  1923  func (s *DisplaySettings) SetDefaults() {
  1924  	if s.CustomUrlSchemes == nil {
  1925  		customUrlSchemes := []string{}
  1926  		s.CustomUrlSchemes = customUrlSchemes
  1927  	}
  1928  
  1929  	if s.ExperimentalTimezone == nil {
  1930  		s.ExperimentalTimezone = NewBool(false)
  1931  	}
  1932  }
  1933  
  1934  type TimezoneSettings struct {
  1935  	SupportedTimezonesPath *string
  1936  }
  1937  
  1938  func (s *TimezoneSettings) SetDefaults() {
  1939  	if s.SupportedTimezonesPath == nil {
  1940  		s.SupportedTimezonesPath = NewString(TIMEZONE_SETTINGS_DEFAULT_SUPPORTED_TIMEZONES_PATH)
  1941  	}
  1942  }
  1943  
  1944  type ImageProxySettings struct {
  1945  	Enable                  *bool
  1946  	ImageProxyType          *string
  1947  	RemoteImageProxyURL     *string
  1948  	RemoteImageProxyOptions *string
  1949  }
  1950  
  1951  func (ips *ImageProxySettings) SetDefaults(ss ServiceSettings) {
  1952  	if ips.Enable == nil {
  1953  		ips.Enable = NewBool(true)
  1954  	}
  1955  
  1956  	if ips.ImageProxyType == nil {
  1957  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyType == nil || *ss.DEPRECATED_DO_NOT_USE_ImageProxyType == "" {
  1958  			ips.ImageProxyType = NewString(IMAGE_PROXY_TYPE_LOCAL)
  1959  		} else {
  1960  			ips.ImageProxyType = ss.DEPRECATED_DO_NOT_USE_ImageProxyType
  1961  		}
  1962  	}
  1963  
  1964  	if ips.RemoteImageProxyURL == nil {
  1965  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyURL == nil {
  1966  			ips.RemoteImageProxyURL = NewString("")
  1967  		} else {
  1968  			ips.RemoteImageProxyURL = ss.DEPRECATED_DO_NOT_USE_ImageProxyURL
  1969  		}
  1970  	}
  1971  
  1972  	if ips.RemoteImageProxyOptions == nil {
  1973  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyOptions == nil {
  1974  			ips.RemoteImageProxyOptions = NewString("")
  1975  		} else {
  1976  			ips.RemoteImageProxyOptions = ss.DEPRECATED_DO_NOT_USE_ImageProxyOptions
  1977  		}
  1978  	}
  1979  }
  1980  
  1981  type ConfigFunc func() *Config
  1982  
  1983  type Config struct {
  1984  	ServiceSettings       ServiceSettings
  1985  	TeamSettings          TeamSettings
  1986  	ClientRequirements    ClientRequirements
  1987  	SqlSettings           SqlSettings
  1988  	LogSettings           LogSettings
  1989  	PasswordSettings      PasswordSettings
  1990  	FileSettings          FileSettings
  1991  	EmailSettings         EmailSettings
  1992  	RateLimitSettings     RateLimitSettings
  1993  	PrivacySettings       PrivacySettings
  1994  	SupportSettings       SupportSettings
  1995  	AnnouncementSettings  AnnouncementSettings
  1996  	ThemeSettings         ThemeSettings
  1997  	GitLabSettings        SSOSettings
  1998  	GoogleSettings        SSOSettings
  1999  	Office365Settings     SSOSettings
  2000  	LdapSettings          LdapSettings
  2001  	ComplianceSettings    ComplianceSettings
  2002  	LocalizationSettings  LocalizationSettings
  2003  	SamlSettings          SamlSettings
  2004  	NativeAppSettings     NativeAppSettings
  2005  	ClusterSettings       ClusterSettings
  2006  	MetricsSettings       MetricsSettings
  2007  	ExperimentalSettings  ExperimentalSettings
  2008  	AnalyticsSettings     AnalyticsSettings
  2009  	ElasticsearchSettings ElasticsearchSettings
  2010  	DataRetentionSettings DataRetentionSettings
  2011  	MessageExportSettings MessageExportSettings
  2012  	JobSettings           JobSettings
  2013  	PluginSettings        PluginSettings
  2014  	DisplaySettings       DisplaySettings
  2015  	TimezoneSettings      TimezoneSettings
  2016  	ImageProxySettings    ImageProxySettings
  2017  }
  2018  
  2019  func (o *Config) Clone() *Config {
  2020  	var ret Config
  2021  	if err := json.Unmarshal([]byte(o.ToJson()), &ret); err != nil {
  2022  		panic(err)
  2023  	}
  2024  	return &ret
  2025  }
  2026  
  2027  func (o *Config) ToJson() string {
  2028  	b, _ := json.Marshal(o)
  2029  	return string(b)
  2030  }
  2031  
  2032  func (o *Config) GetSSOService(service string) *SSOSettings {
  2033  	switch service {
  2034  	case SERVICE_GITLAB:
  2035  		return &o.GitLabSettings
  2036  	case SERVICE_GOOGLE:
  2037  		return &o.GoogleSettings
  2038  	case SERVICE_OFFICE365:
  2039  		return &o.Office365Settings
  2040  	}
  2041  
  2042  	return nil
  2043  }
  2044  
  2045  func ConfigFromJson(data io.Reader) *Config {
  2046  	var o *Config
  2047  	json.NewDecoder(data).Decode(&o)
  2048  	return o
  2049  }
  2050  
  2051  func (o *Config) SetDefaults() {
  2052  	o.LdapSettings.SetDefaults()
  2053  	o.SamlSettings.SetDefaults()
  2054  
  2055  	if o.TeamSettings.TeammateNameDisplay == nil {
  2056  		o.TeamSettings.TeammateNameDisplay = NewString(SHOW_USERNAME)
  2057  
  2058  		if *o.SamlSettings.Enable || *o.LdapSettings.Enable {
  2059  			*o.TeamSettings.TeammateNameDisplay = SHOW_FULLNAME
  2060  		}
  2061  	}
  2062  
  2063  	o.SqlSettings.SetDefaults()
  2064  	o.FileSettings.SetDefaults()
  2065  	o.EmailSettings.SetDefaults()
  2066  	o.ServiceSettings.SetDefaults()
  2067  	o.PasswordSettings.SetDefaults()
  2068  	o.TeamSettings.SetDefaults()
  2069  	o.MetricsSettings.SetDefaults()
  2070  	o.ExperimentalSettings.SetDefaults()
  2071  	o.SupportSettings.SetDefaults()
  2072  	o.AnnouncementSettings.SetDefaults()
  2073  	o.ThemeSettings.SetDefaults()
  2074  	o.ClusterSettings.SetDefaults()
  2075  	o.PluginSettings.SetDefaults()
  2076  	o.AnalyticsSettings.SetDefaults()
  2077  	o.ComplianceSettings.SetDefaults()
  2078  	o.LocalizationSettings.SetDefaults()
  2079  	o.ElasticsearchSettings.SetDefaults()
  2080  	o.NativeAppSettings.SetDefaults()
  2081  	o.DataRetentionSettings.SetDefaults()
  2082  	o.RateLimitSettings.SetDefaults()
  2083  	o.LogSettings.SetDefaults()
  2084  	o.JobSettings.SetDefaults()
  2085  	o.MessageExportSettings.SetDefaults()
  2086  	o.TimezoneSettings.SetDefaults()
  2087  	o.DisplaySettings.SetDefaults()
  2088  	o.ImageProxySettings.SetDefaults(o.ServiceSettings)
  2089  }
  2090  
  2091  func (o *Config) IsValid() *AppError {
  2092  	if len(*o.ServiceSettings.SiteURL) == 0 && *o.EmailSettings.EnableEmailBatching {
  2093  		return NewAppError("Config.IsValid", "model.config.is_valid.site_url_email_batching.app_error", nil, "", http.StatusBadRequest)
  2094  	}
  2095  
  2096  	if *o.ClusterSettings.Enable && *o.EmailSettings.EnableEmailBatching {
  2097  		return NewAppError("Config.IsValid", "model.config.is_valid.cluster_email_batching.app_error", nil, "", http.StatusBadRequest)
  2098  	}
  2099  
  2100  	if len(*o.ServiceSettings.SiteURL) == 0 && *o.ServiceSettings.AllowCookiesForSubdomains {
  2101  		return NewAppError("Config.IsValid", "model.config.is_valid.allow_cookies_for_subdomains.app_error", nil, "", http.StatusBadRequest)
  2102  	}
  2103  
  2104  	if err := o.TeamSettings.isValid(); err != nil {
  2105  		return err
  2106  	}
  2107  
  2108  	if err := o.SqlSettings.isValid(); err != nil {
  2109  		return err
  2110  	}
  2111  
  2112  	if err := o.FileSettings.isValid(); err != nil {
  2113  		return err
  2114  	}
  2115  
  2116  	if err := o.EmailSettings.isValid(); err != nil {
  2117  		return err
  2118  	}
  2119  
  2120  	if err := o.LdapSettings.isValid(); err != nil {
  2121  		return err
  2122  	}
  2123  
  2124  	if err := o.SamlSettings.isValid(); err != nil {
  2125  		return err
  2126  	}
  2127  
  2128  	if *o.PasswordSettings.MinimumLength < PASSWORD_MINIMUM_LENGTH || *o.PasswordSettings.MinimumLength > PASSWORD_MAXIMUM_LENGTH {
  2129  		return NewAppError("Config.IsValid", "model.config.is_valid.password_length.app_error", map[string]interface{}{"MinLength": PASSWORD_MINIMUM_LENGTH, "MaxLength": PASSWORD_MAXIMUM_LENGTH}, "", http.StatusBadRequest)
  2130  	}
  2131  
  2132  	if err := o.RateLimitSettings.isValid(); err != nil {
  2133  		return err
  2134  	}
  2135  
  2136  	if err := o.ServiceSettings.isValid(); err != nil {
  2137  		return err
  2138  	}
  2139  
  2140  	if err := o.ElasticsearchSettings.isValid(); err != nil {
  2141  		return err
  2142  	}
  2143  
  2144  	if err := o.DataRetentionSettings.isValid(); err != nil {
  2145  		return err
  2146  	}
  2147  
  2148  	if err := o.LocalizationSettings.isValid(); err != nil {
  2149  		return err
  2150  	}
  2151  
  2152  	if err := o.MessageExportSettings.isValid(o.FileSettings); err != nil {
  2153  		return err
  2154  	}
  2155  
  2156  	if err := o.DisplaySettings.isValid(); err != nil {
  2157  		return err
  2158  	}
  2159  
  2160  	if err := o.ImageProxySettings.isValid(); err != nil {
  2161  		return err
  2162  	}
  2163  
  2164  	return nil
  2165  }
  2166  
  2167  func (ts *TeamSettings) isValid() *AppError {
  2168  	if *ts.MaxUsersPerTeam <= 0 {
  2169  		return NewAppError("Config.IsValid", "model.config.is_valid.max_users.app_error", nil, "", http.StatusBadRequest)
  2170  	}
  2171  
  2172  	if *ts.MaxChannelsPerTeam <= 0 {
  2173  		return NewAppError("Config.IsValid", "model.config.is_valid.max_channels.app_error", nil, "", http.StatusBadRequest)
  2174  	}
  2175  
  2176  	if *ts.MaxNotificationsPerChannel <= 0 {
  2177  		return NewAppError("Config.IsValid", "model.config.is_valid.max_notify_per_channel.app_error", nil, "", http.StatusBadRequest)
  2178  	}
  2179  
  2180  	if !(*ts.RestrictDirectMessage == DIRECT_MESSAGE_ANY || *ts.RestrictDirectMessage == DIRECT_MESSAGE_TEAM) {
  2181  		return NewAppError("Config.IsValid", "model.config.is_valid.restrict_direct_message.app_error", nil, "", http.StatusBadRequest)
  2182  	}
  2183  
  2184  	if !(*ts.TeammateNameDisplay == SHOW_FULLNAME || *ts.TeammateNameDisplay == SHOW_NICKNAME_FULLNAME || *ts.TeammateNameDisplay == SHOW_USERNAME) {
  2185  		return NewAppError("Config.IsValid", "model.config.is_valid.teammate_name_display.app_error", nil, "", http.StatusBadRequest)
  2186  	}
  2187  
  2188  	if len(ts.SiteName) > SITENAME_MAX_LENGTH {
  2189  		return NewAppError("Config.IsValid", "model.config.is_valid.sitename_length.app_error", map[string]interface{}{"MaxLength": SITENAME_MAX_LENGTH}, "", http.StatusBadRequest)
  2190  	}
  2191  
  2192  	return nil
  2193  }
  2194  
  2195  func (ss *SqlSettings) isValid() *AppError {
  2196  	if len(ss.AtRestEncryptKey) < 32 {
  2197  		return NewAppError("Config.IsValid", "model.config.is_valid.encrypt_sql.app_error", nil, "", http.StatusBadRequest)
  2198  	}
  2199  
  2200  	if !(*ss.DriverName == DATABASE_DRIVER_MYSQL || *ss.DriverName == DATABASE_DRIVER_POSTGRES) {
  2201  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_driver.app_error", nil, "", http.StatusBadRequest)
  2202  	}
  2203  
  2204  	if *ss.MaxIdleConns <= 0 {
  2205  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_idle.app_error", nil, "", http.StatusBadRequest)
  2206  	}
  2207  
  2208  	if *ss.ConnMaxLifetimeMilliseconds < 0 {
  2209  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_conn_max_lifetime_milliseconds.app_error", nil, "", http.StatusBadRequest)
  2210  	}
  2211  
  2212  	if *ss.QueryTimeout <= 0 {
  2213  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_query_timeout.app_error", nil, "", http.StatusBadRequest)
  2214  	}
  2215  
  2216  	if len(*ss.DataSource) == 0 {
  2217  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_data_src.app_error", nil, "", http.StatusBadRequest)
  2218  	}
  2219  
  2220  	if *ss.MaxOpenConns <= 0 {
  2221  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_max_conn.app_error", nil, "", http.StatusBadRequest)
  2222  	}
  2223  
  2224  	return nil
  2225  }
  2226  
  2227  func (fs *FileSettings) isValid() *AppError {
  2228  	if *fs.MaxFileSize <= 0 {
  2229  		return NewAppError("Config.IsValid", "model.config.is_valid.max_file_size.app_error", nil, "", http.StatusBadRequest)
  2230  	}
  2231  
  2232  	if !(*fs.DriverName == IMAGE_DRIVER_LOCAL || *fs.DriverName == IMAGE_DRIVER_S3) {
  2233  		return NewAppError("Config.IsValid", "model.config.is_valid.file_driver.app_error", nil, "", http.StatusBadRequest)
  2234  	}
  2235  
  2236  	if len(*fs.PublicLinkSalt) < 32 {
  2237  		return NewAppError("Config.IsValid", "model.config.is_valid.file_salt.app_error", nil, "", http.StatusBadRequest)
  2238  	}
  2239  
  2240  	return nil
  2241  }
  2242  
  2243  func (es *EmailSettings) isValid() *AppError {
  2244  	if !(es.ConnectionSecurity == CONN_SECURITY_NONE || es.ConnectionSecurity == CONN_SECURITY_TLS || es.ConnectionSecurity == CONN_SECURITY_STARTTLS || es.ConnectionSecurity == CONN_SECURITY_PLAIN) {
  2245  		return NewAppError("Config.IsValid", "model.config.is_valid.email_security.app_error", nil, "", http.StatusBadRequest)
  2246  	}
  2247  
  2248  	if len(es.InviteSalt) < 32 {
  2249  		return NewAppError("Config.IsValid", "model.config.is_valid.email_salt.app_error", nil, "", http.StatusBadRequest)
  2250  	}
  2251  
  2252  	if *es.EmailBatchingBufferSize <= 0 {
  2253  		return NewAppError("Config.IsValid", "model.config.is_valid.email_batching_buffer_size.app_error", nil, "", http.StatusBadRequest)
  2254  	}
  2255  
  2256  	if *es.EmailBatchingInterval < 30 {
  2257  		return NewAppError("Config.IsValid", "model.config.is_valid.email_batching_interval.app_error", nil, "", http.StatusBadRequest)
  2258  	}
  2259  
  2260  	if !(*es.EmailNotificationContentsType == EMAIL_NOTIFICATION_CONTENTS_FULL || *es.EmailNotificationContentsType == EMAIL_NOTIFICATION_CONTENTS_GENERIC) {
  2261  		return NewAppError("Config.IsValid", "model.config.is_valid.email_notification_contents_type.app_error", nil, "", http.StatusBadRequest)
  2262  	}
  2263  
  2264  	return nil
  2265  }
  2266  
  2267  func (rls *RateLimitSettings) isValid() *AppError {
  2268  	if *rls.MemoryStoreSize <= 0 {
  2269  		return NewAppError("Config.IsValid", "model.config.is_valid.rate_mem.app_error", nil, "", http.StatusBadRequest)
  2270  	}
  2271  
  2272  	if *rls.PerSec <= 0 {
  2273  		return NewAppError("Config.IsValid", "model.config.is_valid.rate_sec.app_error", nil, "", http.StatusBadRequest)
  2274  	}
  2275  
  2276  	if *rls.MaxBurst <= 0 {
  2277  		return NewAppError("Config.IsValid", "model.config.is_valid.max_burst.app_error", nil, "", http.StatusBadRequest)
  2278  	}
  2279  
  2280  	return nil
  2281  }
  2282  
  2283  func (ls *LdapSettings) isValid() *AppError {
  2284  	if !(*ls.ConnectionSecurity == CONN_SECURITY_NONE || *ls.ConnectionSecurity == CONN_SECURITY_TLS || *ls.ConnectionSecurity == CONN_SECURITY_STARTTLS) {
  2285  		return NewAppError("Config.IsValid", "model.config.is_valid.ldap_security.app_error", nil, "", http.StatusBadRequest)
  2286  	}
  2287  
  2288  	if *ls.SyncIntervalMinutes <= 0 {
  2289  		return NewAppError("Config.IsValid", "model.config.is_valid.ldap_sync_interval.app_error", nil, "", http.StatusBadRequest)
  2290  	}
  2291  
  2292  	if *ls.MaxPageSize < 0 {
  2293  		return NewAppError("Config.IsValid", "model.config.is_valid.ldap_max_page_size.app_error", nil, "", http.StatusBadRequest)
  2294  	}
  2295  
  2296  	if *ls.Enable {
  2297  		if *ls.LdapServer == "" {
  2298  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_server", nil, "", http.StatusBadRequest)
  2299  		}
  2300  
  2301  		if *ls.BaseDN == "" {
  2302  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_basedn", nil, "", http.StatusBadRequest)
  2303  		}
  2304  
  2305  		if *ls.EmailAttribute == "" {
  2306  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_email", nil, "", http.StatusBadRequest)
  2307  		}
  2308  
  2309  		if *ls.UsernameAttribute == "" {
  2310  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_username", nil, "", http.StatusBadRequest)
  2311  		}
  2312  
  2313  		if *ls.IdAttribute == "" {
  2314  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_id", nil, "", http.StatusBadRequest)
  2315  		}
  2316  
  2317  		if *ls.LoginIdAttribute == "" {
  2318  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_login_id", nil, "", http.StatusBadRequest)
  2319  		}
  2320  	}
  2321  
  2322  	return nil
  2323  }
  2324  
  2325  func (ss *SamlSettings) isValid() *AppError {
  2326  	if *ss.Enable {
  2327  		if len(*ss.IdpUrl) == 0 || !IsValidHttpUrl(*ss.IdpUrl) {
  2328  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_idp_url.app_error", nil, "", http.StatusBadRequest)
  2329  		}
  2330  
  2331  		if len(*ss.IdpDescriptorUrl) == 0 || !IsValidHttpUrl(*ss.IdpDescriptorUrl) {
  2332  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_idp_descriptor_url.app_error", nil, "", http.StatusBadRequest)
  2333  		}
  2334  
  2335  		if len(*ss.IdpCertificateFile) == 0 {
  2336  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_idp_cert.app_error", nil, "", http.StatusBadRequest)
  2337  		}
  2338  
  2339  		if len(*ss.EmailAttribute) == 0 {
  2340  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_email_attribute.app_error", nil, "", http.StatusBadRequest)
  2341  		}
  2342  
  2343  		if len(*ss.UsernameAttribute) == 0 {
  2344  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_username_attribute.app_error", nil, "", http.StatusBadRequest)
  2345  		}
  2346  
  2347  		if *ss.Verify {
  2348  			if len(*ss.AssertionConsumerServiceURL) == 0 || !IsValidHttpUrl(*ss.AssertionConsumerServiceURL) {
  2349  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_assertion_consumer_service_url.app_error", nil, "", http.StatusBadRequest)
  2350  			}
  2351  		}
  2352  
  2353  		if *ss.Encrypt {
  2354  			if len(*ss.PrivateKeyFile) == 0 {
  2355  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_private_key.app_error", nil, "", http.StatusBadRequest)
  2356  			}
  2357  
  2358  			if len(*ss.PublicCertificateFile) == 0 {
  2359  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_public_cert.app_error", nil, "", http.StatusBadRequest)
  2360  			}
  2361  		}
  2362  
  2363  		if len(*ss.EmailAttribute) == 0 {
  2364  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_email_attribute.app_error", nil, "", http.StatusBadRequest)
  2365  		}
  2366  	}
  2367  
  2368  	return nil
  2369  }
  2370  
  2371  func (ss *ServiceSettings) isValid() *AppError {
  2372  	if !(*ss.ConnectionSecurity == CONN_SECURITY_NONE || *ss.ConnectionSecurity == CONN_SECURITY_TLS) {
  2373  		return NewAppError("Config.IsValid", "model.config.is_valid.webserver_security.app_error", nil, "", http.StatusBadRequest)
  2374  	}
  2375  
  2376  	if *ss.ConnectionSecurity == CONN_SECURITY_TLS && *ss.UseLetsEncrypt == false {
  2377  		appErr := NewAppError("Config.IsValid", "model.config.is_valid.tls_cert_file.app_error", nil, "", http.StatusBadRequest)
  2378  
  2379  		if *ss.TLSCertFile == "" {
  2380  			return appErr
  2381  		} else if _, err := os.Stat(*ss.TLSCertFile); os.IsNotExist(err) {
  2382  			return appErr
  2383  		}
  2384  
  2385  		appErr = NewAppError("Config.IsValid", "model.config.is_valid.tls_key_file.app_error", nil, "", http.StatusBadRequest)
  2386  
  2387  		if *ss.TLSKeyFile == "" {
  2388  			return appErr
  2389  		} else if _, err := os.Stat(*ss.TLSKeyFile); os.IsNotExist(err) {
  2390  			return appErr
  2391  		}
  2392  	}
  2393  
  2394  	if len(ss.TLSOverwriteCiphers) > 0 {
  2395  		for _, cipher := range ss.TLSOverwriteCiphers {
  2396  			if _, ok := ServerTLSSupportedCiphers[cipher]; !ok {
  2397  				return NewAppError("Config.IsValid", "model.config.is_valid.tls_overwrite_cipher.app_error", map[string]interface{}{"name": cipher}, "", http.StatusBadRequest)
  2398  			}
  2399  		}
  2400  	}
  2401  
  2402  	if *ss.ReadTimeout <= 0 {
  2403  		return NewAppError("Config.IsValid", "model.config.is_valid.read_timeout.app_error", nil, "", http.StatusBadRequest)
  2404  	}
  2405  
  2406  	if *ss.WriteTimeout <= 0 {
  2407  		return NewAppError("Config.IsValid", "model.config.is_valid.write_timeout.app_error", nil, "", http.StatusBadRequest)
  2408  	}
  2409  
  2410  	if *ss.TimeBetweenUserTypingUpdatesMilliseconds < 1000 {
  2411  		return NewAppError("Config.IsValid", "model.config.is_valid.time_between_user_typing.app_error", nil, "", http.StatusBadRequest)
  2412  	}
  2413  
  2414  	if *ss.MaximumLoginAttempts <= 0 {
  2415  		return NewAppError("Config.IsValid", "model.config.is_valid.login_attempts.app_error", nil, "", http.StatusBadRequest)
  2416  	}
  2417  
  2418  	if len(*ss.SiteURL) != 0 {
  2419  		if _, err := url.ParseRequestURI(*ss.SiteURL); err != nil {
  2420  			return NewAppError("Config.IsValid", "model.config.is_valid.site_url.app_error", nil, "", http.StatusBadRequest)
  2421  		}
  2422  	}
  2423  
  2424  	if len(*ss.WebsocketURL) != 0 {
  2425  		if _, err := url.ParseRequestURI(*ss.WebsocketURL); err != nil {
  2426  			return NewAppError("Config.IsValid", "model.config.is_valid.websocket_url.app_error", nil, "", http.StatusBadRequest)
  2427  		}
  2428  	}
  2429  
  2430  	host, port, _ := net.SplitHostPort(*ss.ListenAddress)
  2431  	var isValidHost bool
  2432  	if host == "" {
  2433  		isValidHost = true
  2434  	} else {
  2435  		isValidHost = (net.ParseIP(host) != nil) || IsDomainName(host)
  2436  	}
  2437  	portInt, err := strconv.Atoi(port)
  2438  	if err != nil || !isValidHost || portInt < 0 || portInt > math.MaxUint16 {
  2439  		return NewAppError("Config.IsValid", "model.config.is_valid.listen_address.app_error", nil, "", http.StatusBadRequest)
  2440  	}
  2441  
  2442  	if *ss.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DISABLED &&
  2443  		*ss.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DEFAULT_ON &&
  2444  		*ss.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DEFAULT_OFF {
  2445  		return NewAppError("Config.IsValid", "model.config.is_valid.group_unread_channels.app_error", nil, "", http.StatusBadRequest)
  2446  	}
  2447  
  2448  	return nil
  2449  }
  2450  
  2451  func (ess *ElasticsearchSettings) isValid() *AppError {
  2452  	if *ess.EnableIndexing {
  2453  		if len(*ess.ConnectionUrl) == 0 {
  2454  			return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.connection_url.app_error", nil, "", http.StatusBadRequest)
  2455  		}
  2456  	}
  2457  
  2458  	if *ess.EnableSearching && !*ess.EnableIndexing {
  2459  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.enable_searching.app_error", nil, "", http.StatusBadRequest)
  2460  	}
  2461  
  2462  	if *ess.AggregatePostsAfterDays < 1 {
  2463  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.aggregate_posts_after_days.app_error", nil, "", http.StatusBadRequest)
  2464  	}
  2465  
  2466  	if _, err := time.Parse("15:04", *ess.PostsAggregatorJobStartTime); err != nil {
  2467  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.posts_aggregator_job_start_time.app_error", nil, err.Error(), http.StatusBadRequest)
  2468  	}
  2469  
  2470  	if *ess.LiveIndexingBatchSize < 1 {
  2471  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.live_indexing_batch_size.app_error", nil, "", http.StatusBadRequest)
  2472  	}
  2473  
  2474  	if *ess.BulkIndexingTimeWindowSeconds < 1 {
  2475  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.bulk_indexing_time_window_seconds.app_error", nil, "", http.StatusBadRequest)
  2476  	}
  2477  
  2478  	if *ess.RequestTimeoutSeconds < 1 {
  2479  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.request_timeout_seconds.app_error", nil, "", http.StatusBadRequest)
  2480  	}
  2481  
  2482  	return nil
  2483  }
  2484  
  2485  func (drs *DataRetentionSettings) isValid() *AppError {
  2486  	if *drs.MessageRetentionDays <= 0 {
  2487  		return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.message_retention_days_too_low.app_error", nil, "", http.StatusBadRequest)
  2488  	}
  2489  
  2490  	if *drs.FileRetentionDays <= 0 {
  2491  		return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.file_retention_days_too_low.app_error", nil, "", http.StatusBadRequest)
  2492  	}
  2493  
  2494  	if _, err := time.Parse("15:04", *drs.DeletionJobStartTime); err != nil {
  2495  		return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.deletion_job_start_time.app_error", nil, err.Error(), http.StatusBadRequest)
  2496  	}
  2497  
  2498  	return nil
  2499  }
  2500  
  2501  func (ls *LocalizationSettings) isValid() *AppError {
  2502  	if len(*ls.AvailableLocales) > 0 {
  2503  		if !strings.Contains(*ls.AvailableLocales, *ls.DefaultClientLocale) {
  2504  			return NewAppError("Config.IsValid", "model.config.is_valid.localization.available_locales.app_error", nil, "", http.StatusBadRequest)
  2505  		}
  2506  	}
  2507  
  2508  	return nil
  2509  }
  2510  
  2511  func (mes *MessageExportSettings) isValid(fs FileSettings) *AppError {
  2512  	if mes.EnableExport == nil {
  2513  		return NewAppError("Config.IsValid", "model.config.is_valid.message_export.enable.app_error", nil, "", http.StatusBadRequest)
  2514  	}
  2515  	if *mes.EnableExport {
  2516  		if mes.ExportFromTimestamp == nil || *mes.ExportFromTimestamp < 0 || *mes.ExportFromTimestamp > GetMillis() {
  2517  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.export_from.app_error", nil, "", http.StatusBadRequest)
  2518  		} else if mes.DailyRunTime == nil {
  2519  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.daily_runtime.app_error", nil, "", http.StatusBadRequest)
  2520  		} else if _, err := time.Parse("15:04", *mes.DailyRunTime); err != nil {
  2521  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.daily_runtime.app_error", nil, err.Error(), http.StatusBadRequest)
  2522  		} else if mes.BatchSize == nil || *mes.BatchSize < 0 {
  2523  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.batch_size.app_error", nil, "", http.StatusBadRequest)
  2524  		} else if mes.ExportFormat == nil || (*mes.ExportFormat != COMPLIANCE_EXPORT_TYPE_ACTIANCE && *mes.ExportFormat != COMPLIANCE_EXPORT_TYPE_GLOBALRELAY && *mes.ExportFormat != COMPLIANCE_EXPORT_TYPE_CSV) {
  2525  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.export_type.app_error", nil, "", http.StatusBadRequest)
  2526  		}
  2527  
  2528  		if *mes.ExportFormat == COMPLIANCE_EXPORT_TYPE_GLOBALRELAY {
  2529  			if mes.GlobalRelaySettings == nil {
  2530  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.config_missing.app_error", nil, "", http.StatusBadRequest)
  2531  			} else if mes.GlobalRelaySettings.CustomerType == nil || (*mes.GlobalRelaySettings.CustomerType != GLOBALRELAY_CUSTOMER_TYPE_A9 && *mes.GlobalRelaySettings.CustomerType != GLOBALRELAY_CUSTOMER_TYPE_A10) {
  2532  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.customer_type.app_error", nil, "", http.StatusBadRequest)
  2533  			} else if mes.GlobalRelaySettings.EmailAddress == nil || !strings.Contains(*mes.GlobalRelaySettings.EmailAddress, "@") {
  2534  				// validating email addresses is hard - just make sure it contains an '@' sign
  2535  				// see https://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
  2536  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.email_address.app_error", nil, "", http.StatusBadRequest)
  2537  			} else if mes.GlobalRelaySettings.SmtpUsername == nil || *mes.GlobalRelaySettings.SmtpUsername == "" {
  2538  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.smtp_username.app_error", nil, "", http.StatusBadRequest)
  2539  			} else if mes.GlobalRelaySettings.SmtpPassword == nil || *mes.GlobalRelaySettings.SmtpPassword == "" {
  2540  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.smtp_password.app_error", nil, "", http.StatusBadRequest)
  2541  			}
  2542  		}
  2543  	}
  2544  	return nil
  2545  }
  2546  
  2547  func (ds *DisplaySettings) isValid() *AppError {
  2548  	if len(ds.CustomUrlSchemes) != 0 {
  2549  		validProtocolPattern := regexp.MustCompile(`(?i)^\s*[a-z][a-z0-9-]*\s*$`)
  2550  
  2551  		for _, scheme := range ds.CustomUrlSchemes {
  2552  			if !validProtocolPattern.MatchString(scheme) {
  2553  				return NewAppError(
  2554  					"Config.IsValid",
  2555  					"model.config.is_valid.display.custom_url_schemes.app_error",
  2556  					map[string]interface{}{"Scheme": scheme},
  2557  					"",
  2558  					http.StatusBadRequest,
  2559  				)
  2560  			}
  2561  		}
  2562  	}
  2563  
  2564  	return nil
  2565  }
  2566  
  2567  func (ips *ImageProxySettings) isValid() *AppError {
  2568  	if *ips.Enable {
  2569  		switch *ips.ImageProxyType {
  2570  		case IMAGE_PROXY_TYPE_LOCAL:
  2571  			// No other settings to validate
  2572  		case IMAGE_PROXY_TYPE_ATMOS_CAMO:
  2573  			if *ips.RemoteImageProxyURL == "" {
  2574  				return NewAppError("Config.IsValid", "model.config.is_valid.atmos_camo_image_proxy_url.app_error", nil, "", http.StatusBadRequest)
  2575  			}
  2576  
  2577  			if *ips.RemoteImageProxyOptions == "" {
  2578  				return NewAppError("Config.IsValid", "model.config.is_valid.atmos_camo_image_proxy_options.app_error", nil, "", http.StatusBadRequest)
  2579  			}
  2580  		default:
  2581  			return NewAppError("Config.IsValid", "model.config.is_valid.image_proxy_type.app_error", nil, "", http.StatusBadRequest)
  2582  		}
  2583  	}
  2584  
  2585  	return nil
  2586  }
  2587  
  2588  func (o *Config) GetSanitizeOptions() map[string]bool {
  2589  	options := map[string]bool{}
  2590  	options["fullname"] = o.PrivacySettings.ShowFullName
  2591  	options["email"] = o.PrivacySettings.ShowEmailAddress
  2592  
  2593  	return options
  2594  }
  2595  
  2596  func (o *Config) Sanitize() {
  2597  	if o.LdapSettings.BindPassword != nil && len(*o.LdapSettings.BindPassword) > 0 {
  2598  		*o.LdapSettings.BindPassword = FAKE_SETTING
  2599  	}
  2600  
  2601  	*o.FileSettings.PublicLinkSalt = FAKE_SETTING
  2602  	if len(o.FileSettings.AmazonS3SecretAccessKey) > 0 {
  2603  		o.FileSettings.AmazonS3SecretAccessKey = FAKE_SETTING
  2604  	}
  2605  
  2606  	o.EmailSettings.InviteSalt = FAKE_SETTING
  2607  	if len(o.EmailSettings.SMTPPassword) > 0 {
  2608  		o.EmailSettings.SMTPPassword = FAKE_SETTING
  2609  	}
  2610  
  2611  	if len(o.GitLabSettings.Secret) > 0 {
  2612  		o.GitLabSettings.Secret = FAKE_SETTING
  2613  	}
  2614  
  2615  	*o.SqlSettings.DataSource = FAKE_SETTING
  2616  	o.SqlSettings.AtRestEncryptKey = FAKE_SETTING
  2617  
  2618  	for i := range o.SqlSettings.DataSourceReplicas {
  2619  		o.SqlSettings.DataSourceReplicas[i] = FAKE_SETTING
  2620  	}
  2621  
  2622  	for i := range o.SqlSettings.DataSourceSearchReplicas {
  2623  		o.SqlSettings.DataSourceSearchReplicas[i] = FAKE_SETTING
  2624  	}
  2625  
  2626  	*o.ElasticsearchSettings.Password = FAKE_SETTING
  2627  }