github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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  	"github.com/mattermost/ldap"
    21  )
    22  
    23  const (
    24  	CONN_SECURITY_NONE     = ""
    25  	CONN_SECURITY_PLAIN    = "PLAIN"
    26  	CONN_SECURITY_TLS      = "TLS"
    27  	CONN_SECURITY_STARTTLS = "STARTTLS"
    28  
    29  	IMAGE_DRIVER_LOCAL = "local"
    30  	IMAGE_DRIVER_S3    = "amazons3"
    31  
    32  	DATABASE_DRIVER_SQLITE   = "sqlite3"
    33  	DATABASE_DRIVER_MYSQL    = "mysql"
    34  	DATABASE_DRIVER_POSTGRES = "postgres"
    35  
    36  	MINIO_ACCESS_KEY = "minioaccesskey"
    37  	MINIO_SECRET_KEY = "miniosecretkey"
    38  	MINIO_BUCKET     = "mattermost-test"
    39  
    40  	PASSWORD_MAXIMUM_LENGTH = 64
    41  	PASSWORD_MINIMUM_LENGTH = 5
    42  
    43  	SERVICE_GITLAB    = "gitlab"
    44  	SERVICE_GOOGLE    = "google"
    45  	SERVICE_OFFICE365 = "office365"
    46  
    47  	GENERIC_NO_CHANNEL_NOTIFICATION = "generic_no_channel"
    48  	GENERIC_NOTIFICATION            = "generic"
    49  	GENERIC_NOTIFICATION_SERVER     = "https://push-test.mattermost.com"
    50  	MM_SUPPORT_ADDRESS              = "support@mattermost.com"
    51  	FULL_NOTIFICATION               = "full"
    52  	ID_LOADED_NOTIFICATION          = "id_loaded"
    53  
    54  	DIRECT_MESSAGE_ANY  = "any"
    55  	DIRECT_MESSAGE_TEAM = "team"
    56  
    57  	SHOW_USERNAME          = "username"
    58  	SHOW_NICKNAME_FULLNAME = "nickname_full_name"
    59  	SHOW_FULLNAME          = "full_name"
    60  
    61  	PERMISSIONS_ALL           = "all"
    62  	PERMISSIONS_CHANNEL_ADMIN = "channel_admin"
    63  	PERMISSIONS_TEAM_ADMIN    = "team_admin"
    64  	PERMISSIONS_SYSTEM_ADMIN  = "system_admin"
    65  
    66  	FAKE_SETTING = "********************************"
    67  
    68  	RESTRICT_EMOJI_CREATION_ALL          = "all"
    69  	RESTRICT_EMOJI_CREATION_ADMIN        = "admin"
    70  	RESTRICT_EMOJI_CREATION_SYSTEM_ADMIN = "system_admin"
    71  
    72  	PERMISSIONS_DELETE_POST_ALL          = "all"
    73  	PERMISSIONS_DELETE_POST_TEAM_ADMIN   = "team_admin"
    74  	PERMISSIONS_DELETE_POST_SYSTEM_ADMIN = "system_admin"
    75  
    76  	ALLOW_EDIT_POST_ALWAYS     = "always"
    77  	ALLOW_EDIT_POST_NEVER      = "never"
    78  	ALLOW_EDIT_POST_TIME_LIMIT = "time_limit"
    79  
    80  	GROUP_UNREAD_CHANNELS_DISABLED    = "disabled"
    81  	GROUP_UNREAD_CHANNELS_DEFAULT_ON  = "default_on"
    82  	GROUP_UNREAD_CHANNELS_DEFAULT_OFF = "default_off"
    83  
    84  	EMAIL_BATCHING_BUFFER_SIZE = 256
    85  	EMAIL_BATCHING_INTERVAL    = 30
    86  
    87  	EMAIL_NOTIFICATION_CONTENTS_FULL    = "full"
    88  	EMAIL_NOTIFICATION_CONTENTS_GENERIC = "generic"
    89  
    90  	SITENAME_MAX_LENGTH = 30
    91  
    92  	SERVICE_SETTINGS_DEFAULT_SITE_URL           = "http://localhost:8065"
    93  	SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE      = ""
    94  	SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE       = ""
    95  	SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT       = 300
    96  	SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT      = 300
    97  	SERVICE_SETTINGS_DEFAULT_IDLE_TIMEOUT       = 60
    98  	SERVICE_SETTINGS_DEFAULT_MAX_LOGIN_ATTEMPTS = 10
    99  	SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM    = ""
   100  	SERVICE_SETTINGS_DEFAULT_LISTEN_AND_ADDRESS = ":8065"
   101  	SERVICE_SETTINGS_DEFAULT_GFYCAT_API_KEY     = "2_KtH_W5"
   102  	SERVICE_SETTINGS_DEFAULT_GFYCAT_API_SECRET  = "3wLVZPiswc3DnaiaFoLkDvB4X0IV6CpMkj4tf2inJRsBY6-FnkT08zGmppWFgeof"
   103  
   104  	TEAM_SETTINGS_DEFAULT_SITE_NAME                = "Mattermost"
   105  	TEAM_SETTINGS_DEFAULT_MAX_USERS_PER_TEAM       = 50
   106  	TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT        = ""
   107  	TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT  = ""
   108  	TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT = 300
   109  
   110  	SQL_SETTINGS_DEFAULT_DATA_SOURCE = "mmuser:mostest@tcp(localhost:3306)/mattermost_test?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s"
   111  
   112  	FILE_SETTINGS_DEFAULT_DIRECTORY = "./data/"
   113  
   114  	EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION = ""
   115  
   116  	SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK = "https://about.mattermost.com/default-terms/"
   117  	SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK   = "https://about.mattermost.com/default-privacy-policy/"
   118  	SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK            = "https://about.mattermost.com/default-about/"
   119  	SUPPORT_SETTINGS_DEFAULT_HELP_LINK             = "https://about.mattermost.com/default-help/"
   120  	SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK = "https://about.mattermost.com/default-report-a-problem/"
   121  	SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL         = "feedback@mattermost.com"
   122  	SUPPORT_SETTINGS_DEFAULT_RE_ACCEPTANCE_PERIOD  = 365
   123  
   124  	LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE         = ""
   125  	LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE          = ""
   126  	LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE              = ""
   127  	LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE           = ""
   128  	LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE           = ""
   129  	LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE                 = ""
   130  	LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE           = ""
   131  	LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME             = ""
   132  	LDAP_SETTINGS_DEFAULT_GROUP_DISPLAY_NAME_ATTRIBUTE = ""
   133  	LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE           = ""
   134  	LDAP_SETTINGS_DEFAULT_PICTURE_ATTRIBUTE            = ""
   135  
   136  	SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE         = ""
   137  	SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE      = ""
   138  	SAML_SETTINGS_DEFAULT_ADMIN_ATTRIBUTE      = ""
   139  	SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE = ""
   140  	SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE  = ""
   141  	SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE      = ""
   142  	SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE   = ""
   143  	SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE   = ""
   144  	SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE     = ""
   145  	SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE   = ""
   146  
   147  	SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA1    = "RSAwithSHA1"
   148  	SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA256  = "RSAwithSHA256"
   149  	SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA512  = "RSAwithSHA512"
   150  	SAML_SETTINGS_DEFAULT_SIGNATURE_ALGORITHM = SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA1
   151  
   152  	SAML_SETTINGS_CANONICAL_ALGORITHM_C14N    = "Canonical1.0"
   153  	SAML_SETTINGS_CANONICAL_ALGORITHM_C14N11  = "Canonical1.1"
   154  	SAML_SETTINGS_DEFAULT_CANONICAL_ALGORITHM = SAML_SETTINGS_CANONICAL_ALGORITHM_C14N
   155  
   156  	NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK         = "https://mattermost.com/download/#mattermostApps"
   157  	NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK = "https://about.mattermost.com/mattermost-android-app/"
   158  	NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK     = "https://about.mattermost.com/mattermost-ios-app/"
   159  
   160  	EXPERIMENTAL_SETTINGS_DEFAULT_LINK_METADATA_TIMEOUT_MILLISECONDS = 5000
   161  
   162  	ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS = 2500
   163  
   164  	ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_COLOR      = "#f2a93b"
   165  	ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_TEXT_COLOR = "#333333"
   166  
   167  	TEAM_SETTINGS_DEFAULT_TEAM_TEXT = "default"
   168  
   169  	ELASTICSEARCH_SETTINGS_DEFAULT_CONNECTION_URL                    = "http://localhost:9200"
   170  	ELASTICSEARCH_SETTINGS_DEFAULT_USERNAME                          = "elastic"
   171  	ELASTICSEARCH_SETTINGS_DEFAULT_PASSWORD                          = "changeme"
   172  	ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_REPLICAS               = 1
   173  	ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_SHARDS                 = 1
   174  	ELASTICSEARCH_SETTINGS_DEFAULT_CHANNEL_INDEX_REPLICAS            = 1
   175  	ELASTICSEARCH_SETTINGS_DEFAULT_CHANNEL_INDEX_SHARDS              = 1
   176  	ELASTICSEARCH_SETTINGS_DEFAULT_USER_INDEX_REPLICAS               = 1
   177  	ELASTICSEARCH_SETTINGS_DEFAULT_USER_INDEX_SHARDS                 = 1
   178  	ELASTICSEARCH_SETTINGS_DEFAULT_AGGREGATE_POSTS_AFTER_DAYS        = 365
   179  	ELASTICSEARCH_SETTINGS_DEFAULT_POSTS_AGGREGATOR_JOB_START_TIME   = "03:00"
   180  	ELASTICSEARCH_SETTINGS_DEFAULT_INDEX_PREFIX                      = ""
   181  	ELASTICSEARCH_SETTINGS_DEFAULT_LIVE_INDEXING_BATCH_SIZE          = 1
   182  	ELASTICSEARCH_SETTINGS_DEFAULT_BULK_INDEXING_TIME_WINDOW_SECONDS = 3600
   183  	ELASTICSEARCH_SETTINGS_DEFAULT_REQUEST_TIMEOUT_SECONDS           = 30
   184  
   185  	BLEVE_SETTINGS_DEFAULT_INDEX_DIR                         = ""
   186  	BLEVE_SETTINGS_DEFAULT_BULK_INDEXING_TIME_WINDOW_SECONDS = 3600
   187  
   188  	DATA_RETENTION_SETTINGS_DEFAULT_MESSAGE_RETENTION_DAYS  = 365
   189  	DATA_RETENTION_SETTINGS_DEFAULT_FILE_RETENTION_DAYS     = 365
   190  	DATA_RETENTION_SETTINGS_DEFAULT_DELETION_JOB_START_TIME = "02:00"
   191  
   192  	PLUGIN_SETTINGS_DEFAULT_DIRECTORY          = "./plugins"
   193  	PLUGIN_SETTINGS_DEFAULT_CLIENT_DIRECTORY   = "./client/plugins"
   194  	PLUGIN_SETTINGS_DEFAULT_ENABLE_MARKETPLACE = true
   195  	PLUGIN_SETTINGS_DEFAULT_MARKETPLACE_URL    = "https://api.integrations.mattermost.com"
   196  	PLUGIN_SETTINGS_OLD_MARKETPLACE_URL        = "https://marketplace.integrations.mattermost.com"
   197  
   198  	COMPLIANCE_EXPORT_TYPE_CSV             = "csv"
   199  	COMPLIANCE_EXPORT_TYPE_ACTIANCE        = "actiance"
   200  	COMPLIANCE_EXPORT_TYPE_GLOBALRELAY     = "globalrelay"
   201  	COMPLIANCE_EXPORT_TYPE_GLOBALRELAY_ZIP = "globalrelay-zip"
   202  	GLOBALRELAY_CUSTOMER_TYPE_A9           = "A9"
   203  	GLOBALRELAY_CUSTOMER_TYPE_A10          = "A10"
   204  
   205  	CLIENT_SIDE_CERT_CHECK_PRIMARY_AUTH   = "primary"
   206  	CLIENT_SIDE_CERT_CHECK_SECONDARY_AUTH = "secondary"
   207  
   208  	IMAGE_PROXY_TYPE_LOCAL      = "local"
   209  	IMAGE_PROXY_TYPE_ATMOS_CAMO = "atmos/camo"
   210  
   211  	GOOGLE_SETTINGS_DEFAULT_SCOPE             = "profile email"
   212  	GOOGLE_SETTINGS_DEFAULT_AUTH_ENDPOINT     = "https://accounts.google.com/o/oauth2/v2/auth"
   213  	GOOGLE_SETTINGS_DEFAULT_TOKEN_ENDPOINT    = "https://www.googleapis.com/oauth2/v4/token"
   214  	GOOGLE_SETTINGS_DEFAULT_USER_API_ENDPOINT = "https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses,nicknames,metadata"
   215  
   216  	OFFICE365_SETTINGS_DEFAULT_SCOPE             = "User.Read"
   217  	OFFICE365_SETTINGS_DEFAULT_AUTH_ENDPOINT     = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize"
   218  	OFFICE365_SETTINGS_DEFAULT_TOKEN_ENDPOINT    = "https://login.microsoftonline.com/common/oauth2/v2.0/token"
   219  	OFFICE365_SETTINGS_DEFAULT_USER_API_ENDPOINT = "https://graph.microsoft.com/v1.0/me"
   220  
   221  	LOCAL_MODE_SOCKET_PATH = "/var/tmp/mattermost_local.socket"
   222  )
   223  
   224  var ServerTLSSupportedCiphers = map[string]uint16{
   225  	"TLS_RSA_WITH_RC4_128_SHA":                tls.TLS_RSA_WITH_RC4_128_SHA,
   226  	"TLS_RSA_WITH_3DES_EDE_CBC_SHA":           tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
   227  	"TLS_RSA_WITH_AES_128_CBC_SHA":            tls.TLS_RSA_WITH_AES_128_CBC_SHA,
   228  	"TLS_RSA_WITH_AES_256_CBC_SHA":            tls.TLS_RSA_WITH_AES_256_CBC_SHA,
   229  	"TLS_RSA_WITH_AES_128_CBC_SHA256":         tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
   230  	"TLS_RSA_WITH_AES_128_GCM_SHA256":         tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
   231  	"TLS_RSA_WITH_AES_256_GCM_SHA384":         tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
   232  	"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA":        tls.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
   233  	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
   234  	"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA":    tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
   235  	"TLS_ECDHE_RSA_WITH_RC4_128_SHA":          tls.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
   236  	"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA":     tls.TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
   237  	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
   238  	"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA":      tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
   239  	"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
   240  	"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
   241  	"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256":   tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
   242  	"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
   243  	"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384":   tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
   244  	"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
   245  	"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305":    tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
   246  	"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305":  tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
   247  }
   248  
   249  type ServiceSettings struct {
   250  	SiteURL                                           *string  `restricted:"true"`
   251  	WebsocketURL                                      *string  `restricted:"true"`
   252  	LicenseFileLocation                               *string  `restricted:"true"`
   253  	ListenAddress                                     *string  `restricted:"true"`
   254  	ConnectionSecurity                                *string  `restricted:"true"`
   255  	TLSCertFile                                       *string  `restricted:"true"`
   256  	TLSKeyFile                                        *string  `restricted:"true"`
   257  	TLSMinVer                                         *string  `restricted:"true"`
   258  	TLSStrictTransport                                *bool    `restricted:"true"`
   259  	TLSStrictTransportMaxAge                          *int64   `restricted:"true"`
   260  	TLSOverwriteCiphers                               []string `restricted:"true"`
   261  	UseLetsEncrypt                                    *bool    `restricted:"true"`
   262  	LetsEncryptCertificateCacheFile                   *string  `restricted:"true"`
   263  	Forward80To443                                    *bool    `restricted:"true"`
   264  	TrustedProxyIPHeader                              []string `restricted:"true"`
   265  	ReadTimeout                                       *int     `restricted:"true"`
   266  	WriteTimeout                                      *int     `restricted:"true"`
   267  	IdleTimeout                                       *int     `restricted:"true"`
   268  	MaximumLoginAttempts                              *int     `restricted:"true"`
   269  	GoroutineHealthThreshold                          *int     `restricted:"true"`
   270  	GoogleDeveloperKey                                *string  `restricted:"true"`
   271  	EnableOAuthServiceProvider                        *bool
   272  	EnableIncomingWebhooks                            *bool
   273  	EnableOutgoingWebhooks                            *bool
   274  	EnableCommands                                    *bool
   275  	DEPRECATED_DO_NOT_USE_EnableOnlyAdminIntegrations *bool `json:"EnableOnlyAdminIntegrations" mapstructure:"EnableOnlyAdminIntegrations"` // This field is deprecated and must not be used.
   276  	EnablePostUsernameOverride                        *bool
   277  	EnablePostIconOverride                            *bool
   278  	EnableLinkPreviews                                *bool
   279  	EnableTesting                                     *bool   `restricted:"true"`
   280  	EnableDeveloper                                   *bool   `restricted:"true"`
   281  	EnableOpenTracing                                 *bool   `restricted:"true"`
   282  	EnableSecurityFixAlert                            *bool   `restricted:"true"`
   283  	EnableInsecureOutgoingConnections                 *bool   `restricted:"true"`
   284  	AllowedUntrustedInternalConnections               *string `restricted:"true"`
   285  	EnableMultifactorAuthentication                   *bool
   286  	EnforceMultifactorAuthentication                  *bool
   287  	EnableUserAccessTokens                            *bool
   288  	AllowCorsFrom                                     *string `restricted:"true"`
   289  	CorsExposedHeaders                                *string `restricted:"true"`
   290  	CorsAllowCredentials                              *bool   `restricted:"true"`
   291  	CorsDebug                                         *bool   `restricted:"true"`
   292  	AllowCookiesForSubdomains                         *bool   `restricted:"true"`
   293  	ExtendSessionLengthWithActivity                   *bool   `restricted:"true"`
   294  	SessionLengthWebInDays                            *int    `restricted:"true"`
   295  	SessionLengthMobileInDays                         *int    `restricted:"true"`
   296  	SessionLengthSSOInDays                            *int    `restricted:"true"`
   297  	SessionCacheInMinutes                             *int    `restricted:"true"`
   298  	SessionIdleTimeoutInMinutes                       *int    `restricted:"true"`
   299  	WebsocketSecurePort                               *int    `restricted:"true"`
   300  	WebsocketPort                                     *int    `restricted:"true"`
   301  	WebserverMode                                     *string `restricted:"true"`
   302  	EnableCustomEmoji                                 *bool
   303  	EnableEmojiPicker                                 *bool
   304  	EnableGifPicker                                   *bool
   305  	GfycatApiKey                                      *string
   306  	GfycatApiSecret                                   *string
   307  	DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation *string `json:"RestrictCustomEmojiCreation" mapstructure:"RestrictCustomEmojiCreation"` // This field is deprecated and must not be used.
   308  	DEPRECATED_DO_NOT_USE_RestrictPostDelete          *string `json:"RestrictPostDelete" mapstructure:"RestrictPostDelete"`                   // This field is deprecated and must not be used.
   309  	DEPRECATED_DO_NOT_USE_AllowEditPost               *string `json:"AllowEditPost" mapstructure:"AllowEditPost"`                             // This field is deprecated and must not be used.
   310  	PostEditTimeLimit                                 *int
   311  	TimeBetweenUserTypingUpdatesMilliseconds          *int64 `restricted:"true"`
   312  	EnablePostSearch                                  *bool  `restricted:"true"`
   313  	MinimumHashtagLength                              *int   `restricted:"true"`
   314  	EnableUserTypingMessages                          *bool  `restricted:"true"`
   315  	EnableChannelViewedMessages                       *bool  `restricted:"true"`
   316  	EnableUserStatuses                                *bool  `restricted:"true"`
   317  	ExperimentalEnableAuthenticationTransfer          *bool  `restricted:"true"`
   318  	ClusterLogTimeoutMilliseconds                     *int   `restricted:"true"`
   319  	CloseUnusedDirectMessages                         *bool
   320  	EnablePreviewFeatures                             *bool
   321  	EnableTutorial                                    *bool
   322  	ExperimentalEnableDefaultChannelLeaveJoinMessages *bool
   323  	ExperimentalGroupUnreadChannels                   *string
   324  	ExperimentalChannelOrganization                   *bool
   325  	ExperimentalChannelSidebarOrganization            *string
   326  	ExperimentalDataPrefetch                          *bool
   327  	DEPRECATED_DO_NOT_USE_ImageProxyType              *string `json:"ImageProxyType" mapstructure:"ImageProxyType"`       // This field is deprecated and must not be used.
   328  	DEPRECATED_DO_NOT_USE_ImageProxyURL               *string `json:"ImageProxyURL" mapstructure:"ImageProxyURL"`         // This field is deprecated and must not be used.
   329  	DEPRECATED_DO_NOT_USE_ImageProxyOptions           *string `json:"ImageProxyOptions" mapstructure:"ImageProxyOptions"` // This field is deprecated and must not be used.
   330  	EnableAPITeamDeletion                             *bool
   331  	EnableAPIUserDeletion                             *bool
   332  	ExperimentalEnableHardenedMode                    *bool
   333  	DisableLegacyMFA                                  *bool `restricted:"true"`
   334  	ExperimentalStrictCSRFEnforcement                 *bool `restricted:"true"`
   335  	EnableEmailInvitations                            *bool
   336  	DisableBotsWhenOwnerIsDeactivated                 *bool `restricted:"true"`
   337  	EnableBotAccountCreation                          *bool
   338  	EnableSVGs                                        *bool
   339  	EnableLatex                                       *bool
   340  	EnableLocalMode                                   *bool
   341  	LocalModeSocketLocation                           *string
   342  }
   343  
   344  func (s *ServiceSettings) SetDefaults(isUpdate bool) {
   345  	if s.EnableEmailInvitations == nil {
   346  		// If the site URL is also not present then assume this is a clean install
   347  		if s.SiteURL == nil {
   348  			s.EnableEmailInvitations = NewBool(false)
   349  		} else {
   350  			s.EnableEmailInvitations = NewBool(true)
   351  		}
   352  	}
   353  
   354  	if s.SiteURL == nil {
   355  		if s.EnableDeveloper != nil && *s.EnableDeveloper {
   356  			s.SiteURL = NewString(SERVICE_SETTINGS_DEFAULT_SITE_URL)
   357  		} else {
   358  			s.SiteURL = NewString("")
   359  		}
   360  	}
   361  
   362  	if s.WebsocketURL == nil {
   363  		s.WebsocketURL = NewString("")
   364  	}
   365  
   366  	if s.LicenseFileLocation == nil {
   367  		s.LicenseFileLocation = NewString("")
   368  	}
   369  
   370  	if s.ListenAddress == nil {
   371  		s.ListenAddress = NewString(SERVICE_SETTINGS_DEFAULT_LISTEN_AND_ADDRESS)
   372  	}
   373  
   374  	if s.EnableLinkPreviews == nil {
   375  		s.EnableLinkPreviews = NewBool(true)
   376  	}
   377  
   378  	if s.EnableTesting == nil {
   379  		s.EnableTesting = NewBool(false)
   380  	}
   381  
   382  	if s.EnableDeveloper == nil {
   383  		s.EnableDeveloper = NewBool(false)
   384  	}
   385  
   386  	if s.EnableOpenTracing == nil {
   387  		s.EnableOpenTracing = NewBool(false)
   388  	}
   389  
   390  	if s.EnableSecurityFixAlert == nil {
   391  		s.EnableSecurityFixAlert = NewBool(true)
   392  	}
   393  
   394  	if s.EnableInsecureOutgoingConnections == nil {
   395  		s.EnableInsecureOutgoingConnections = NewBool(false)
   396  	}
   397  
   398  	if s.AllowedUntrustedInternalConnections == nil {
   399  		s.AllowedUntrustedInternalConnections = NewString("")
   400  	}
   401  
   402  	if s.EnableMultifactorAuthentication == nil {
   403  		s.EnableMultifactorAuthentication = NewBool(false)
   404  	}
   405  
   406  	if s.EnforceMultifactorAuthentication == nil {
   407  		s.EnforceMultifactorAuthentication = NewBool(false)
   408  	}
   409  
   410  	if s.EnableUserAccessTokens == nil {
   411  		s.EnableUserAccessTokens = NewBool(false)
   412  	}
   413  
   414  	if s.GoroutineHealthThreshold == nil {
   415  		s.GoroutineHealthThreshold = NewInt(-1)
   416  	}
   417  
   418  	if s.GoogleDeveloperKey == nil {
   419  		s.GoogleDeveloperKey = NewString("")
   420  	}
   421  
   422  	if s.EnableOAuthServiceProvider == nil {
   423  		s.EnableOAuthServiceProvider = NewBool(false)
   424  	}
   425  
   426  	if s.EnableIncomingWebhooks == nil {
   427  		s.EnableIncomingWebhooks = NewBool(true)
   428  	}
   429  
   430  	if s.EnableOutgoingWebhooks == nil {
   431  		s.EnableOutgoingWebhooks = NewBool(true)
   432  	}
   433  
   434  	if s.ConnectionSecurity == nil {
   435  		s.ConnectionSecurity = NewString("")
   436  	}
   437  
   438  	if s.TLSKeyFile == nil {
   439  		s.TLSKeyFile = NewString(SERVICE_SETTINGS_DEFAULT_TLS_KEY_FILE)
   440  	}
   441  
   442  	if s.TLSCertFile == nil {
   443  		s.TLSCertFile = NewString(SERVICE_SETTINGS_DEFAULT_TLS_CERT_FILE)
   444  	}
   445  
   446  	if s.TLSMinVer == nil {
   447  		s.TLSMinVer = NewString("1.2")
   448  	}
   449  
   450  	if s.TLSStrictTransport == nil {
   451  		s.TLSStrictTransport = NewBool(false)
   452  	}
   453  
   454  	if s.TLSStrictTransportMaxAge == nil {
   455  		s.TLSStrictTransportMaxAge = NewInt64(63072000)
   456  	}
   457  
   458  	if s.TLSOverwriteCiphers == nil {
   459  		s.TLSOverwriteCiphers = []string{}
   460  	}
   461  
   462  	if s.UseLetsEncrypt == nil {
   463  		s.UseLetsEncrypt = NewBool(false)
   464  	}
   465  
   466  	if s.LetsEncryptCertificateCacheFile == nil {
   467  		s.LetsEncryptCertificateCacheFile = NewString("./config/letsencrypt.cache")
   468  	}
   469  
   470  	if s.ReadTimeout == nil {
   471  		s.ReadTimeout = NewInt(SERVICE_SETTINGS_DEFAULT_READ_TIMEOUT)
   472  	}
   473  
   474  	if s.WriteTimeout == nil {
   475  		s.WriteTimeout = NewInt(SERVICE_SETTINGS_DEFAULT_WRITE_TIMEOUT)
   476  	}
   477  
   478  	if s.IdleTimeout == nil {
   479  		s.IdleTimeout = NewInt(SERVICE_SETTINGS_DEFAULT_IDLE_TIMEOUT)
   480  	}
   481  
   482  	if s.MaximumLoginAttempts == nil {
   483  		s.MaximumLoginAttempts = NewInt(SERVICE_SETTINGS_DEFAULT_MAX_LOGIN_ATTEMPTS)
   484  	}
   485  
   486  	if s.Forward80To443 == nil {
   487  		s.Forward80To443 = NewBool(false)
   488  	}
   489  
   490  	if isUpdate {
   491  		// When updating an existing configuration, ensure that defaults are set.
   492  		if s.TrustedProxyIPHeader == nil {
   493  			s.TrustedProxyIPHeader = []string{HEADER_FORWARDED, HEADER_REAL_IP}
   494  		}
   495  	} else {
   496  		// When generating a blank configuration, leave the list empty.
   497  		s.TrustedProxyIPHeader = []string{}
   498  	}
   499  
   500  	if s.TimeBetweenUserTypingUpdatesMilliseconds == nil {
   501  		s.TimeBetweenUserTypingUpdatesMilliseconds = NewInt64(5000)
   502  	}
   503  
   504  	if s.EnablePostSearch == nil {
   505  		s.EnablePostSearch = NewBool(true)
   506  	}
   507  
   508  	if s.MinimumHashtagLength == nil {
   509  		s.MinimumHashtagLength = NewInt(3)
   510  	}
   511  
   512  	if s.EnableUserTypingMessages == nil {
   513  		s.EnableUserTypingMessages = NewBool(true)
   514  	}
   515  
   516  	if s.EnableChannelViewedMessages == nil {
   517  		s.EnableChannelViewedMessages = NewBool(true)
   518  	}
   519  
   520  	if s.EnableUserStatuses == nil {
   521  		s.EnableUserStatuses = NewBool(true)
   522  	}
   523  
   524  	if s.ClusterLogTimeoutMilliseconds == nil {
   525  		s.ClusterLogTimeoutMilliseconds = NewInt(2000)
   526  	}
   527  
   528  	if s.CloseUnusedDirectMessages == nil {
   529  		s.CloseUnusedDirectMessages = NewBool(false)
   530  	}
   531  
   532  	if s.EnableTutorial == nil {
   533  		s.EnableTutorial = NewBool(true)
   534  	}
   535  
   536  	// Must be manually enabled for existing installations.
   537  	if s.ExtendSessionLengthWithActivity == nil {
   538  		s.ExtendSessionLengthWithActivity = NewBool(!isUpdate)
   539  	}
   540  
   541  	if s.SessionLengthWebInDays == nil {
   542  		if isUpdate {
   543  			s.SessionLengthWebInDays = NewInt(180)
   544  		} else {
   545  			s.SessionLengthWebInDays = NewInt(30)
   546  		}
   547  	}
   548  
   549  	if s.SessionLengthMobileInDays == nil {
   550  		if isUpdate {
   551  			s.SessionLengthMobileInDays = NewInt(180)
   552  		} else {
   553  			s.SessionLengthMobileInDays = NewInt(30)
   554  		}
   555  	}
   556  
   557  	if s.SessionLengthSSOInDays == nil {
   558  		s.SessionLengthSSOInDays = NewInt(30)
   559  	}
   560  
   561  	if s.SessionCacheInMinutes == nil {
   562  		s.SessionCacheInMinutes = NewInt(10)
   563  	}
   564  
   565  	if s.SessionIdleTimeoutInMinutes == nil {
   566  		s.SessionIdleTimeoutInMinutes = NewInt(43200)
   567  	}
   568  
   569  	if s.EnableCommands == nil {
   570  		s.EnableCommands = NewBool(true)
   571  	}
   572  
   573  	if s.DEPRECATED_DO_NOT_USE_EnableOnlyAdminIntegrations == nil {
   574  		s.DEPRECATED_DO_NOT_USE_EnableOnlyAdminIntegrations = NewBool(true)
   575  	}
   576  
   577  	if s.EnablePostUsernameOverride == nil {
   578  		s.EnablePostUsernameOverride = NewBool(false)
   579  	}
   580  
   581  	if s.EnablePostIconOverride == nil {
   582  		s.EnablePostIconOverride = NewBool(false)
   583  	}
   584  
   585  	if s.WebsocketPort == nil {
   586  		s.WebsocketPort = NewInt(80)
   587  	}
   588  
   589  	if s.WebsocketSecurePort == nil {
   590  		s.WebsocketSecurePort = NewInt(443)
   591  	}
   592  
   593  	if s.AllowCorsFrom == nil {
   594  		s.AllowCorsFrom = NewString(SERVICE_SETTINGS_DEFAULT_ALLOW_CORS_FROM)
   595  	}
   596  
   597  	if s.CorsExposedHeaders == nil {
   598  		s.CorsExposedHeaders = NewString("")
   599  	}
   600  
   601  	if s.CorsAllowCredentials == nil {
   602  		s.CorsAllowCredentials = NewBool(false)
   603  	}
   604  
   605  	if s.CorsDebug == nil {
   606  		s.CorsDebug = NewBool(false)
   607  	}
   608  
   609  	if s.AllowCookiesForSubdomains == nil {
   610  		s.AllowCookiesForSubdomains = NewBool(false)
   611  	}
   612  
   613  	if s.WebserverMode == nil {
   614  		s.WebserverMode = NewString("gzip")
   615  	} else if *s.WebserverMode == "regular" {
   616  		*s.WebserverMode = "gzip"
   617  	}
   618  
   619  	if s.EnableCustomEmoji == nil {
   620  		s.EnableCustomEmoji = NewBool(false)
   621  	}
   622  
   623  	if s.EnableEmojiPicker == nil {
   624  		s.EnableEmojiPicker = NewBool(true)
   625  	}
   626  
   627  	if s.EnableGifPicker == nil {
   628  		s.EnableGifPicker = NewBool(false)
   629  	}
   630  
   631  	if s.GfycatApiKey == nil || *s.GfycatApiKey == "" {
   632  		s.GfycatApiKey = NewString(SERVICE_SETTINGS_DEFAULT_GFYCAT_API_KEY)
   633  	}
   634  
   635  	if s.GfycatApiSecret == nil || *s.GfycatApiSecret == "" {
   636  		s.GfycatApiSecret = NewString(SERVICE_SETTINGS_DEFAULT_GFYCAT_API_SECRET)
   637  	}
   638  
   639  	if s.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation == nil {
   640  		s.DEPRECATED_DO_NOT_USE_RestrictCustomEmojiCreation = NewString(RESTRICT_EMOJI_CREATION_ALL)
   641  	}
   642  
   643  	if s.DEPRECATED_DO_NOT_USE_RestrictPostDelete == nil {
   644  		s.DEPRECATED_DO_NOT_USE_RestrictPostDelete = NewString(PERMISSIONS_DELETE_POST_ALL)
   645  	}
   646  
   647  	if s.DEPRECATED_DO_NOT_USE_AllowEditPost == nil {
   648  		s.DEPRECATED_DO_NOT_USE_AllowEditPost = NewString(ALLOW_EDIT_POST_ALWAYS)
   649  	}
   650  
   651  	if s.ExperimentalEnableAuthenticationTransfer == nil {
   652  		s.ExperimentalEnableAuthenticationTransfer = NewBool(true)
   653  	}
   654  
   655  	if s.PostEditTimeLimit == nil {
   656  		s.PostEditTimeLimit = NewInt(-1)
   657  	}
   658  
   659  	if s.EnablePreviewFeatures == nil {
   660  		s.EnablePreviewFeatures = NewBool(true)
   661  	}
   662  
   663  	if s.ExperimentalEnableDefaultChannelLeaveJoinMessages == nil {
   664  		s.ExperimentalEnableDefaultChannelLeaveJoinMessages = NewBool(true)
   665  	}
   666  
   667  	if s.ExperimentalGroupUnreadChannels == nil {
   668  		s.ExperimentalGroupUnreadChannels = NewString(GROUP_UNREAD_CHANNELS_DISABLED)
   669  	} else if *s.ExperimentalGroupUnreadChannels == "0" {
   670  		s.ExperimentalGroupUnreadChannels = NewString(GROUP_UNREAD_CHANNELS_DISABLED)
   671  	} else if *s.ExperimentalGroupUnreadChannels == "1" {
   672  		s.ExperimentalGroupUnreadChannels = NewString(GROUP_UNREAD_CHANNELS_DEFAULT_ON)
   673  	}
   674  
   675  	if s.ExperimentalChannelOrganization == nil {
   676  		experimentalUnreadEnabled := *s.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DISABLED
   677  		s.ExperimentalChannelOrganization = NewBool(experimentalUnreadEnabled)
   678  	}
   679  
   680  	if s.ExperimentalChannelSidebarOrganization == nil {
   681  		s.ExperimentalChannelSidebarOrganization = NewString("disabled")
   682  	}
   683  
   684  	if s.ExperimentalDataPrefetch == nil {
   685  		s.ExperimentalDataPrefetch = NewBool(true)
   686  	}
   687  
   688  	if s.DEPRECATED_DO_NOT_USE_ImageProxyType == nil {
   689  		s.DEPRECATED_DO_NOT_USE_ImageProxyType = NewString("")
   690  	}
   691  
   692  	if s.DEPRECATED_DO_NOT_USE_ImageProxyURL == nil {
   693  		s.DEPRECATED_DO_NOT_USE_ImageProxyURL = NewString("")
   694  	}
   695  
   696  	if s.DEPRECATED_DO_NOT_USE_ImageProxyOptions == nil {
   697  		s.DEPRECATED_DO_NOT_USE_ImageProxyOptions = NewString("")
   698  	}
   699  
   700  	if s.EnableAPITeamDeletion == nil {
   701  		s.EnableAPITeamDeletion = NewBool(false)
   702  	}
   703  
   704  	if s.EnableAPIUserDeletion == nil {
   705  		s.EnableAPIUserDeletion = NewBool(false)
   706  	}
   707  
   708  	if s.ExperimentalEnableHardenedMode == nil {
   709  		s.ExperimentalEnableHardenedMode = NewBool(false)
   710  	}
   711  
   712  	if s.DisableLegacyMFA == nil {
   713  		s.DisableLegacyMFA = NewBool(!isUpdate)
   714  	}
   715  
   716  	if s.ExperimentalStrictCSRFEnforcement == nil {
   717  		s.ExperimentalStrictCSRFEnforcement = NewBool(false)
   718  	}
   719  
   720  	if s.DisableBotsWhenOwnerIsDeactivated == nil {
   721  		s.DisableBotsWhenOwnerIsDeactivated = NewBool(true)
   722  	}
   723  
   724  	if s.EnableBotAccountCreation == nil {
   725  		s.EnableBotAccountCreation = NewBool(false)
   726  	}
   727  
   728  	if s.EnableSVGs == nil {
   729  		if isUpdate {
   730  			s.EnableSVGs = NewBool(true)
   731  		} else {
   732  			s.EnableSVGs = NewBool(false)
   733  		}
   734  	}
   735  
   736  	if s.EnableLatex == nil {
   737  		if isUpdate {
   738  			s.EnableLatex = NewBool(true)
   739  		} else {
   740  			s.EnableLatex = NewBool(false)
   741  		}
   742  	}
   743  
   744  	if s.EnableLocalMode == nil {
   745  		s.EnableLocalMode = NewBool(false)
   746  	}
   747  
   748  	if s.LocalModeSocketLocation == nil {
   749  		s.LocalModeSocketLocation = NewString(LOCAL_MODE_SOCKET_PATH)
   750  	}
   751  }
   752  
   753  type ClusterSettings struct {
   754  	Enable                             *bool   `restricted:"true"`
   755  	ClusterName                        *string `restricted:"true"`
   756  	OverrideHostname                   *string `restricted:"true"`
   757  	NetworkInterface                   *string `restricted:"true"`
   758  	BindAddress                        *string `restricted:"true"`
   759  	AdvertiseAddress                   *string `restricted:"true"`
   760  	UseIpAddress                       *bool   `restricted:"true"`
   761  	UseExperimentalGossip              *bool   `restricted:"true"`
   762  	EnableExperimentalGossipEncryption *bool   `restricted:"true"`
   763  	ReadOnlyConfig                     *bool   `restricted:"true"`
   764  	GossipPort                         *int    `restricted:"true"`
   765  	StreamingPort                      *int    `restricted:"true"`
   766  	MaxIdleConns                       *int    `restricted:"true"`
   767  	MaxIdleConnsPerHost                *int    `restricted:"true"`
   768  	IdleConnTimeoutMilliseconds        *int    `restricted:"true"`
   769  }
   770  
   771  func (s *ClusterSettings) SetDefaults() {
   772  	if s.Enable == nil {
   773  		s.Enable = NewBool(false)
   774  	}
   775  
   776  	if s.ClusterName == nil {
   777  		s.ClusterName = NewString("")
   778  	}
   779  
   780  	if s.OverrideHostname == nil {
   781  		s.OverrideHostname = NewString("")
   782  	}
   783  
   784  	if s.NetworkInterface == nil {
   785  		s.NetworkInterface = NewString("")
   786  	}
   787  
   788  	if s.BindAddress == nil {
   789  		s.BindAddress = NewString("")
   790  	}
   791  
   792  	if s.AdvertiseAddress == nil {
   793  		s.AdvertiseAddress = NewString("")
   794  	}
   795  
   796  	if s.UseIpAddress == nil {
   797  		s.UseIpAddress = NewBool(true)
   798  	}
   799  
   800  	if s.UseExperimentalGossip == nil {
   801  		s.UseExperimentalGossip = NewBool(false)
   802  	}
   803  
   804  	if s.EnableExperimentalGossipEncryption == nil {
   805  		s.EnableExperimentalGossipEncryption = NewBool(false)
   806  	}
   807  
   808  	if s.ReadOnlyConfig == nil {
   809  		s.ReadOnlyConfig = NewBool(true)
   810  	}
   811  
   812  	if s.GossipPort == nil {
   813  		s.GossipPort = NewInt(8074)
   814  	}
   815  
   816  	if s.StreamingPort == nil {
   817  		s.StreamingPort = NewInt(8075)
   818  	}
   819  
   820  	if s.MaxIdleConns == nil {
   821  		s.MaxIdleConns = NewInt(100)
   822  	}
   823  
   824  	if s.MaxIdleConnsPerHost == nil {
   825  		s.MaxIdleConnsPerHost = NewInt(128)
   826  	}
   827  
   828  	if s.IdleConnTimeoutMilliseconds == nil {
   829  		s.IdleConnTimeoutMilliseconds = NewInt(90000)
   830  	}
   831  }
   832  
   833  type MetricsSettings struct {
   834  	Enable           *bool   `restricted:"true"`
   835  	BlockProfileRate *int    `restricted:"true"`
   836  	ListenAddress    *string `restricted:"true"`
   837  }
   838  
   839  func (s *MetricsSettings) SetDefaults() {
   840  	if s.ListenAddress == nil {
   841  		s.ListenAddress = NewString(":8067")
   842  	}
   843  
   844  	if s.Enable == nil {
   845  		s.Enable = NewBool(false)
   846  	}
   847  
   848  	if s.BlockProfileRate == nil {
   849  		s.BlockProfileRate = NewInt(0)
   850  	}
   851  }
   852  
   853  type ExperimentalSettings struct {
   854  	ClientSideCertEnable            *bool
   855  	ClientSideCertCheck             *string
   856  	EnableClickToReply              *bool  `restricted:"true"`
   857  	LinkMetadataTimeoutMilliseconds *int64 `restricted:"true"`
   858  	RestrictSystemAdmin             *bool  `restricted:"true"`
   859  	UseNewSAMLLibrary               *bool
   860  }
   861  
   862  func (s *ExperimentalSettings) SetDefaults() {
   863  	if s.ClientSideCertEnable == nil {
   864  		s.ClientSideCertEnable = NewBool(false)
   865  	}
   866  
   867  	if s.ClientSideCertCheck == nil {
   868  		s.ClientSideCertCheck = NewString(CLIENT_SIDE_CERT_CHECK_SECONDARY_AUTH)
   869  	}
   870  
   871  	if s.EnableClickToReply == nil {
   872  		s.EnableClickToReply = NewBool(false)
   873  	}
   874  
   875  	if s.LinkMetadataTimeoutMilliseconds == nil {
   876  		s.LinkMetadataTimeoutMilliseconds = NewInt64(EXPERIMENTAL_SETTINGS_DEFAULT_LINK_METADATA_TIMEOUT_MILLISECONDS)
   877  	}
   878  
   879  	if s.RestrictSystemAdmin == nil {
   880  		s.RestrictSystemAdmin = NewBool(false)
   881  	}
   882  	if s.UseNewSAMLLibrary == nil {
   883  		s.UseNewSAMLLibrary = NewBool(false)
   884  	}
   885  }
   886  
   887  type AnalyticsSettings struct {
   888  	MaxUsersForStatistics *int `restricted:"true"`
   889  }
   890  
   891  func (s *AnalyticsSettings) SetDefaults() {
   892  	if s.MaxUsersForStatistics == nil {
   893  		s.MaxUsersForStatistics = NewInt(ANALYTICS_SETTINGS_DEFAULT_MAX_USERS_FOR_STATISTICS)
   894  	}
   895  }
   896  
   897  type SSOSettings struct {
   898  	Enable          *bool
   899  	Secret          *string
   900  	Id              *string
   901  	Scope           *string
   902  	AuthEndpoint    *string
   903  	TokenEndpoint   *string
   904  	UserApiEndpoint *string
   905  }
   906  
   907  func (s *SSOSettings) setDefaults(scope, authEndpoint, tokenEndpoint, userApiEndpoint string) {
   908  	if s.Enable == nil {
   909  		s.Enable = NewBool(false)
   910  	}
   911  
   912  	if s.Secret == nil {
   913  		s.Secret = NewString("")
   914  	}
   915  
   916  	if s.Id == nil {
   917  		s.Id = NewString("")
   918  	}
   919  
   920  	if s.Scope == nil {
   921  		s.Scope = NewString(scope)
   922  	}
   923  
   924  	if s.AuthEndpoint == nil {
   925  		s.AuthEndpoint = NewString(authEndpoint)
   926  	}
   927  
   928  	if s.TokenEndpoint == nil {
   929  		s.TokenEndpoint = NewString(tokenEndpoint)
   930  	}
   931  
   932  	if s.UserApiEndpoint == nil {
   933  		s.UserApiEndpoint = NewString(userApiEndpoint)
   934  	}
   935  }
   936  
   937  type Office365Settings struct {
   938  	Enable          *bool
   939  	Secret          *string
   940  	Id              *string
   941  	Scope           *string
   942  	AuthEndpoint    *string
   943  	TokenEndpoint   *string
   944  	UserApiEndpoint *string
   945  	DirectoryId     *string
   946  }
   947  
   948  func (s *Office365Settings) setDefaults() {
   949  	if s.Enable == nil {
   950  		s.Enable = NewBool(false)
   951  	}
   952  
   953  	if s.Id == nil {
   954  		s.Id = NewString("")
   955  	}
   956  
   957  	if s.Secret == nil {
   958  		s.Secret = NewString("")
   959  	}
   960  
   961  	if s.Scope == nil {
   962  		s.Scope = NewString(OFFICE365_SETTINGS_DEFAULT_SCOPE)
   963  	}
   964  
   965  	if s.AuthEndpoint == nil {
   966  		s.AuthEndpoint = NewString(OFFICE365_SETTINGS_DEFAULT_AUTH_ENDPOINT)
   967  	}
   968  
   969  	if s.TokenEndpoint == nil {
   970  		s.TokenEndpoint = NewString(OFFICE365_SETTINGS_DEFAULT_TOKEN_ENDPOINT)
   971  	}
   972  
   973  	if s.UserApiEndpoint == nil {
   974  		s.UserApiEndpoint = NewString(OFFICE365_SETTINGS_DEFAULT_USER_API_ENDPOINT)
   975  	}
   976  
   977  	if s.DirectoryId == nil {
   978  		s.DirectoryId = NewString("")
   979  	}
   980  }
   981  
   982  func (s *Office365Settings) SSOSettings() *SSOSettings {
   983  	ssoSettings := SSOSettings{}
   984  	ssoSettings.Enable = s.Enable
   985  	ssoSettings.Secret = s.Secret
   986  	ssoSettings.Id = s.Id
   987  	ssoSettings.Scope = s.Scope
   988  	ssoSettings.AuthEndpoint = s.AuthEndpoint
   989  	ssoSettings.TokenEndpoint = s.TokenEndpoint
   990  	ssoSettings.UserApiEndpoint = s.UserApiEndpoint
   991  	return &ssoSettings
   992  }
   993  
   994  type SqlSettings struct {
   995  	DriverName                  *string  `restricted:"true"`
   996  	DataSource                  *string  `restricted:"true"`
   997  	DataSourceReplicas          []string `restricted:"true"`
   998  	DataSourceSearchReplicas    []string `restricted:"true"`
   999  	MaxIdleConns                *int     `restricted:"true"`
  1000  	ConnMaxLifetimeMilliseconds *int     `restricted:"true"`
  1001  	MaxOpenConns                *int     `restricted:"true"`
  1002  	Trace                       *bool    `restricted:"true"`
  1003  	AtRestEncryptKey            *string  `restricted:"true"`
  1004  	QueryTimeout                *int     `restricted:"true"`
  1005  	DisableDatabaseSearch       *bool    `restricted:"true"`
  1006  }
  1007  
  1008  func (s *SqlSettings) SetDefaults(isUpdate bool) {
  1009  	if s.DriverName == nil {
  1010  		s.DriverName = NewString(DATABASE_DRIVER_MYSQL)
  1011  	}
  1012  
  1013  	if s.DataSource == nil {
  1014  		s.DataSource = NewString(SQL_SETTINGS_DEFAULT_DATA_SOURCE)
  1015  	}
  1016  
  1017  	if s.DataSourceReplicas == nil {
  1018  		s.DataSourceReplicas = []string{}
  1019  	}
  1020  
  1021  	if s.DataSourceSearchReplicas == nil {
  1022  		s.DataSourceSearchReplicas = []string{}
  1023  	}
  1024  
  1025  	if isUpdate {
  1026  		// When updating an existing configuration, ensure an encryption key has been specified.
  1027  		if s.AtRestEncryptKey == nil || len(*s.AtRestEncryptKey) == 0 {
  1028  			s.AtRestEncryptKey = NewString(NewRandomString(32))
  1029  		}
  1030  	} else {
  1031  		// When generating a blank configuration, leave this key empty to be generated on server start.
  1032  		s.AtRestEncryptKey = NewString("")
  1033  	}
  1034  
  1035  	if s.MaxIdleConns == nil {
  1036  		s.MaxIdleConns = NewInt(20)
  1037  	}
  1038  
  1039  	if s.MaxOpenConns == nil {
  1040  		s.MaxOpenConns = NewInt(300)
  1041  	}
  1042  
  1043  	if s.ConnMaxLifetimeMilliseconds == nil {
  1044  		s.ConnMaxLifetimeMilliseconds = NewInt(3600000)
  1045  	}
  1046  
  1047  	if s.Trace == nil {
  1048  		s.Trace = NewBool(false)
  1049  	}
  1050  
  1051  	if s.QueryTimeout == nil {
  1052  		s.QueryTimeout = NewInt(30)
  1053  	}
  1054  
  1055  	if s.DisableDatabaseSearch == nil {
  1056  		s.DisableDatabaseSearch = NewBool(false)
  1057  	}
  1058  }
  1059  
  1060  type LogSettings struct {
  1061  	EnableConsole          *bool   `restricted:"true"`
  1062  	ConsoleLevel           *string `restricted:"true"`
  1063  	ConsoleJson            *bool   `restricted:"true"`
  1064  	EnableFile             *bool   `restricted:"true"`
  1065  	FileLevel              *string `restricted:"true"`
  1066  	FileJson               *bool   `restricted:"true"`
  1067  	FileLocation           *string `restricted:"true"`
  1068  	EnableWebhookDebugging *bool   `restricted:"true"`
  1069  	EnableDiagnostics      *bool   `restricted:"true"`
  1070  	EnableSentry           *bool   `restricted:"true"`
  1071  	AdvancedLoggingConfig  *string `restricted:"true"`
  1072  }
  1073  
  1074  func (s *LogSettings) SetDefaults() {
  1075  	if s.EnableConsole == nil {
  1076  		s.EnableConsole = NewBool(true)
  1077  	}
  1078  
  1079  	if s.ConsoleLevel == nil {
  1080  		s.ConsoleLevel = NewString("DEBUG")
  1081  	}
  1082  
  1083  	if s.EnableFile == nil {
  1084  		s.EnableFile = NewBool(true)
  1085  	}
  1086  
  1087  	if s.FileLevel == nil {
  1088  		s.FileLevel = NewString("INFO")
  1089  	}
  1090  
  1091  	if s.FileLocation == nil {
  1092  		s.FileLocation = NewString("")
  1093  	}
  1094  
  1095  	if s.EnableWebhookDebugging == nil {
  1096  		s.EnableWebhookDebugging = NewBool(true)
  1097  	}
  1098  
  1099  	if s.EnableDiagnostics == nil {
  1100  		s.EnableDiagnostics = NewBool(true)
  1101  	}
  1102  
  1103  	if s.EnableSentry == nil {
  1104  		s.EnableSentry = NewBool(*s.EnableDiagnostics)
  1105  	}
  1106  
  1107  	if s.ConsoleJson == nil {
  1108  		s.ConsoleJson = NewBool(true)
  1109  	}
  1110  
  1111  	if s.FileJson == nil {
  1112  		s.FileJson = NewBool(true)
  1113  	}
  1114  
  1115  	if s.AdvancedLoggingConfig == nil {
  1116  		s.AdvancedLoggingConfig = NewString("")
  1117  	}
  1118  }
  1119  
  1120  type ExperimentalAuditSettings struct {
  1121  	FileEnabled           *bool   `restricted:"true"`
  1122  	FileName              *string `restricted:"true"`
  1123  	FileMaxSizeMB         *int    `restricted:"true"`
  1124  	FileMaxAgeDays        *int    `restricted:"true"`
  1125  	FileMaxBackups        *int    `restricted:"true"`
  1126  	FileCompress          *bool   `restricted:"true"`
  1127  	FileMaxQueueSize      *int    `restricted:"true"`
  1128  	AdvancedLoggingConfig *string `restricted:"true"`
  1129  }
  1130  
  1131  func (s *ExperimentalAuditSettings) SetDefaults() {
  1132  	if s.FileEnabled == nil {
  1133  		s.FileEnabled = NewBool(false)
  1134  	}
  1135  
  1136  	if s.FileName == nil {
  1137  		s.FileName = NewString("")
  1138  	}
  1139  
  1140  	if s.FileMaxSizeMB == nil {
  1141  		s.FileMaxSizeMB = NewInt(100)
  1142  	}
  1143  
  1144  	if s.FileMaxAgeDays == nil {
  1145  		s.FileMaxAgeDays = NewInt(0) // no limit on age
  1146  	}
  1147  
  1148  	if s.FileMaxBackups == nil { // no limit on number of backups
  1149  		s.FileMaxBackups = NewInt(0)
  1150  	}
  1151  
  1152  	if s.FileCompress == nil {
  1153  		s.FileCompress = NewBool(false)
  1154  	}
  1155  
  1156  	if s.FileMaxQueueSize == nil {
  1157  		s.FileMaxQueueSize = NewInt(1000)
  1158  	}
  1159  
  1160  	if s.AdvancedLoggingConfig == nil {
  1161  		s.AdvancedLoggingConfig = NewString("")
  1162  	}
  1163  }
  1164  
  1165  type NotificationLogSettings struct {
  1166  	EnableConsole         *bool   `restricted:"true"`
  1167  	ConsoleLevel          *string `restricted:"true"`
  1168  	ConsoleJson           *bool   `restricted:"true"`
  1169  	EnableFile            *bool   `restricted:"true"`
  1170  	FileLevel             *string `restricted:"true"`
  1171  	FileJson              *bool   `restricted:"true"`
  1172  	FileLocation          *string `restricted:"true"`
  1173  	AdvancedLoggingConfig *string `restricted:"true"`
  1174  }
  1175  
  1176  func (s *NotificationLogSettings) SetDefaults() {
  1177  	if s.EnableConsole == nil {
  1178  		s.EnableConsole = NewBool(true)
  1179  	}
  1180  
  1181  	if s.ConsoleLevel == nil {
  1182  		s.ConsoleLevel = NewString("DEBUG")
  1183  	}
  1184  
  1185  	if s.EnableFile == nil {
  1186  		s.EnableFile = NewBool(true)
  1187  	}
  1188  
  1189  	if s.FileLevel == nil {
  1190  		s.FileLevel = NewString("INFO")
  1191  	}
  1192  
  1193  	if s.FileLocation == nil {
  1194  		s.FileLocation = NewString("")
  1195  	}
  1196  
  1197  	if s.ConsoleJson == nil {
  1198  		s.ConsoleJson = NewBool(true)
  1199  	}
  1200  
  1201  	if s.FileJson == nil {
  1202  		s.FileJson = NewBool(true)
  1203  	}
  1204  
  1205  	if s.AdvancedLoggingConfig == nil {
  1206  		s.AdvancedLoggingConfig = NewString("")
  1207  	}
  1208  }
  1209  
  1210  type PasswordSettings struct {
  1211  	MinimumLength *int
  1212  	Lowercase     *bool
  1213  	Number        *bool
  1214  	Uppercase     *bool
  1215  	Symbol        *bool
  1216  }
  1217  
  1218  func (s *PasswordSettings) SetDefaults() {
  1219  	if s.MinimumLength == nil {
  1220  		s.MinimumLength = NewInt(10)
  1221  	}
  1222  
  1223  	if s.Lowercase == nil {
  1224  		s.Lowercase = NewBool(true)
  1225  	}
  1226  
  1227  	if s.Number == nil {
  1228  		s.Number = NewBool(true)
  1229  	}
  1230  
  1231  	if s.Uppercase == nil {
  1232  		s.Uppercase = NewBool(true)
  1233  	}
  1234  
  1235  	if s.Symbol == nil {
  1236  		s.Symbol = NewBool(true)
  1237  	}
  1238  }
  1239  
  1240  type FileSettings struct {
  1241  	EnableFileAttachments   *bool
  1242  	EnableMobileUpload      *bool
  1243  	EnableMobileDownload    *bool
  1244  	MaxFileSize             *int64
  1245  	DriverName              *string `restricted:"true"`
  1246  	Directory               *string `restricted:"true"`
  1247  	EnablePublicLink        *bool
  1248  	PublicLinkSalt          *string
  1249  	InitialFont             *string
  1250  	AmazonS3AccessKeyId     *string `restricted:"true"`
  1251  	AmazonS3SecretAccessKey *string `restricted:"true"`
  1252  	AmazonS3Bucket          *string `restricted:"true"`
  1253  	AmazonS3PathPrefix      *string `restricted:"true"`
  1254  	AmazonS3Region          *string `restricted:"true"`
  1255  	AmazonS3Endpoint        *string `restricted:"true"`
  1256  	AmazonS3SSL             *bool   `restricted:"true"`
  1257  	AmazonS3SignV2          *bool   `restricted:"true"`
  1258  	AmazonS3SSE             *bool   `restricted:"true"`
  1259  	AmazonS3Trace           *bool   `restricted:"true"`
  1260  }
  1261  
  1262  func (s *FileSettings) SetDefaults(isUpdate bool) {
  1263  	if s.EnableFileAttachments == nil {
  1264  		s.EnableFileAttachments = NewBool(true)
  1265  	}
  1266  
  1267  	if s.EnableMobileUpload == nil {
  1268  		s.EnableMobileUpload = NewBool(true)
  1269  	}
  1270  
  1271  	if s.EnableMobileDownload == nil {
  1272  		s.EnableMobileDownload = NewBool(true)
  1273  	}
  1274  
  1275  	if s.MaxFileSize == nil {
  1276  		s.MaxFileSize = NewInt64(52428800) // 50 MB
  1277  	}
  1278  
  1279  	if s.DriverName == nil {
  1280  		s.DriverName = NewString(IMAGE_DRIVER_LOCAL)
  1281  	}
  1282  
  1283  	if s.Directory == nil || *s.Directory == "" {
  1284  		s.Directory = NewString(FILE_SETTINGS_DEFAULT_DIRECTORY)
  1285  	}
  1286  
  1287  	if s.EnablePublicLink == nil {
  1288  		s.EnablePublicLink = NewBool(false)
  1289  	}
  1290  
  1291  	if isUpdate {
  1292  		// When updating an existing configuration, ensure link salt has been specified.
  1293  		if s.PublicLinkSalt == nil || len(*s.PublicLinkSalt) == 0 {
  1294  			s.PublicLinkSalt = NewString(NewRandomString(32))
  1295  		}
  1296  	} else {
  1297  		// When generating a blank configuration, leave link salt empty to be generated on server start.
  1298  		s.PublicLinkSalt = NewString("")
  1299  	}
  1300  
  1301  	if s.InitialFont == nil {
  1302  		// Defaults to "nunito-bold.ttf"
  1303  		s.InitialFont = NewString("nunito-bold.ttf")
  1304  	}
  1305  
  1306  	if s.AmazonS3AccessKeyId == nil {
  1307  		s.AmazonS3AccessKeyId = NewString("")
  1308  	}
  1309  
  1310  	if s.AmazonS3SecretAccessKey == nil {
  1311  		s.AmazonS3SecretAccessKey = NewString("")
  1312  	}
  1313  
  1314  	if s.AmazonS3Bucket == nil {
  1315  		s.AmazonS3Bucket = NewString("")
  1316  	}
  1317  
  1318  	if s.AmazonS3PathPrefix == nil {
  1319  		s.AmazonS3PathPrefix = NewString("")
  1320  	}
  1321  
  1322  	if s.AmazonS3Region == nil {
  1323  		s.AmazonS3Region = NewString("")
  1324  	}
  1325  
  1326  	if s.AmazonS3Endpoint == nil || len(*s.AmazonS3Endpoint) == 0 {
  1327  		// Defaults to "s3.amazonaws.com"
  1328  		s.AmazonS3Endpoint = NewString("s3.amazonaws.com")
  1329  	}
  1330  
  1331  	if s.AmazonS3SSL == nil {
  1332  		s.AmazonS3SSL = NewBool(true) // Secure by default.
  1333  	}
  1334  
  1335  	if s.AmazonS3SignV2 == nil {
  1336  		s.AmazonS3SignV2 = new(bool)
  1337  		// Signature v2 is not enabled by default.
  1338  	}
  1339  
  1340  	if s.AmazonS3SSE == nil {
  1341  		s.AmazonS3SSE = NewBool(false) // Not Encrypted by default.
  1342  	}
  1343  
  1344  	if s.AmazonS3Trace == nil {
  1345  		s.AmazonS3Trace = NewBool(false)
  1346  	}
  1347  }
  1348  
  1349  type EmailSettings struct {
  1350  	EnableSignUpWithEmail             *bool
  1351  	EnableSignInWithEmail             *bool
  1352  	EnableSignInWithUsername          *bool
  1353  	SendEmailNotifications            *bool
  1354  	UseChannelInEmailNotifications    *bool
  1355  	RequireEmailVerification          *bool
  1356  	FeedbackName                      *string
  1357  	FeedbackEmail                     *string
  1358  	ReplyToAddress                    *string
  1359  	FeedbackOrganization              *string
  1360  	EnableSMTPAuth                    *bool   `restricted:"true"`
  1361  	SMTPUsername                      *string `restricted:"true"`
  1362  	SMTPPassword                      *string `restricted:"true"`
  1363  	SMTPServer                        *string `restricted:"true"`
  1364  	SMTPPort                          *string `restricted:"true"`
  1365  	SMTPServerTimeout                 *int
  1366  	ConnectionSecurity                *string `restricted:"true"`
  1367  	SendPushNotifications             *bool
  1368  	PushNotificationServer            *string
  1369  	PushNotificationContents          *string
  1370  	PushNotificationBuffer            *int
  1371  	EnableEmailBatching               *bool
  1372  	EmailBatchingBufferSize           *int
  1373  	EmailBatchingInterval             *int
  1374  	EnablePreviewModeBanner           *bool
  1375  	SkipServerCertificateVerification *bool `restricted:"true"`
  1376  	EmailNotificationContentsType     *string
  1377  	LoginButtonColor                  *string
  1378  	LoginButtonBorderColor            *string
  1379  	LoginButtonTextColor              *string
  1380  }
  1381  
  1382  func (s *EmailSettings) SetDefaults(isUpdate bool) {
  1383  	if s.EnableSignUpWithEmail == nil {
  1384  		s.EnableSignUpWithEmail = NewBool(true)
  1385  	}
  1386  
  1387  	if s.EnableSignInWithEmail == nil {
  1388  		s.EnableSignInWithEmail = NewBool(*s.EnableSignUpWithEmail)
  1389  	}
  1390  
  1391  	if s.EnableSignInWithUsername == nil {
  1392  		s.EnableSignInWithUsername = NewBool(true)
  1393  	}
  1394  
  1395  	if s.SendEmailNotifications == nil {
  1396  		s.SendEmailNotifications = NewBool(true)
  1397  	}
  1398  
  1399  	if s.UseChannelInEmailNotifications == nil {
  1400  		s.UseChannelInEmailNotifications = NewBool(false)
  1401  	}
  1402  
  1403  	if s.RequireEmailVerification == nil {
  1404  		s.RequireEmailVerification = NewBool(false)
  1405  	}
  1406  
  1407  	if s.FeedbackName == nil {
  1408  		s.FeedbackName = NewString("")
  1409  	}
  1410  
  1411  	if s.FeedbackEmail == nil {
  1412  		s.FeedbackEmail = NewString("test@example.com")
  1413  	}
  1414  
  1415  	if s.ReplyToAddress == nil {
  1416  		s.ReplyToAddress = NewString("test@example.com")
  1417  	}
  1418  
  1419  	if s.FeedbackOrganization == nil {
  1420  		s.FeedbackOrganization = NewString(EMAIL_SETTINGS_DEFAULT_FEEDBACK_ORGANIZATION)
  1421  	}
  1422  
  1423  	if s.EnableSMTPAuth == nil {
  1424  		if s.ConnectionSecurity == nil || *s.ConnectionSecurity == CONN_SECURITY_NONE {
  1425  			s.EnableSMTPAuth = NewBool(false)
  1426  		} else {
  1427  			s.EnableSMTPAuth = NewBool(true)
  1428  		}
  1429  	}
  1430  
  1431  	if s.SMTPUsername == nil {
  1432  		s.SMTPUsername = NewString("")
  1433  	}
  1434  
  1435  	if s.SMTPPassword == nil {
  1436  		s.SMTPPassword = NewString("")
  1437  	}
  1438  
  1439  	if s.SMTPServer == nil || len(*s.SMTPServer) == 0 {
  1440  		s.SMTPServer = NewString("localhost")
  1441  	}
  1442  
  1443  	if s.SMTPPort == nil || len(*s.SMTPPort) == 0 {
  1444  		s.SMTPPort = NewString("10025")
  1445  	}
  1446  
  1447  	if s.SMTPServerTimeout == nil || *s.SMTPServerTimeout == 0 {
  1448  		s.SMTPServerTimeout = NewInt(10)
  1449  	}
  1450  
  1451  	if s.ConnectionSecurity == nil || *s.ConnectionSecurity == CONN_SECURITY_PLAIN {
  1452  		s.ConnectionSecurity = NewString(CONN_SECURITY_NONE)
  1453  	}
  1454  
  1455  	if s.SendPushNotifications == nil {
  1456  		s.SendPushNotifications = NewBool(!isUpdate)
  1457  	}
  1458  
  1459  	if s.PushNotificationServer == nil {
  1460  		if isUpdate {
  1461  			s.PushNotificationServer = NewString("")
  1462  		} else {
  1463  			s.PushNotificationServer = NewString(GENERIC_NOTIFICATION_SERVER)
  1464  		}
  1465  	}
  1466  
  1467  	if s.PushNotificationContents == nil {
  1468  		s.PushNotificationContents = NewString(FULL_NOTIFICATION)
  1469  	}
  1470  
  1471  	if s.PushNotificationBuffer == nil {
  1472  		s.PushNotificationBuffer = NewInt(1000)
  1473  	}
  1474  
  1475  	if s.EnableEmailBatching == nil {
  1476  		s.EnableEmailBatching = NewBool(false)
  1477  	}
  1478  
  1479  	if s.EmailBatchingBufferSize == nil {
  1480  		s.EmailBatchingBufferSize = NewInt(EMAIL_BATCHING_BUFFER_SIZE)
  1481  	}
  1482  
  1483  	if s.EmailBatchingInterval == nil {
  1484  		s.EmailBatchingInterval = NewInt(EMAIL_BATCHING_INTERVAL)
  1485  	}
  1486  
  1487  	if s.EnablePreviewModeBanner == nil {
  1488  		s.EnablePreviewModeBanner = NewBool(true)
  1489  	}
  1490  
  1491  	if s.EnableSMTPAuth == nil {
  1492  		if *s.ConnectionSecurity == CONN_SECURITY_NONE {
  1493  			s.EnableSMTPAuth = NewBool(false)
  1494  		} else {
  1495  			s.EnableSMTPAuth = NewBool(true)
  1496  		}
  1497  	}
  1498  
  1499  	if *s.ConnectionSecurity == CONN_SECURITY_PLAIN {
  1500  		*s.ConnectionSecurity = CONN_SECURITY_NONE
  1501  	}
  1502  
  1503  	if s.SkipServerCertificateVerification == nil {
  1504  		s.SkipServerCertificateVerification = NewBool(false)
  1505  	}
  1506  
  1507  	if s.EmailNotificationContentsType == nil {
  1508  		s.EmailNotificationContentsType = NewString(EMAIL_NOTIFICATION_CONTENTS_FULL)
  1509  	}
  1510  
  1511  	if s.LoginButtonColor == nil {
  1512  		s.LoginButtonColor = NewString("#0000")
  1513  	}
  1514  
  1515  	if s.LoginButtonBorderColor == nil {
  1516  		s.LoginButtonBorderColor = NewString("#2389D7")
  1517  	}
  1518  
  1519  	if s.LoginButtonTextColor == nil {
  1520  		s.LoginButtonTextColor = NewString("#2389D7")
  1521  	}
  1522  }
  1523  
  1524  type RateLimitSettings struct {
  1525  	Enable           *bool  `restricted:"true"`
  1526  	PerSec           *int   `restricted:"true"`
  1527  	MaxBurst         *int   `restricted:"true"`
  1528  	MemoryStoreSize  *int   `restricted:"true"`
  1529  	VaryByRemoteAddr *bool  `restricted:"true"`
  1530  	VaryByUser       *bool  `restricted:"true"`
  1531  	VaryByHeader     string `restricted:"true"`
  1532  }
  1533  
  1534  func (s *RateLimitSettings) SetDefaults() {
  1535  	if s.Enable == nil {
  1536  		s.Enable = NewBool(false)
  1537  	}
  1538  
  1539  	if s.PerSec == nil {
  1540  		s.PerSec = NewInt(10)
  1541  	}
  1542  
  1543  	if s.MaxBurst == nil {
  1544  		s.MaxBurst = NewInt(100)
  1545  	}
  1546  
  1547  	if s.MemoryStoreSize == nil {
  1548  		s.MemoryStoreSize = NewInt(10000)
  1549  	}
  1550  
  1551  	if s.VaryByRemoteAddr == nil {
  1552  		s.VaryByRemoteAddr = NewBool(true)
  1553  	}
  1554  
  1555  	if s.VaryByUser == nil {
  1556  		s.VaryByUser = NewBool(false)
  1557  	}
  1558  }
  1559  
  1560  type PrivacySettings struct {
  1561  	ShowEmailAddress *bool
  1562  	ShowFullName     *bool
  1563  }
  1564  
  1565  func (s *PrivacySettings) setDefaults() {
  1566  	if s.ShowEmailAddress == nil {
  1567  		s.ShowEmailAddress = NewBool(true)
  1568  	}
  1569  
  1570  	if s.ShowFullName == nil {
  1571  		s.ShowFullName = NewBool(true)
  1572  	}
  1573  }
  1574  
  1575  type SupportSettings struct {
  1576  	TermsOfServiceLink                     *string `restricted:"true"`
  1577  	PrivacyPolicyLink                      *string `restricted:"true"`
  1578  	AboutLink                              *string `restricted:"true"`
  1579  	HelpLink                               *string `restricted:"true"`
  1580  	ReportAProblemLink                     *string `restricted:"true"`
  1581  	SupportEmail                           *string
  1582  	CustomTermsOfServiceEnabled            *bool
  1583  	CustomTermsOfServiceReAcceptancePeriod *int
  1584  	EnableAskCommunityLink                 *bool
  1585  }
  1586  
  1587  func (s *SupportSettings) SetDefaults() {
  1588  	if !IsSafeLink(s.TermsOfServiceLink) {
  1589  		*s.TermsOfServiceLink = SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK
  1590  	}
  1591  
  1592  	if s.TermsOfServiceLink == nil {
  1593  		s.TermsOfServiceLink = NewString(SUPPORT_SETTINGS_DEFAULT_TERMS_OF_SERVICE_LINK)
  1594  	}
  1595  
  1596  	if !IsSafeLink(s.PrivacyPolicyLink) {
  1597  		*s.PrivacyPolicyLink = ""
  1598  	}
  1599  
  1600  	if s.PrivacyPolicyLink == nil {
  1601  		s.PrivacyPolicyLink = NewString(SUPPORT_SETTINGS_DEFAULT_PRIVACY_POLICY_LINK)
  1602  	}
  1603  
  1604  	if !IsSafeLink(s.AboutLink) {
  1605  		*s.AboutLink = ""
  1606  	}
  1607  
  1608  	if s.AboutLink == nil {
  1609  		s.AboutLink = NewString(SUPPORT_SETTINGS_DEFAULT_ABOUT_LINK)
  1610  	}
  1611  
  1612  	if !IsSafeLink(s.HelpLink) {
  1613  		*s.HelpLink = ""
  1614  	}
  1615  
  1616  	if s.HelpLink == nil {
  1617  		s.HelpLink = NewString(SUPPORT_SETTINGS_DEFAULT_HELP_LINK)
  1618  	}
  1619  
  1620  	if !IsSafeLink(s.ReportAProblemLink) {
  1621  		*s.ReportAProblemLink = ""
  1622  	}
  1623  
  1624  	if s.ReportAProblemLink == nil {
  1625  		s.ReportAProblemLink = NewString(SUPPORT_SETTINGS_DEFAULT_REPORT_A_PROBLEM_LINK)
  1626  	}
  1627  
  1628  	if s.SupportEmail == nil {
  1629  		s.SupportEmail = NewString(SUPPORT_SETTINGS_DEFAULT_SUPPORT_EMAIL)
  1630  	}
  1631  
  1632  	if s.CustomTermsOfServiceEnabled == nil {
  1633  		s.CustomTermsOfServiceEnabled = NewBool(false)
  1634  	}
  1635  
  1636  	if s.CustomTermsOfServiceReAcceptancePeriod == nil {
  1637  		s.CustomTermsOfServiceReAcceptancePeriod = NewInt(SUPPORT_SETTINGS_DEFAULT_RE_ACCEPTANCE_PERIOD)
  1638  	}
  1639  
  1640  	if s.EnableAskCommunityLink == nil {
  1641  		s.EnableAskCommunityLink = NewBool(true)
  1642  	}
  1643  }
  1644  
  1645  type AnnouncementSettings struct {
  1646  	EnableBanner         *bool
  1647  	BannerText           *string
  1648  	BannerColor          *string
  1649  	BannerTextColor      *string
  1650  	AllowBannerDismissal *bool
  1651  }
  1652  
  1653  func (s *AnnouncementSettings) SetDefaults() {
  1654  	if s.EnableBanner == nil {
  1655  		s.EnableBanner = NewBool(false)
  1656  	}
  1657  
  1658  	if s.BannerText == nil {
  1659  		s.BannerText = NewString("")
  1660  	}
  1661  
  1662  	if s.BannerColor == nil {
  1663  		s.BannerColor = NewString(ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_COLOR)
  1664  	}
  1665  
  1666  	if s.BannerTextColor == nil {
  1667  		s.BannerTextColor = NewString(ANNOUNCEMENT_SETTINGS_DEFAULT_BANNER_TEXT_COLOR)
  1668  	}
  1669  
  1670  	if s.AllowBannerDismissal == nil {
  1671  		s.AllowBannerDismissal = NewBool(true)
  1672  	}
  1673  }
  1674  
  1675  type ThemeSettings struct {
  1676  	EnableThemeSelection *bool
  1677  	DefaultTheme         *string
  1678  	AllowCustomThemes    *bool
  1679  	AllowedThemes        []string
  1680  }
  1681  
  1682  func (s *ThemeSettings) SetDefaults() {
  1683  	if s.EnableThemeSelection == nil {
  1684  		s.EnableThemeSelection = NewBool(true)
  1685  	}
  1686  
  1687  	if s.DefaultTheme == nil {
  1688  		s.DefaultTheme = NewString(TEAM_SETTINGS_DEFAULT_TEAM_TEXT)
  1689  	}
  1690  
  1691  	if s.AllowCustomThemes == nil {
  1692  		s.AllowCustomThemes = NewBool(true)
  1693  	}
  1694  
  1695  	if s.AllowedThemes == nil {
  1696  		s.AllowedThemes = []string{}
  1697  	}
  1698  }
  1699  
  1700  type TeamSettings struct {
  1701  	SiteName                                                  *string
  1702  	MaxUsersPerTeam                                           *int
  1703  	DEPRECATED_DO_NOT_USE_EnableTeamCreation                  *bool `json:"EnableTeamCreation" mapstructure:"EnableTeamCreation"` // This field is deprecated and must not be used.
  1704  	EnableUserCreation                                        *bool
  1705  	EnableOpenServer                                          *bool
  1706  	EnableUserDeactivation                                    *bool
  1707  	RestrictCreationToDomains                                 *string
  1708  	EnableCustomBrand                                         *bool
  1709  	CustomBrandText                                           *string
  1710  	CustomDescriptionText                                     *string
  1711  	RestrictDirectMessage                                     *string
  1712  	DEPRECATED_DO_NOT_USE_RestrictTeamInvite                  *string `json:"RestrictTeamInvite" mapstructure:"RestrictTeamInvite"`                                   // This field is deprecated and must not be used.
  1713  	DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement     *string `json:"RestrictPublicChannelManagement" mapstructure:"RestrictPublicChannelManagement"`         // This field is deprecated and must not be used.
  1714  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement    *string `json:"RestrictPrivateChannelManagement" mapstructure:"RestrictPrivateChannelManagement"`       // This field is deprecated and must not be used.
  1715  	DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation       *string `json:"RestrictPublicChannelCreation" mapstructure:"RestrictPublicChannelCreation"`             // This field is deprecated and must not be used.
  1716  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation      *string `json:"RestrictPrivateChannelCreation" mapstructure:"RestrictPrivateChannelCreation"`           // This field is deprecated and must not be used.
  1717  	DEPRECATED_DO_NOT_USE_RestrictPublicChannelDeletion       *string `json:"RestrictPublicChannelDeletion" mapstructure:"RestrictPublicChannelDeletion"`             // This field is deprecated and must not be used.
  1718  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelDeletion      *string `json:"RestrictPrivateChannelDeletion" mapstructure:"RestrictPrivateChannelDeletion"`           // This field is deprecated and must not be used.
  1719  	DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManageMembers *string `json:"RestrictPrivateChannelManageMembers" mapstructure:"RestrictPrivateChannelManageMembers"` // This field is deprecated and must not be used.
  1720  	EnableXToLeaveChannelsFromLHS                             *bool
  1721  	UserStatusAwayTimeout                                     *int64
  1722  	MaxChannelsPerTeam                                        *int64
  1723  	MaxNotificationsPerChannel                                *int64
  1724  	EnableConfirmNotificationsToChannel                       *bool
  1725  	TeammateNameDisplay                                       *string
  1726  	ExperimentalViewArchivedChannels                          *bool
  1727  	ExperimentalEnableAutomaticReplies                        *bool
  1728  	ExperimentalHideTownSquareinLHS                           *bool
  1729  	ExperimentalTownSquareIsReadOnly                          *bool
  1730  	LockTeammateNameDisplay                                   *bool
  1731  	ExperimentalPrimaryTeam                                   *string
  1732  	ExperimentalDefaultChannels                               []string
  1733  }
  1734  
  1735  func (s *TeamSettings) SetDefaults() {
  1736  
  1737  	if s.SiteName == nil || *s.SiteName == "" {
  1738  		s.SiteName = NewString(TEAM_SETTINGS_DEFAULT_SITE_NAME)
  1739  	}
  1740  
  1741  	if s.MaxUsersPerTeam == nil {
  1742  		s.MaxUsersPerTeam = NewInt(TEAM_SETTINGS_DEFAULT_MAX_USERS_PER_TEAM)
  1743  	}
  1744  
  1745  	if s.DEPRECATED_DO_NOT_USE_EnableTeamCreation == nil {
  1746  		s.DEPRECATED_DO_NOT_USE_EnableTeamCreation = NewBool(true)
  1747  	}
  1748  
  1749  	if s.EnableUserCreation == nil {
  1750  		s.EnableUserCreation = NewBool(true)
  1751  	}
  1752  
  1753  	if s.EnableOpenServer == nil {
  1754  		s.EnableOpenServer = NewBool(false)
  1755  	}
  1756  
  1757  	if s.RestrictCreationToDomains == nil {
  1758  		s.RestrictCreationToDomains = NewString("")
  1759  	}
  1760  
  1761  	if s.EnableCustomBrand == nil {
  1762  		s.EnableCustomBrand = NewBool(false)
  1763  	}
  1764  
  1765  	if s.EnableUserDeactivation == nil {
  1766  		s.EnableUserDeactivation = NewBool(false)
  1767  	}
  1768  
  1769  	if s.CustomBrandText == nil {
  1770  		s.CustomBrandText = NewString(TEAM_SETTINGS_DEFAULT_CUSTOM_BRAND_TEXT)
  1771  	}
  1772  
  1773  	if s.CustomDescriptionText == nil {
  1774  		s.CustomDescriptionText = NewString(TEAM_SETTINGS_DEFAULT_CUSTOM_DESCRIPTION_TEXT)
  1775  	}
  1776  
  1777  	if s.RestrictDirectMessage == nil {
  1778  		s.RestrictDirectMessage = NewString(DIRECT_MESSAGE_ANY)
  1779  	}
  1780  
  1781  	if s.DEPRECATED_DO_NOT_USE_RestrictTeamInvite == nil {
  1782  		s.DEPRECATED_DO_NOT_USE_RestrictTeamInvite = NewString(PERMISSIONS_ALL)
  1783  	}
  1784  
  1785  	if s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement == nil {
  1786  		s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement = NewString(PERMISSIONS_ALL)
  1787  	}
  1788  
  1789  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement == nil {
  1790  		s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement = NewString(PERMISSIONS_ALL)
  1791  	}
  1792  
  1793  	if s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation == nil {
  1794  		s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation = new(string)
  1795  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1796  		if *s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement == PERMISSIONS_CHANNEL_ADMIN {
  1797  			*s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation = PERMISSIONS_TEAM_ADMIN
  1798  		} else {
  1799  			*s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelCreation = *s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement
  1800  		}
  1801  	}
  1802  
  1803  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation == nil {
  1804  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1805  		if *s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement == PERMISSIONS_CHANNEL_ADMIN {
  1806  			s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation = NewString(PERMISSIONS_TEAM_ADMIN)
  1807  		} else {
  1808  			s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelCreation = NewString(*s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement)
  1809  		}
  1810  	}
  1811  
  1812  	if s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelDeletion == nil {
  1813  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1814  		s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelDeletion = NewString(*s.DEPRECATED_DO_NOT_USE_RestrictPublicChannelManagement)
  1815  	}
  1816  
  1817  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelDeletion == nil {
  1818  		// If this setting does not exist, assume migration from <3.6, so use management setting as default.
  1819  		s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelDeletion = NewString(*s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManagement)
  1820  	}
  1821  
  1822  	if s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManageMembers == nil {
  1823  		s.DEPRECATED_DO_NOT_USE_RestrictPrivateChannelManageMembers = NewString(PERMISSIONS_ALL)
  1824  	}
  1825  
  1826  	if s.EnableXToLeaveChannelsFromLHS == nil {
  1827  		s.EnableXToLeaveChannelsFromLHS = NewBool(false)
  1828  	}
  1829  
  1830  	if s.UserStatusAwayTimeout == nil {
  1831  		s.UserStatusAwayTimeout = NewInt64(TEAM_SETTINGS_DEFAULT_USER_STATUS_AWAY_TIMEOUT)
  1832  	}
  1833  
  1834  	if s.MaxChannelsPerTeam == nil {
  1835  		s.MaxChannelsPerTeam = NewInt64(2000)
  1836  	}
  1837  
  1838  	if s.MaxNotificationsPerChannel == nil {
  1839  		s.MaxNotificationsPerChannel = NewInt64(1000)
  1840  	}
  1841  
  1842  	if s.EnableConfirmNotificationsToChannel == nil {
  1843  		s.EnableConfirmNotificationsToChannel = NewBool(true)
  1844  	}
  1845  
  1846  	if s.ExperimentalEnableAutomaticReplies == nil {
  1847  		s.ExperimentalEnableAutomaticReplies = NewBool(false)
  1848  	}
  1849  
  1850  	if s.ExperimentalHideTownSquareinLHS == nil {
  1851  		s.ExperimentalHideTownSquareinLHS = NewBool(false)
  1852  	}
  1853  
  1854  	if s.ExperimentalTownSquareIsReadOnly == nil {
  1855  		s.ExperimentalTownSquareIsReadOnly = NewBool(false)
  1856  	}
  1857  
  1858  	if s.ExperimentalPrimaryTeam == nil {
  1859  		s.ExperimentalPrimaryTeam = NewString("")
  1860  	}
  1861  
  1862  	if s.ExperimentalDefaultChannels == nil {
  1863  		s.ExperimentalDefaultChannels = []string{}
  1864  	}
  1865  
  1866  	if s.DEPRECATED_DO_NOT_USE_EnableTeamCreation == nil {
  1867  		s.DEPRECATED_DO_NOT_USE_EnableTeamCreation = NewBool(true)
  1868  	}
  1869  
  1870  	if s.EnableUserCreation == nil {
  1871  		s.EnableUserCreation = NewBool(true)
  1872  	}
  1873  
  1874  	if s.ExperimentalViewArchivedChannels == nil {
  1875  		s.ExperimentalViewArchivedChannels = NewBool(false)
  1876  	}
  1877  
  1878  	if s.LockTeammateNameDisplay == nil {
  1879  		s.LockTeammateNameDisplay = NewBool(false)
  1880  	}
  1881  }
  1882  
  1883  type ClientRequirements struct {
  1884  	AndroidLatestVersion string `restricted:"true"`
  1885  	AndroidMinVersion    string `restricted:"true"`
  1886  	DesktopLatestVersion string `restricted:"true"`
  1887  	DesktopMinVersion    string `restricted:"true"`
  1888  	IosLatestVersion     string `restricted:"true"`
  1889  	IosMinVersion        string `restricted:"true"`
  1890  }
  1891  
  1892  type LdapSettings struct {
  1893  	// Basic
  1894  	Enable             *bool
  1895  	EnableSync         *bool
  1896  	LdapServer         *string
  1897  	LdapPort           *int
  1898  	ConnectionSecurity *string
  1899  	BaseDN             *string
  1900  	BindUsername       *string
  1901  	BindPassword       *string
  1902  
  1903  	// Filtering
  1904  	UserFilter        *string
  1905  	GroupFilter       *string
  1906  	GuestFilter       *string
  1907  	EnableAdminFilter *bool
  1908  	AdminFilter       *string
  1909  
  1910  	// Group Mapping
  1911  	GroupDisplayNameAttribute *string
  1912  	GroupIdAttribute          *string
  1913  
  1914  	// User Mapping
  1915  	FirstNameAttribute *string
  1916  	LastNameAttribute  *string
  1917  	EmailAttribute     *string
  1918  	UsernameAttribute  *string
  1919  	NicknameAttribute  *string
  1920  	IdAttribute        *string
  1921  	PositionAttribute  *string
  1922  	LoginIdAttribute   *string
  1923  	PictureAttribute   *string
  1924  
  1925  	// Synchronization
  1926  	SyncIntervalMinutes *int
  1927  
  1928  	// Advanced
  1929  	SkipCertificateVerification *bool
  1930  	QueryTimeout                *int
  1931  	MaxPageSize                 *int
  1932  
  1933  	// Customization
  1934  	LoginFieldName *string
  1935  
  1936  	LoginButtonColor       *string
  1937  	LoginButtonBorderColor *string
  1938  	LoginButtonTextColor   *string
  1939  
  1940  	Trace *bool
  1941  }
  1942  
  1943  func (s *LdapSettings) SetDefaults() {
  1944  	if s.Enable == nil {
  1945  		s.Enable = NewBool(false)
  1946  	}
  1947  
  1948  	// When unset should default to LDAP Enabled
  1949  	if s.EnableSync == nil {
  1950  		s.EnableSync = NewBool(*s.Enable)
  1951  	}
  1952  
  1953  	if s.EnableAdminFilter == nil {
  1954  		s.EnableAdminFilter = NewBool(false)
  1955  	}
  1956  
  1957  	if s.LdapServer == nil {
  1958  		s.LdapServer = NewString("")
  1959  	}
  1960  
  1961  	if s.LdapPort == nil {
  1962  		s.LdapPort = NewInt(389)
  1963  	}
  1964  
  1965  	if s.ConnectionSecurity == nil {
  1966  		s.ConnectionSecurity = NewString("")
  1967  	}
  1968  
  1969  	if s.BaseDN == nil {
  1970  		s.BaseDN = NewString("")
  1971  	}
  1972  
  1973  	if s.BindUsername == nil {
  1974  		s.BindUsername = NewString("")
  1975  	}
  1976  
  1977  	if s.BindPassword == nil {
  1978  		s.BindPassword = NewString("")
  1979  	}
  1980  
  1981  	if s.UserFilter == nil {
  1982  		s.UserFilter = NewString("")
  1983  	}
  1984  
  1985  	if s.GuestFilter == nil {
  1986  		s.GuestFilter = NewString("")
  1987  	}
  1988  
  1989  	if s.AdminFilter == nil {
  1990  		s.AdminFilter = NewString("")
  1991  	}
  1992  
  1993  	if s.GroupFilter == nil {
  1994  		s.GroupFilter = NewString("")
  1995  	}
  1996  
  1997  	if s.GroupDisplayNameAttribute == nil {
  1998  		s.GroupDisplayNameAttribute = NewString(LDAP_SETTINGS_DEFAULT_GROUP_DISPLAY_NAME_ATTRIBUTE)
  1999  	}
  2000  
  2001  	if s.GroupIdAttribute == nil {
  2002  		s.GroupIdAttribute = NewString(LDAP_SETTINGS_DEFAULT_GROUP_ID_ATTRIBUTE)
  2003  	}
  2004  
  2005  	if s.FirstNameAttribute == nil {
  2006  		s.FirstNameAttribute = NewString(LDAP_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE)
  2007  	}
  2008  
  2009  	if s.LastNameAttribute == nil {
  2010  		s.LastNameAttribute = NewString(LDAP_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE)
  2011  	}
  2012  
  2013  	if s.EmailAttribute == nil {
  2014  		s.EmailAttribute = NewString(LDAP_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE)
  2015  	}
  2016  
  2017  	if s.UsernameAttribute == nil {
  2018  		s.UsernameAttribute = NewString(LDAP_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE)
  2019  	}
  2020  
  2021  	if s.NicknameAttribute == nil {
  2022  		s.NicknameAttribute = NewString(LDAP_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE)
  2023  	}
  2024  
  2025  	if s.IdAttribute == nil {
  2026  		s.IdAttribute = NewString(LDAP_SETTINGS_DEFAULT_ID_ATTRIBUTE)
  2027  	}
  2028  
  2029  	if s.PositionAttribute == nil {
  2030  		s.PositionAttribute = NewString(LDAP_SETTINGS_DEFAULT_POSITION_ATTRIBUTE)
  2031  	}
  2032  
  2033  	if s.PictureAttribute == nil {
  2034  		s.PictureAttribute = NewString(LDAP_SETTINGS_DEFAULT_PICTURE_ATTRIBUTE)
  2035  	}
  2036  
  2037  	// For those upgrading to the version when LoginIdAttribute was added
  2038  	// they need IdAttribute == LoginIdAttribute not to break
  2039  	if s.LoginIdAttribute == nil {
  2040  		s.LoginIdAttribute = s.IdAttribute
  2041  	}
  2042  
  2043  	if s.SyncIntervalMinutes == nil {
  2044  		s.SyncIntervalMinutes = NewInt(60)
  2045  	}
  2046  
  2047  	if s.SkipCertificateVerification == nil {
  2048  		s.SkipCertificateVerification = NewBool(false)
  2049  	}
  2050  
  2051  	if s.QueryTimeout == nil {
  2052  		s.QueryTimeout = NewInt(60)
  2053  	}
  2054  
  2055  	if s.MaxPageSize == nil {
  2056  		s.MaxPageSize = NewInt(0)
  2057  	}
  2058  
  2059  	if s.LoginFieldName == nil {
  2060  		s.LoginFieldName = NewString(LDAP_SETTINGS_DEFAULT_LOGIN_FIELD_NAME)
  2061  	}
  2062  
  2063  	if s.LoginButtonColor == nil {
  2064  		s.LoginButtonColor = NewString("#0000")
  2065  	}
  2066  
  2067  	if s.LoginButtonBorderColor == nil {
  2068  		s.LoginButtonBorderColor = NewString("#2389D7")
  2069  	}
  2070  
  2071  	if s.LoginButtonTextColor == nil {
  2072  		s.LoginButtonTextColor = NewString("#2389D7")
  2073  	}
  2074  
  2075  	if s.Trace == nil {
  2076  		s.Trace = NewBool(false)
  2077  	}
  2078  }
  2079  
  2080  type ComplianceSettings struct {
  2081  	Enable      *bool
  2082  	Directory   *string
  2083  	EnableDaily *bool
  2084  }
  2085  
  2086  func (s *ComplianceSettings) SetDefaults() {
  2087  	if s.Enable == nil {
  2088  		s.Enable = NewBool(false)
  2089  	}
  2090  
  2091  	if s.Directory == nil {
  2092  		s.Directory = NewString("./data/")
  2093  	}
  2094  
  2095  	if s.EnableDaily == nil {
  2096  		s.EnableDaily = NewBool(false)
  2097  	}
  2098  }
  2099  
  2100  type LocalizationSettings struct {
  2101  	DefaultServerLocale *string
  2102  	DefaultClientLocale *string
  2103  	AvailableLocales    *string
  2104  }
  2105  
  2106  func (s *LocalizationSettings) SetDefaults() {
  2107  	if s.DefaultServerLocale == nil {
  2108  		s.DefaultServerLocale = NewString(DEFAULT_LOCALE)
  2109  	}
  2110  
  2111  	if s.DefaultClientLocale == nil {
  2112  		s.DefaultClientLocale = NewString(DEFAULT_LOCALE)
  2113  	}
  2114  
  2115  	if s.AvailableLocales == nil {
  2116  		s.AvailableLocales = NewString("")
  2117  	}
  2118  }
  2119  
  2120  type SamlSettings struct {
  2121  	// Basic
  2122  	Enable                        *bool
  2123  	EnableSyncWithLdap            *bool
  2124  	EnableSyncWithLdapIncludeAuth *bool
  2125  
  2126  	Verify      *bool
  2127  	Encrypt     *bool
  2128  	SignRequest *bool
  2129  
  2130  	IdpUrl                      *string
  2131  	IdpDescriptorUrl            *string
  2132  	IdpMetadataUrl              *string
  2133  	ServiceProviderIdentifier   *string
  2134  	AssertionConsumerServiceURL *string
  2135  
  2136  	SignatureAlgorithm *string
  2137  	CanonicalAlgorithm *string
  2138  
  2139  	ScopingIDPProviderId *string
  2140  	ScopingIDPName       *string
  2141  
  2142  	IdpCertificateFile    *string
  2143  	PublicCertificateFile *string
  2144  	PrivateKeyFile        *string
  2145  
  2146  	// User Mapping
  2147  	IdAttribute          *string
  2148  	GuestAttribute       *string
  2149  	EnableAdminAttribute *bool
  2150  	AdminAttribute       *string
  2151  	FirstNameAttribute   *string
  2152  	LastNameAttribute    *string
  2153  	EmailAttribute       *string
  2154  	UsernameAttribute    *string
  2155  	NicknameAttribute    *string
  2156  	LocaleAttribute      *string
  2157  	PositionAttribute    *string
  2158  
  2159  	LoginButtonText *string
  2160  
  2161  	LoginButtonColor       *string
  2162  	LoginButtonBorderColor *string
  2163  	LoginButtonTextColor   *string
  2164  }
  2165  
  2166  func (s *SamlSettings) SetDefaults() {
  2167  	if s.Enable == nil {
  2168  		s.Enable = NewBool(false)
  2169  	}
  2170  
  2171  	if s.EnableSyncWithLdap == nil {
  2172  		s.EnableSyncWithLdap = NewBool(false)
  2173  	}
  2174  
  2175  	if s.EnableSyncWithLdapIncludeAuth == nil {
  2176  		s.EnableSyncWithLdapIncludeAuth = NewBool(false)
  2177  	}
  2178  
  2179  	if s.EnableAdminAttribute == nil {
  2180  		s.EnableAdminAttribute = NewBool(false)
  2181  	}
  2182  
  2183  	if s.Verify == nil {
  2184  		s.Verify = NewBool(true)
  2185  	}
  2186  
  2187  	if s.Encrypt == nil {
  2188  		s.Encrypt = NewBool(true)
  2189  	}
  2190  
  2191  	if s.SignRequest == nil {
  2192  		s.SignRequest = NewBool(false)
  2193  	}
  2194  
  2195  	if s.SignatureAlgorithm == nil {
  2196  		s.SignatureAlgorithm = NewString(SAML_SETTINGS_DEFAULT_SIGNATURE_ALGORITHM)
  2197  	}
  2198  
  2199  	if s.CanonicalAlgorithm == nil {
  2200  		s.CanonicalAlgorithm = NewString(SAML_SETTINGS_DEFAULT_CANONICAL_ALGORITHM)
  2201  	}
  2202  
  2203  	if s.IdpUrl == nil {
  2204  		s.IdpUrl = NewString("")
  2205  	}
  2206  
  2207  	if s.IdpDescriptorUrl == nil {
  2208  		s.IdpDescriptorUrl = NewString("")
  2209  	}
  2210  
  2211  	if s.ServiceProviderIdentifier == nil {
  2212  		if s.IdpDescriptorUrl != nil {
  2213  			s.ServiceProviderIdentifier = NewString(*s.IdpDescriptorUrl)
  2214  		} else {
  2215  			s.ServiceProviderIdentifier = NewString("")
  2216  		}
  2217  	}
  2218  
  2219  	if s.IdpMetadataUrl == nil {
  2220  		s.IdpMetadataUrl = NewString("")
  2221  	}
  2222  
  2223  	if s.IdpCertificateFile == nil {
  2224  		s.IdpCertificateFile = NewString("")
  2225  	}
  2226  
  2227  	if s.PublicCertificateFile == nil {
  2228  		s.PublicCertificateFile = NewString("")
  2229  	}
  2230  
  2231  	if s.PrivateKeyFile == nil {
  2232  		s.PrivateKeyFile = NewString("")
  2233  	}
  2234  
  2235  	if s.AssertionConsumerServiceURL == nil {
  2236  		s.AssertionConsumerServiceURL = NewString("")
  2237  	}
  2238  
  2239  	if s.ScopingIDPProviderId == nil {
  2240  		s.ScopingIDPProviderId = NewString("")
  2241  	}
  2242  
  2243  	if s.ScopingIDPName == nil {
  2244  		s.ScopingIDPName = NewString("")
  2245  	}
  2246  
  2247  	if s.LoginButtonText == nil || *s.LoginButtonText == "" {
  2248  		s.LoginButtonText = NewString(USER_AUTH_SERVICE_SAML_TEXT)
  2249  	}
  2250  
  2251  	if s.IdAttribute == nil {
  2252  		s.IdAttribute = NewString(SAML_SETTINGS_DEFAULT_ID_ATTRIBUTE)
  2253  	}
  2254  
  2255  	if s.GuestAttribute == nil {
  2256  		s.GuestAttribute = NewString(SAML_SETTINGS_DEFAULT_GUEST_ATTRIBUTE)
  2257  	}
  2258  	if s.AdminAttribute == nil {
  2259  		s.AdminAttribute = NewString(SAML_SETTINGS_DEFAULT_ADMIN_ATTRIBUTE)
  2260  	}
  2261  	if s.FirstNameAttribute == nil {
  2262  		s.FirstNameAttribute = NewString(SAML_SETTINGS_DEFAULT_FIRST_NAME_ATTRIBUTE)
  2263  	}
  2264  
  2265  	if s.LastNameAttribute == nil {
  2266  		s.LastNameAttribute = NewString(SAML_SETTINGS_DEFAULT_LAST_NAME_ATTRIBUTE)
  2267  	}
  2268  
  2269  	if s.EmailAttribute == nil {
  2270  		s.EmailAttribute = NewString(SAML_SETTINGS_DEFAULT_EMAIL_ATTRIBUTE)
  2271  	}
  2272  
  2273  	if s.UsernameAttribute == nil {
  2274  		s.UsernameAttribute = NewString(SAML_SETTINGS_DEFAULT_USERNAME_ATTRIBUTE)
  2275  	}
  2276  
  2277  	if s.NicknameAttribute == nil {
  2278  		s.NicknameAttribute = NewString(SAML_SETTINGS_DEFAULT_NICKNAME_ATTRIBUTE)
  2279  	}
  2280  
  2281  	if s.PositionAttribute == nil {
  2282  		s.PositionAttribute = NewString(SAML_SETTINGS_DEFAULT_POSITION_ATTRIBUTE)
  2283  	}
  2284  
  2285  	if s.LocaleAttribute == nil {
  2286  		s.LocaleAttribute = NewString(SAML_SETTINGS_DEFAULT_LOCALE_ATTRIBUTE)
  2287  	}
  2288  
  2289  	if s.LoginButtonColor == nil {
  2290  		s.LoginButtonColor = NewString("#34a28b")
  2291  	}
  2292  
  2293  	if s.LoginButtonBorderColor == nil {
  2294  		s.LoginButtonBorderColor = NewString("#2389D7")
  2295  	}
  2296  
  2297  	if s.LoginButtonTextColor == nil {
  2298  		s.LoginButtonTextColor = NewString("#ffffff")
  2299  	}
  2300  }
  2301  
  2302  type NativeAppSettings struct {
  2303  	AppDownloadLink        *string `restricted:"true"`
  2304  	AndroidAppDownloadLink *string `restricted:"true"`
  2305  	IosAppDownloadLink     *string `restricted:"true"`
  2306  }
  2307  
  2308  func (s *NativeAppSettings) SetDefaults() {
  2309  	if s.AppDownloadLink == nil {
  2310  		s.AppDownloadLink = NewString(NATIVEAPP_SETTINGS_DEFAULT_APP_DOWNLOAD_LINK)
  2311  	}
  2312  
  2313  	if s.AndroidAppDownloadLink == nil {
  2314  		s.AndroidAppDownloadLink = NewString(NATIVEAPP_SETTINGS_DEFAULT_ANDROID_APP_DOWNLOAD_LINK)
  2315  	}
  2316  
  2317  	if s.IosAppDownloadLink == nil {
  2318  		s.IosAppDownloadLink = NewString(NATIVEAPP_SETTINGS_DEFAULT_IOS_APP_DOWNLOAD_LINK)
  2319  	}
  2320  }
  2321  
  2322  type ElasticsearchSettings struct {
  2323  	ConnectionUrl                 *string `restricted:"true"`
  2324  	Username                      *string `restricted:"true"`
  2325  	Password                      *string `restricted:"true"`
  2326  	EnableIndexing                *bool   `restricted:"true"`
  2327  	EnableSearching               *bool   `restricted:"true"`
  2328  	EnableAutocomplete            *bool   `restricted:"true"`
  2329  	Sniff                         *bool   `restricted:"true"`
  2330  	PostIndexReplicas             *int    `restricted:"true"`
  2331  	PostIndexShards               *int    `restricted:"true"`
  2332  	ChannelIndexReplicas          *int    `restricted:"true"`
  2333  	ChannelIndexShards            *int    `restricted:"true"`
  2334  	UserIndexReplicas             *int    `restricted:"true"`
  2335  	UserIndexShards               *int    `restricted:"true"`
  2336  	AggregatePostsAfterDays       *int    `restricted:"true"`
  2337  	PostsAggregatorJobStartTime   *string `restricted:"true"`
  2338  	IndexPrefix                   *string `restricted:"true"`
  2339  	LiveIndexingBatchSize         *int    `restricted:"true"`
  2340  	BulkIndexingTimeWindowSeconds *int    `restricted:"true"`
  2341  	RequestTimeoutSeconds         *int    `restricted:"true"`
  2342  	SkipTLSVerification           *bool   `restricted:"true"`
  2343  	Trace                         *string `restricted:"true"`
  2344  }
  2345  
  2346  func (s *ElasticsearchSettings) SetDefaults() {
  2347  	if s.ConnectionUrl == nil {
  2348  		s.ConnectionUrl = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_CONNECTION_URL)
  2349  	}
  2350  
  2351  	if s.Username == nil {
  2352  		s.Username = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_USERNAME)
  2353  	}
  2354  
  2355  	if s.Password == nil {
  2356  		s.Password = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_PASSWORD)
  2357  	}
  2358  
  2359  	if s.EnableIndexing == nil {
  2360  		s.EnableIndexing = NewBool(false)
  2361  	}
  2362  
  2363  	if s.EnableSearching == nil {
  2364  		s.EnableSearching = NewBool(false)
  2365  	}
  2366  
  2367  	if s.EnableAutocomplete == nil {
  2368  		s.EnableAutocomplete = NewBool(false)
  2369  	}
  2370  
  2371  	if s.Sniff == nil {
  2372  		s.Sniff = NewBool(true)
  2373  	}
  2374  
  2375  	if s.PostIndexReplicas == nil {
  2376  		s.PostIndexReplicas = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_REPLICAS)
  2377  	}
  2378  
  2379  	if s.PostIndexShards == nil {
  2380  		s.PostIndexShards = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_POST_INDEX_SHARDS)
  2381  	}
  2382  
  2383  	if s.ChannelIndexReplicas == nil {
  2384  		s.ChannelIndexReplicas = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_CHANNEL_INDEX_REPLICAS)
  2385  	}
  2386  
  2387  	if s.ChannelIndexShards == nil {
  2388  		s.ChannelIndexShards = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_CHANNEL_INDEX_SHARDS)
  2389  	}
  2390  
  2391  	if s.UserIndexReplicas == nil {
  2392  		s.UserIndexReplicas = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_USER_INDEX_REPLICAS)
  2393  	}
  2394  
  2395  	if s.UserIndexShards == nil {
  2396  		s.UserIndexShards = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_USER_INDEX_SHARDS)
  2397  	}
  2398  
  2399  	if s.AggregatePostsAfterDays == nil {
  2400  		s.AggregatePostsAfterDays = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_AGGREGATE_POSTS_AFTER_DAYS)
  2401  	}
  2402  
  2403  	if s.PostsAggregatorJobStartTime == nil {
  2404  		s.PostsAggregatorJobStartTime = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_POSTS_AGGREGATOR_JOB_START_TIME)
  2405  	}
  2406  
  2407  	if s.IndexPrefix == nil {
  2408  		s.IndexPrefix = NewString(ELASTICSEARCH_SETTINGS_DEFAULT_INDEX_PREFIX)
  2409  	}
  2410  
  2411  	if s.LiveIndexingBatchSize == nil {
  2412  		s.LiveIndexingBatchSize = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_LIVE_INDEXING_BATCH_SIZE)
  2413  	}
  2414  
  2415  	if s.BulkIndexingTimeWindowSeconds == nil {
  2416  		s.BulkIndexingTimeWindowSeconds = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_BULK_INDEXING_TIME_WINDOW_SECONDS)
  2417  	}
  2418  
  2419  	if s.RequestTimeoutSeconds == nil {
  2420  		s.RequestTimeoutSeconds = NewInt(ELASTICSEARCH_SETTINGS_DEFAULT_REQUEST_TIMEOUT_SECONDS)
  2421  	}
  2422  
  2423  	if s.SkipTLSVerification == nil {
  2424  		s.SkipTLSVerification = NewBool(false)
  2425  	}
  2426  
  2427  	if s.Trace == nil {
  2428  		s.Trace = NewString("")
  2429  	}
  2430  }
  2431  
  2432  type BleveSettings struct {
  2433  	IndexDir                      *string
  2434  	EnableIndexing                *bool
  2435  	EnableSearching               *bool
  2436  	EnableAutocomplete            *bool
  2437  	BulkIndexingTimeWindowSeconds *int
  2438  }
  2439  
  2440  func (bs *BleveSettings) SetDefaults() {
  2441  	if bs.IndexDir == nil {
  2442  		bs.IndexDir = NewString(BLEVE_SETTINGS_DEFAULT_INDEX_DIR)
  2443  	}
  2444  
  2445  	if bs.EnableIndexing == nil {
  2446  		bs.EnableIndexing = NewBool(false)
  2447  	}
  2448  
  2449  	if bs.EnableSearching == nil {
  2450  		bs.EnableSearching = NewBool(false)
  2451  	}
  2452  
  2453  	if bs.EnableAutocomplete == nil {
  2454  		bs.EnableAutocomplete = NewBool(false)
  2455  	}
  2456  
  2457  	if bs.BulkIndexingTimeWindowSeconds == nil {
  2458  		bs.BulkIndexingTimeWindowSeconds = NewInt(BLEVE_SETTINGS_DEFAULT_BULK_INDEXING_TIME_WINDOW_SECONDS)
  2459  	}
  2460  }
  2461  
  2462  type DataRetentionSettings struct {
  2463  	EnableMessageDeletion *bool
  2464  	EnableFileDeletion    *bool
  2465  	MessageRetentionDays  *int
  2466  	FileRetentionDays     *int
  2467  	DeletionJobStartTime  *string
  2468  }
  2469  
  2470  func (s *DataRetentionSettings) SetDefaults() {
  2471  	if s.EnableMessageDeletion == nil {
  2472  		s.EnableMessageDeletion = NewBool(false)
  2473  	}
  2474  
  2475  	if s.EnableFileDeletion == nil {
  2476  		s.EnableFileDeletion = NewBool(false)
  2477  	}
  2478  
  2479  	if s.MessageRetentionDays == nil {
  2480  		s.MessageRetentionDays = NewInt(DATA_RETENTION_SETTINGS_DEFAULT_MESSAGE_RETENTION_DAYS)
  2481  	}
  2482  
  2483  	if s.FileRetentionDays == nil {
  2484  		s.FileRetentionDays = NewInt(DATA_RETENTION_SETTINGS_DEFAULT_FILE_RETENTION_DAYS)
  2485  	}
  2486  
  2487  	if s.DeletionJobStartTime == nil {
  2488  		s.DeletionJobStartTime = NewString(DATA_RETENTION_SETTINGS_DEFAULT_DELETION_JOB_START_TIME)
  2489  	}
  2490  }
  2491  
  2492  type JobSettings struct {
  2493  	RunJobs      *bool `restricted:"true"`
  2494  	RunScheduler *bool `restricted:"true"`
  2495  }
  2496  
  2497  func (s *JobSettings) SetDefaults() {
  2498  	if s.RunJobs == nil {
  2499  		s.RunJobs = NewBool(true)
  2500  	}
  2501  
  2502  	if s.RunScheduler == nil {
  2503  		s.RunScheduler = NewBool(true)
  2504  	}
  2505  }
  2506  
  2507  type PluginState struct {
  2508  	Enable bool
  2509  }
  2510  
  2511  type PluginSettings struct {
  2512  	Enable                      *bool
  2513  	EnableUploads               *bool   `restricted:"true"`
  2514  	AllowInsecureDownloadUrl    *bool   `restricted:"true"`
  2515  	EnableHealthCheck           *bool   `restricted:"true"`
  2516  	Directory                   *string `restricted:"true"`
  2517  	ClientDirectory             *string `restricted:"true"`
  2518  	Plugins                     map[string]map[string]interface{}
  2519  	PluginStates                map[string]*PluginState
  2520  	EnableMarketplace           *bool
  2521  	EnableRemoteMarketplace     *bool
  2522  	AutomaticPrepackagedPlugins *bool
  2523  	RequirePluginSignature      *bool
  2524  	MarketplaceUrl              *string
  2525  	SignaturePublicKeyFiles     []string
  2526  }
  2527  
  2528  func (s *PluginSettings) SetDefaults(ls LogSettings) {
  2529  	if s.Enable == nil {
  2530  		s.Enable = NewBool(true)
  2531  	}
  2532  
  2533  	if s.EnableUploads == nil {
  2534  		s.EnableUploads = NewBool(false)
  2535  	}
  2536  
  2537  	if s.AllowInsecureDownloadUrl == nil {
  2538  		s.AllowInsecureDownloadUrl = NewBool(false)
  2539  	}
  2540  
  2541  	if s.EnableHealthCheck == nil {
  2542  		s.EnableHealthCheck = NewBool(true)
  2543  	}
  2544  
  2545  	if s.Directory == nil || *s.Directory == "" {
  2546  		s.Directory = NewString(PLUGIN_SETTINGS_DEFAULT_DIRECTORY)
  2547  	}
  2548  
  2549  	if s.ClientDirectory == nil || *s.ClientDirectory == "" {
  2550  		s.ClientDirectory = NewString(PLUGIN_SETTINGS_DEFAULT_CLIENT_DIRECTORY)
  2551  	}
  2552  
  2553  	if s.Plugins == nil {
  2554  		s.Plugins = make(map[string]map[string]interface{})
  2555  	}
  2556  
  2557  	if s.PluginStates == nil {
  2558  		s.PluginStates = make(map[string]*PluginState)
  2559  	}
  2560  
  2561  	if s.PluginStates["com.mattermost.nps"] == nil {
  2562  		// Enable the NPS plugin by default if diagnostics are enabled
  2563  		s.PluginStates["com.mattermost.nps"] = &PluginState{Enable: ls.EnableDiagnostics == nil || *ls.EnableDiagnostics}
  2564  	}
  2565  
  2566  	if s.EnableMarketplace == nil {
  2567  		s.EnableMarketplace = NewBool(PLUGIN_SETTINGS_DEFAULT_ENABLE_MARKETPLACE)
  2568  	}
  2569  
  2570  	if s.EnableRemoteMarketplace == nil {
  2571  		s.EnableRemoteMarketplace = NewBool(true)
  2572  	}
  2573  
  2574  	if s.AutomaticPrepackagedPlugins == nil {
  2575  		s.AutomaticPrepackagedPlugins = NewBool(true)
  2576  	}
  2577  
  2578  	if s.MarketplaceUrl == nil || *s.MarketplaceUrl == "" || *s.MarketplaceUrl == PLUGIN_SETTINGS_OLD_MARKETPLACE_URL {
  2579  		s.MarketplaceUrl = NewString(PLUGIN_SETTINGS_DEFAULT_MARKETPLACE_URL)
  2580  	}
  2581  
  2582  	if s.RequirePluginSignature == nil {
  2583  		s.RequirePluginSignature = NewBool(false)
  2584  	}
  2585  
  2586  	if s.SignaturePublicKeyFiles == nil {
  2587  		s.SignaturePublicKeyFiles = []string{}
  2588  	}
  2589  }
  2590  
  2591  type GlobalRelayMessageExportSettings struct {
  2592  	CustomerType      *string // must be either A9 or A10, dictates SMTP server url
  2593  	SmtpUsername      *string
  2594  	SmtpPassword      *string
  2595  	EmailAddress      *string // the address to send messages to
  2596  	SMTPServerTimeout *int
  2597  }
  2598  
  2599  func (s *GlobalRelayMessageExportSettings) SetDefaults() {
  2600  	if s.CustomerType == nil {
  2601  		s.CustomerType = NewString(GLOBALRELAY_CUSTOMER_TYPE_A9)
  2602  	}
  2603  	if s.SmtpUsername == nil {
  2604  		s.SmtpUsername = NewString("")
  2605  	}
  2606  	if s.SmtpPassword == nil {
  2607  		s.SmtpPassword = NewString("")
  2608  	}
  2609  	if s.EmailAddress == nil {
  2610  		s.EmailAddress = NewString("")
  2611  	}
  2612  	if s.SMTPServerTimeout == nil || *s.SMTPServerTimeout == 0 {
  2613  		s.SMTPServerTimeout = NewInt(1800)
  2614  	}
  2615  }
  2616  
  2617  type MessageExportSettings struct {
  2618  	EnableExport          *bool
  2619  	DownloadExportResults *bool
  2620  	ExportFormat          *string
  2621  	DailyRunTime          *string
  2622  	ExportFromTimestamp   *int64
  2623  	BatchSize             *int
  2624  
  2625  	// formatter-specific settings - these are only expected to be non-nil if ExportFormat is set to the associated format
  2626  	GlobalRelaySettings *GlobalRelayMessageExportSettings
  2627  }
  2628  
  2629  func (s *MessageExportSettings) SetDefaults() {
  2630  	if s.EnableExport == nil {
  2631  		s.EnableExport = NewBool(false)
  2632  	}
  2633  
  2634  	if s.DownloadExportResults == nil {
  2635  		s.DownloadExportResults = NewBool(false)
  2636  	}
  2637  
  2638  	if s.ExportFormat == nil {
  2639  		s.ExportFormat = NewString(COMPLIANCE_EXPORT_TYPE_ACTIANCE)
  2640  	}
  2641  
  2642  	if s.DailyRunTime == nil {
  2643  		s.DailyRunTime = NewString("01:00")
  2644  	}
  2645  
  2646  	if s.ExportFromTimestamp == nil {
  2647  		s.ExportFromTimestamp = NewInt64(0)
  2648  	}
  2649  
  2650  	if s.BatchSize == nil {
  2651  		s.BatchSize = NewInt(10000)
  2652  	}
  2653  
  2654  	if s.GlobalRelaySettings == nil {
  2655  		s.GlobalRelaySettings = &GlobalRelayMessageExportSettings{}
  2656  	}
  2657  	s.GlobalRelaySettings.SetDefaults()
  2658  }
  2659  
  2660  type DisplaySettings struct {
  2661  	CustomUrlSchemes     []string
  2662  	ExperimentalTimezone *bool
  2663  }
  2664  
  2665  func (s *DisplaySettings) SetDefaults() {
  2666  	if s.CustomUrlSchemes == nil {
  2667  		customUrlSchemes := []string{}
  2668  		s.CustomUrlSchemes = customUrlSchemes
  2669  	}
  2670  
  2671  	if s.ExperimentalTimezone == nil {
  2672  		s.ExperimentalTimezone = NewBool(false)
  2673  	}
  2674  }
  2675  
  2676  type GuestAccountsSettings struct {
  2677  	Enable                           *bool
  2678  	AllowEmailAccounts               *bool
  2679  	EnforceMultifactorAuthentication *bool
  2680  	RestrictCreationToDomains        *string
  2681  }
  2682  
  2683  func (s *GuestAccountsSettings) SetDefaults() {
  2684  	if s.Enable == nil {
  2685  		s.Enable = NewBool(false)
  2686  	}
  2687  
  2688  	if s.AllowEmailAccounts == nil {
  2689  		s.AllowEmailAccounts = NewBool(true)
  2690  	}
  2691  
  2692  	if s.EnforceMultifactorAuthentication == nil {
  2693  		s.EnforceMultifactorAuthentication = NewBool(false)
  2694  	}
  2695  
  2696  	if s.RestrictCreationToDomains == nil {
  2697  		s.RestrictCreationToDomains = NewString("")
  2698  	}
  2699  }
  2700  
  2701  type ImageProxySettings struct {
  2702  	Enable                  *bool
  2703  	ImageProxyType          *string
  2704  	RemoteImageProxyURL     *string
  2705  	RemoteImageProxyOptions *string
  2706  }
  2707  
  2708  func (s *ImageProxySettings) SetDefaults(ss ServiceSettings) {
  2709  	if s.Enable == nil {
  2710  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyType == nil || *ss.DEPRECATED_DO_NOT_USE_ImageProxyType == "" {
  2711  			s.Enable = NewBool(false)
  2712  		} else {
  2713  			s.Enable = NewBool(true)
  2714  		}
  2715  	}
  2716  
  2717  	if s.ImageProxyType == nil {
  2718  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyType == nil || *ss.DEPRECATED_DO_NOT_USE_ImageProxyType == "" {
  2719  			s.ImageProxyType = NewString(IMAGE_PROXY_TYPE_LOCAL)
  2720  		} else {
  2721  			s.ImageProxyType = ss.DEPRECATED_DO_NOT_USE_ImageProxyType
  2722  		}
  2723  	}
  2724  
  2725  	if s.RemoteImageProxyURL == nil {
  2726  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyURL == nil {
  2727  			s.RemoteImageProxyURL = NewString("")
  2728  		} else {
  2729  			s.RemoteImageProxyURL = ss.DEPRECATED_DO_NOT_USE_ImageProxyURL
  2730  		}
  2731  	}
  2732  
  2733  	if s.RemoteImageProxyOptions == nil {
  2734  		if ss.DEPRECATED_DO_NOT_USE_ImageProxyOptions == nil {
  2735  			s.RemoteImageProxyOptions = NewString("")
  2736  		} else {
  2737  			s.RemoteImageProxyOptions = ss.DEPRECATED_DO_NOT_USE_ImageProxyOptions
  2738  		}
  2739  	}
  2740  }
  2741  
  2742  type ConfigFunc func() *Config
  2743  
  2744  type Config struct {
  2745  	ServiceSettings           ServiceSettings
  2746  	TeamSettings              TeamSettings
  2747  	ClientRequirements        ClientRequirements
  2748  	SqlSettings               SqlSettings
  2749  	LogSettings               LogSettings
  2750  	ExperimentalAuditSettings ExperimentalAuditSettings
  2751  	NotificationLogSettings   NotificationLogSettings
  2752  	PasswordSettings          PasswordSettings
  2753  	FileSettings              FileSettings
  2754  	EmailSettings             EmailSettings
  2755  	RateLimitSettings         RateLimitSettings
  2756  	PrivacySettings           PrivacySettings
  2757  	SupportSettings           SupportSettings
  2758  	AnnouncementSettings      AnnouncementSettings
  2759  	ThemeSettings             ThemeSettings
  2760  	GitLabSettings            SSOSettings
  2761  	GoogleSettings            SSOSettings
  2762  	Office365Settings         Office365Settings
  2763  	LdapSettings              LdapSettings
  2764  	ComplianceSettings        ComplianceSettings
  2765  	LocalizationSettings      LocalizationSettings
  2766  	SamlSettings              SamlSettings
  2767  	NativeAppSettings         NativeAppSettings
  2768  	ClusterSettings           ClusterSettings
  2769  	MetricsSettings           MetricsSettings
  2770  	ExperimentalSettings      ExperimentalSettings
  2771  	AnalyticsSettings         AnalyticsSettings
  2772  	ElasticsearchSettings     ElasticsearchSettings
  2773  	BleveSettings             BleveSettings
  2774  	DataRetentionSettings     DataRetentionSettings
  2775  	MessageExportSettings     MessageExportSettings
  2776  	JobSettings               JobSettings
  2777  	PluginSettings            PluginSettings
  2778  	DisplaySettings           DisplaySettings
  2779  	GuestAccountsSettings     GuestAccountsSettings
  2780  	ImageProxySettings        ImageProxySettings
  2781  }
  2782  
  2783  func (o *Config) Clone() *Config {
  2784  	var ret Config
  2785  	if err := json.Unmarshal([]byte(o.ToJson()), &ret); err != nil {
  2786  		panic(err)
  2787  	}
  2788  	return &ret
  2789  }
  2790  
  2791  func (o *Config) ToJson() string {
  2792  	b, _ := json.Marshal(o)
  2793  	return string(b)
  2794  }
  2795  
  2796  func (o *Config) GetSSOService(service string) *SSOSettings {
  2797  	switch service {
  2798  	case SERVICE_GITLAB:
  2799  		return &o.GitLabSettings
  2800  	case SERVICE_GOOGLE:
  2801  		return &o.GoogleSettings
  2802  	case SERVICE_OFFICE365:
  2803  		return o.Office365Settings.SSOSettings()
  2804  	}
  2805  
  2806  	return nil
  2807  }
  2808  
  2809  func ConfigFromJson(data io.Reader) *Config {
  2810  	var o *Config
  2811  	json.NewDecoder(data).Decode(&o)
  2812  	return o
  2813  }
  2814  
  2815  // isUpdate detects a pre-existing config based on whether SiteURL has been changed
  2816  func (o *Config) isUpdate() bool {
  2817  	return o.ServiceSettings.SiteURL != nil
  2818  }
  2819  
  2820  func (o *Config) SetDefaults() {
  2821  	isUpdate := o.isUpdate()
  2822  
  2823  	o.LdapSettings.SetDefaults()
  2824  	o.SamlSettings.SetDefaults()
  2825  
  2826  	if o.TeamSettings.TeammateNameDisplay == nil {
  2827  		o.TeamSettings.TeammateNameDisplay = NewString(SHOW_USERNAME)
  2828  
  2829  		if *o.SamlSettings.Enable || *o.LdapSettings.Enable {
  2830  			*o.TeamSettings.TeammateNameDisplay = SHOW_FULLNAME
  2831  		}
  2832  	}
  2833  
  2834  	o.SqlSettings.SetDefaults(isUpdate)
  2835  	o.FileSettings.SetDefaults(isUpdate)
  2836  	o.EmailSettings.SetDefaults(isUpdate)
  2837  	o.PrivacySettings.setDefaults()
  2838  	o.Office365Settings.setDefaults()
  2839  	o.GitLabSettings.setDefaults("", "", "", "")
  2840  	o.GoogleSettings.setDefaults(GOOGLE_SETTINGS_DEFAULT_SCOPE, GOOGLE_SETTINGS_DEFAULT_AUTH_ENDPOINT, GOOGLE_SETTINGS_DEFAULT_TOKEN_ENDPOINT, GOOGLE_SETTINGS_DEFAULT_USER_API_ENDPOINT)
  2841  	o.ServiceSettings.SetDefaults(isUpdate)
  2842  	o.PasswordSettings.SetDefaults()
  2843  	o.TeamSettings.SetDefaults()
  2844  	o.MetricsSettings.SetDefaults()
  2845  	o.ExperimentalSettings.SetDefaults()
  2846  	o.SupportSettings.SetDefaults()
  2847  	o.AnnouncementSettings.SetDefaults()
  2848  	o.ThemeSettings.SetDefaults()
  2849  	o.ClusterSettings.SetDefaults()
  2850  	o.PluginSettings.SetDefaults(o.LogSettings)
  2851  	o.AnalyticsSettings.SetDefaults()
  2852  	o.ComplianceSettings.SetDefaults()
  2853  	o.LocalizationSettings.SetDefaults()
  2854  	o.ElasticsearchSettings.SetDefaults()
  2855  	o.BleveSettings.SetDefaults()
  2856  	o.NativeAppSettings.SetDefaults()
  2857  	o.DataRetentionSettings.SetDefaults()
  2858  	o.RateLimitSettings.SetDefaults()
  2859  	o.LogSettings.SetDefaults()
  2860  	o.ExperimentalAuditSettings.SetDefaults()
  2861  	o.NotificationLogSettings.SetDefaults()
  2862  	o.JobSettings.SetDefaults()
  2863  	o.MessageExportSettings.SetDefaults()
  2864  	o.DisplaySettings.SetDefaults()
  2865  	o.GuestAccountsSettings.SetDefaults()
  2866  	o.ImageProxySettings.SetDefaults(o.ServiceSettings)
  2867  }
  2868  
  2869  func (o *Config) IsValid() *AppError {
  2870  	if len(*o.ServiceSettings.SiteURL) == 0 && *o.EmailSettings.EnableEmailBatching {
  2871  		return NewAppError("Config.IsValid", "model.config.is_valid.site_url_email_batching.app_error", nil, "", http.StatusBadRequest)
  2872  	}
  2873  
  2874  	if *o.ClusterSettings.Enable && *o.EmailSettings.EnableEmailBatching {
  2875  		return NewAppError("Config.IsValid", "model.config.is_valid.cluster_email_batching.app_error", nil, "", http.StatusBadRequest)
  2876  	}
  2877  
  2878  	if len(*o.ServiceSettings.SiteURL) == 0 && *o.ServiceSettings.AllowCookiesForSubdomains {
  2879  		return NewAppError("Config.IsValid", "model.config.is_valid.allow_cookies_for_subdomains.app_error", nil, "", http.StatusBadRequest)
  2880  	}
  2881  
  2882  	if err := o.TeamSettings.isValid(); err != nil {
  2883  		return err
  2884  	}
  2885  
  2886  	if err := o.SqlSettings.isValid(); err != nil {
  2887  		return err
  2888  	}
  2889  
  2890  	if err := o.FileSettings.isValid(); err != nil {
  2891  		return err
  2892  	}
  2893  
  2894  	if err := o.EmailSettings.isValid(); err != nil {
  2895  		return err
  2896  	}
  2897  
  2898  	if err := o.LdapSettings.isValid(); err != nil {
  2899  		return err
  2900  	}
  2901  
  2902  	if err := o.SamlSettings.isValid(); err != nil {
  2903  		return err
  2904  	}
  2905  
  2906  	if *o.PasswordSettings.MinimumLength < PASSWORD_MINIMUM_LENGTH || *o.PasswordSettings.MinimumLength > PASSWORD_MAXIMUM_LENGTH {
  2907  		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)
  2908  	}
  2909  
  2910  	if err := o.RateLimitSettings.isValid(); err != nil {
  2911  		return err
  2912  	}
  2913  
  2914  	if err := o.ServiceSettings.isValid(); err != nil {
  2915  		return err
  2916  	}
  2917  
  2918  	if err := o.ElasticsearchSettings.isValid(); err != nil {
  2919  		return err
  2920  	}
  2921  
  2922  	if err := o.BleveSettings.isValid(); err != nil {
  2923  		return err
  2924  	}
  2925  
  2926  	if err := o.DataRetentionSettings.isValid(); err != nil {
  2927  		return err
  2928  	}
  2929  
  2930  	if err := o.LocalizationSettings.isValid(); err != nil {
  2931  		return err
  2932  	}
  2933  
  2934  	if err := o.MessageExportSettings.isValid(o.FileSettings); err != nil {
  2935  		return err
  2936  	}
  2937  
  2938  	if err := o.DisplaySettings.isValid(); err != nil {
  2939  		return err
  2940  	}
  2941  
  2942  	if err := o.ImageProxySettings.isValid(); err != nil {
  2943  		return err
  2944  	}
  2945  	return nil
  2946  }
  2947  
  2948  func (s *TeamSettings) isValid() *AppError {
  2949  	if *s.MaxUsersPerTeam <= 0 {
  2950  		return NewAppError("Config.IsValid", "model.config.is_valid.max_users.app_error", nil, "", http.StatusBadRequest)
  2951  	}
  2952  
  2953  	if *s.MaxChannelsPerTeam <= 0 {
  2954  		return NewAppError("Config.IsValid", "model.config.is_valid.max_channels.app_error", nil, "", http.StatusBadRequest)
  2955  	}
  2956  
  2957  	if *s.MaxNotificationsPerChannel <= 0 {
  2958  		return NewAppError("Config.IsValid", "model.config.is_valid.max_notify_per_channel.app_error", nil, "", http.StatusBadRequest)
  2959  	}
  2960  
  2961  	if !(*s.RestrictDirectMessage == DIRECT_MESSAGE_ANY || *s.RestrictDirectMessage == DIRECT_MESSAGE_TEAM) {
  2962  		return NewAppError("Config.IsValid", "model.config.is_valid.restrict_direct_message.app_error", nil, "", http.StatusBadRequest)
  2963  	}
  2964  
  2965  	if !(*s.TeammateNameDisplay == SHOW_FULLNAME || *s.TeammateNameDisplay == SHOW_NICKNAME_FULLNAME || *s.TeammateNameDisplay == SHOW_USERNAME) {
  2966  		return NewAppError("Config.IsValid", "model.config.is_valid.teammate_name_display.app_error", nil, "", http.StatusBadRequest)
  2967  	}
  2968  
  2969  	if len(*s.SiteName) > SITENAME_MAX_LENGTH {
  2970  		return NewAppError("Config.IsValid", "model.config.is_valid.sitename_length.app_error", map[string]interface{}{"MaxLength": SITENAME_MAX_LENGTH}, "", http.StatusBadRequest)
  2971  	}
  2972  
  2973  	return nil
  2974  }
  2975  
  2976  func (s *SqlSettings) isValid() *AppError {
  2977  	if *s.AtRestEncryptKey != "" && len(*s.AtRestEncryptKey) < 32 {
  2978  		return NewAppError("Config.IsValid", "model.config.is_valid.encrypt_sql.app_error", nil, "", http.StatusBadRequest)
  2979  	}
  2980  
  2981  	if !(*s.DriverName == DATABASE_DRIVER_MYSQL || *s.DriverName == DATABASE_DRIVER_POSTGRES) {
  2982  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_driver.app_error", nil, "", http.StatusBadRequest)
  2983  	}
  2984  
  2985  	if *s.MaxIdleConns <= 0 {
  2986  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_idle.app_error", nil, "", http.StatusBadRequest)
  2987  	}
  2988  
  2989  	if *s.ConnMaxLifetimeMilliseconds < 0 {
  2990  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_conn_max_lifetime_milliseconds.app_error", nil, "", http.StatusBadRequest)
  2991  	}
  2992  
  2993  	if *s.QueryTimeout <= 0 {
  2994  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_query_timeout.app_error", nil, "", http.StatusBadRequest)
  2995  	}
  2996  
  2997  	if len(*s.DataSource) == 0 {
  2998  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_data_src.app_error", nil, "", http.StatusBadRequest)
  2999  	}
  3000  
  3001  	if *s.MaxOpenConns <= 0 {
  3002  		return NewAppError("Config.IsValid", "model.config.is_valid.sql_max_conn.app_error", nil, "", http.StatusBadRequest)
  3003  	}
  3004  
  3005  	return nil
  3006  }
  3007  
  3008  func (s *FileSettings) isValid() *AppError {
  3009  	if *s.MaxFileSize <= 0 {
  3010  		return NewAppError("Config.IsValid", "model.config.is_valid.max_file_size.app_error", nil, "", http.StatusBadRequest)
  3011  	}
  3012  
  3013  	if !(*s.DriverName == IMAGE_DRIVER_LOCAL || *s.DriverName == IMAGE_DRIVER_S3) {
  3014  		return NewAppError("Config.IsValid", "model.config.is_valid.file_driver.app_error", nil, "", http.StatusBadRequest)
  3015  	}
  3016  
  3017  	if *s.PublicLinkSalt != "" && len(*s.PublicLinkSalt) < 32 {
  3018  		return NewAppError("Config.IsValid", "model.config.is_valid.file_salt.app_error", nil, "", http.StatusBadRequest)
  3019  	}
  3020  
  3021  	if *s.Directory == "" {
  3022  		return NewAppError("Config.IsValid", "model.config.is_valid.directory.app_error", nil, "", http.StatusBadRequest)
  3023  	}
  3024  
  3025  	return nil
  3026  }
  3027  
  3028  func (s *EmailSettings) isValid() *AppError {
  3029  	if !(*s.ConnectionSecurity == CONN_SECURITY_NONE || *s.ConnectionSecurity == CONN_SECURITY_TLS || *s.ConnectionSecurity == CONN_SECURITY_STARTTLS || *s.ConnectionSecurity == CONN_SECURITY_PLAIN) {
  3030  		return NewAppError("Config.IsValid", "model.config.is_valid.email_security.app_error", nil, "", http.StatusBadRequest)
  3031  	}
  3032  
  3033  	if *s.EmailBatchingBufferSize <= 0 {
  3034  		return NewAppError("Config.IsValid", "model.config.is_valid.email_batching_buffer_size.app_error", nil, "", http.StatusBadRequest)
  3035  	}
  3036  
  3037  	if *s.EmailBatchingInterval < 30 {
  3038  		return NewAppError("Config.IsValid", "model.config.is_valid.email_batching_interval.app_error", nil, "", http.StatusBadRequest)
  3039  	}
  3040  
  3041  	if !(*s.EmailNotificationContentsType == EMAIL_NOTIFICATION_CONTENTS_FULL || *s.EmailNotificationContentsType == EMAIL_NOTIFICATION_CONTENTS_GENERIC) {
  3042  		return NewAppError("Config.IsValid", "model.config.is_valid.email_notification_contents_type.app_error", nil, "", http.StatusBadRequest)
  3043  	}
  3044  
  3045  	return nil
  3046  }
  3047  
  3048  func (s *RateLimitSettings) isValid() *AppError {
  3049  	if *s.MemoryStoreSize <= 0 {
  3050  		return NewAppError("Config.IsValid", "model.config.is_valid.rate_mem.app_error", nil, "", http.StatusBadRequest)
  3051  	}
  3052  
  3053  	if *s.PerSec <= 0 {
  3054  		return NewAppError("Config.IsValid", "model.config.is_valid.rate_sec.app_error", nil, "", http.StatusBadRequest)
  3055  	}
  3056  
  3057  	if *s.MaxBurst <= 0 {
  3058  		return NewAppError("Config.IsValid", "model.config.is_valid.max_burst.app_error", nil, "", http.StatusBadRequest)
  3059  	}
  3060  
  3061  	return nil
  3062  }
  3063  
  3064  func (s *LdapSettings) isValid() *AppError {
  3065  	if !(*s.ConnectionSecurity == CONN_SECURITY_NONE || *s.ConnectionSecurity == CONN_SECURITY_TLS || *s.ConnectionSecurity == CONN_SECURITY_STARTTLS) {
  3066  		return NewAppError("Config.IsValid", "model.config.is_valid.ldap_security.app_error", nil, "", http.StatusBadRequest)
  3067  	}
  3068  
  3069  	if *s.SyncIntervalMinutes <= 0 {
  3070  		return NewAppError("Config.IsValid", "model.config.is_valid.ldap_sync_interval.app_error", nil, "", http.StatusBadRequest)
  3071  	}
  3072  
  3073  	if *s.MaxPageSize < 0 {
  3074  		return NewAppError("Config.IsValid", "model.config.is_valid.ldap_max_page_size.app_error", nil, "", http.StatusBadRequest)
  3075  	}
  3076  
  3077  	if *s.Enable {
  3078  		if *s.LdapServer == "" {
  3079  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_server", nil, "", http.StatusBadRequest)
  3080  		}
  3081  
  3082  		if *s.BaseDN == "" {
  3083  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_basedn", nil, "", http.StatusBadRequest)
  3084  		}
  3085  
  3086  		if *s.EmailAttribute == "" {
  3087  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_email", nil, "", http.StatusBadRequest)
  3088  		}
  3089  
  3090  		if *s.UsernameAttribute == "" {
  3091  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_username", nil, "", http.StatusBadRequest)
  3092  		}
  3093  
  3094  		if *s.IdAttribute == "" {
  3095  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_id", nil, "", http.StatusBadRequest)
  3096  		}
  3097  
  3098  		if *s.LoginIdAttribute == "" {
  3099  			return NewAppError("Config.IsValid", "model.config.is_valid.ldap_login_id", nil, "", http.StatusBadRequest)
  3100  		}
  3101  
  3102  		if *s.UserFilter != "" {
  3103  			if _, err := ldap.CompileFilter(*s.UserFilter); err != nil {
  3104  				return NewAppError("ValidateFilter", "ent.ldap.validate_filter.app_error", nil, err.Error(), http.StatusBadRequest)
  3105  			}
  3106  		}
  3107  
  3108  		if *s.GuestFilter != "" {
  3109  			if _, err := ldap.CompileFilter(*s.GuestFilter); err != nil {
  3110  				return NewAppError("LdapSettings.isValid", "ent.ldap.validate_guest_filter.app_error", nil, err.Error(), http.StatusBadRequest)
  3111  			}
  3112  		}
  3113  
  3114  		if *s.AdminFilter != "" {
  3115  			if _, err := ldap.CompileFilter(*s.AdminFilter); err != nil {
  3116  				return NewAppError("LdapSettings.isValid", "ent.ldap.validate_admin_filter.app_error", nil, err.Error(), http.StatusBadRequest)
  3117  			}
  3118  		}
  3119  	}
  3120  
  3121  	return nil
  3122  }
  3123  
  3124  func (s *SamlSettings) isValid() *AppError {
  3125  	if *s.Enable {
  3126  		if len(*s.IdpUrl) == 0 || !IsValidHttpUrl(*s.IdpUrl) {
  3127  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_idp_url.app_error", nil, "", http.StatusBadRequest)
  3128  		}
  3129  
  3130  		if len(*s.IdpDescriptorUrl) == 0 || !IsValidHttpUrl(*s.IdpDescriptorUrl) {
  3131  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_idp_descriptor_url.app_error", nil, "", http.StatusBadRequest)
  3132  		}
  3133  
  3134  		if len(*s.IdpCertificateFile) == 0 {
  3135  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_idp_cert.app_error", nil, "", http.StatusBadRequest)
  3136  		}
  3137  
  3138  		if len(*s.EmailAttribute) == 0 {
  3139  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_email_attribute.app_error", nil, "", http.StatusBadRequest)
  3140  		}
  3141  
  3142  		if len(*s.UsernameAttribute) == 0 {
  3143  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_username_attribute.app_error", nil, "", http.StatusBadRequest)
  3144  		}
  3145  
  3146  		if len(*s.ServiceProviderIdentifier) == 0 {
  3147  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_spidentifier_attribute.app_error", nil, "", http.StatusBadRequest)
  3148  		}
  3149  
  3150  		if *s.Verify {
  3151  			if len(*s.AssertionConsumerServiceURL) == 0 || !IsValidHttpUrl(*s.AssertionConsumerServiceURL) {
  3152  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_assertion_consumer_service_url.app_error", nil, "", http.StatusBadRequest)
  3153  			}
  3154  		}
  3155  
  3156  		if *s.Encrypt {
  3157  			if len(*s.PrivateKeyFile) == 0 {
  3158  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_private_key.app_error", nil, "", http.StatusBadRequest)
  3159  			}
  3160  
  3161  			if len(*s.PublicCertificateFile) == 0 {
  3162  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_public_cert.app_error", nil, "", http.StatusBadRequest)
  3163  			}
  3164  		}
  3165  
  3166  		if len(*s.EmailAttribute) == 0 {
  3167  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_email_attribute.app_error", nil, "", http.StatusBadRequest)
  3168  		}
  3169  
  3170  		if !(*s.SignatureAlgorithm == SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA1 || *s.SignatureAlgorithm == SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA256 || *s.SignatureAlgorithm == SAML_SETTINGS_SIGNATURE_ALGORITHM_SHA512) {
  3171  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_signature_algorithm.app_error", nil, "", http.StatusBadRequest)
  3172  		}
  3173  		if !(*s.CanonicalAlgorithm == SAML_SETTINGS_CANONICAL_ALGORITHM_C14N || *s.CanonicalAlgorithm == SAML_SETTINGS_CANONICAL_ALGORITHM_C14N11) {
  3174  			return NewAppError("Config.IsValid", "model.config.is_valid.saml_canonical_algorithm.app_error", nil, "", http.StatusBadRequest)
  3175  		}
  3176  
  3177  		if len(*s.GuestAttribute) > 0 {
  3178  			if !(strings.Contains(*s.GuestAttribute, "=")) {
  3179  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_guest_attribute.app_error", nil, "", http.StatusBadRequest)
  3180  			}
  3181  			if len(strings.Split(*s.GuestAttribute, "=")) != 2 {
  3182  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_guest_attribute.app_error", nil, "", http.StatusBadRequest)
  3183  			}
  3184  		}
  3185  
  3186  		if len(*s.AdminAttribute) > 0 {
  3187  			if !(strings.Contains(*s.AdminAttribute, "=")) {
  3188  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_admin_attribute.app_error", nil, "", http.StatusBadRequest)
  3189  			}
  3190  			if len(strings.Split(*s.AdminAttribute, "=")) != 2 {
  3191  				return NewAppError("Config.IsValid", "model.config.is_valid.saml_admin_attribute.app_error", nil, "", http.StatusBadRequest)
  3192  			}
  3193  		}
  3194  	}
  3195  
  3196  	return nil
  3197  }
  3198  
  3199  func (s *ServiceSettings) isValid() *AppError {
  3200  	if !(*s.ConnectionSecurity == CONN_SECURITY_NONE || *s.ConnectionSecurity == CONN_SECURITY_TLS) {
  3201  		return NewAppError("Config.IsValid", "model.config.is_valid.webserver_security.app_error", nil, "", http.StatusBadRequest)
  3202  	}
  3203  
  3204  	if *s.ConnectionSecurity == CONN_SECURITY_TLS && !*s.UseLetsEncrypt {
  3205  		appErr := NewAppError("Config.IsValid", "model.config.is_valid.tls_cert_file.app_error", nil, "", http.StatusBadRequest)
  3206  
  3207  		if *s.TLSCertFile == "" {
  3208  			return appErr
  3209  		} else if _, err := os.Stat(*s.TLSCertFile); os.IsNotExist(err) {
  3210  			return appErr
  3211  		}
  3212  
  3213  		appErr = NewAppError("Config.IsValid", "model.config.is_valid.tls_key_file.app_error", nil, "", http.StatusBadRequest)
  3214  
  3215  		if *s.TLSKeyFile == "" {
  3216  			return appErr
  3217  		} else if _, err := os.Stat(*s.TLSKeyFile); os.IsNotExist(err) {
  3218  			return appErr
  3219  		}
  3220  	}
  3221  
  3222  	if len(s.TLSOverwriteCiphers) > 0 {
  3223  		for _, cipher := range s.TLSOverwriteCiphers {
  3224  			if _, ok := ServerTLSSupportedCiphers[cipher]; !ok {
  3225  				return NewAppError("Config.IsValid", "model.config.is_valid.tls_overwrite_cipher.app_error", map[string]interface{}{"name": cipher}, "", http.StatusBadRequest)
  3226  			}
  3227  		}
  3228  	}
  3229  
  3230  	if *s.ReadTimeout <= 0 {
  3231  		return NewAppError("Config.IsValid", "model.config.is_valid.read_timeout.app_error", nil, "", http.StatusBadRequest)
  3232  	}
  3233  
  3234  	if *s.WriteTimeout <= 0 {
  3235  		return NewAppError("Config.IsValid", "model.config.is_valid.write_timeout.app_error", nil, "", http.StatusBadRequest)
  3236  	}
  3237  
  3238  	if *s.TimeBetweenUserTypingUpdatesMilliseconds < 1000 {
  3239  		return NewAppError("Config.IsValid", "model.config.is_valid.time_between_user_typing.app_error", nil, "", http.StatusBadRequest)
  3240  	}
  3241  
  3242  	if *s.MaximumLoginAttempts <= 0 {
  3243  		return NewAppError("Config.IsValid", "model.config.is_valid.login_attempts.app_error", nil, "", http.StatusBadRequest)
  3244  	}
  3245  
  3246  	if len(*s.SiteURL) != 0 {
  3247  		if _, err := url.ParseRequestURI(*s.SiteURL); err != nil {
  3248  			return NewAppError("Config.IsValid", "model.config.is_valid.site_url.app_error", nil, "", http.StatusBadRequest)
  3249  		}
  3250  	}
  3251  
  3252  	if len(*s.WebsocketURL) != 0 {
  3253  		if _, err := url.ParseRequestURI(*s.WebsocketURL); err != nil {
  3254  			return NewAppError("Config.IsValid", "model.config.is_valid.websocket_url.app_error", nil, "", http.StatusBadRequest)
  3255  		}
  3256  	}
  3257  
  3258  	host, port, _ := net.SplitHostPort(*s.ListenAddress)
  3259  	var isValidHost bool
  3260  	if host == "" {
  3261  		isValidHost = true
  3262  	} else {
  3263  		isValidHost = (net.ParseIP(host) != nil) || IsDomainName(host)
  3264  	}
  3265  	portInt, err := strconv.Atoi(port)
  3266  	if err != nil || !isValidHost || portInt < 0 || portInt > math.MaxUint16 {
  3267  		return NewAppError("Config.IsValid", "model.config.is_valid.listen_address.app_error", nil, "", http.StatusBadRequest)
  3268  	}
  3269  
  3270  	if *s.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DISABLED &&
  3271  		*s.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DEFAULT_ON &&
  3272  		*s.ExperimentalGroupUnreadChannels != GROUP_UNREAD_CHANNELS_DEFAULT_OFF {
  3273  		return NewAppError("Config.IsValid", "model.config.is_valid.group_unread_channels.app_error", nil, "", http.StatusBadRequest)
  3274  	}
  3275  
  3276  	return nil
  3277  }
  3278  
  3279  func (s *ElasticsearchSettings) isValid() *AppError {
  3280  	if *s.EnableIndexing {
  3281  		if len(*s.ConnectionUrl) == 0 {
  3282  			return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.connection_url.app_error", nil, "", http.StatusBadRequest)
  3283  		}
  3284  	}
  3285  
  3286  	if *s.EnableSearching && !*s.EnableIndexing {
  3287  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.enable_searching.app_error", nil, "", http.StatusBadRequest)
  3288  	}
  3289  
  3290  	if *s.EnableAutocomplete && !*s.EnableIndexing {
  3291  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.enable_autocomplete.app_error", nil, "", http.StatusBadRequest)
  3292  	}
  3293  
  3294  	if *s.AggregatePostsAfterDays < 1 {
  3295  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.aggregate_posts_after_days.app_error", nil, "", http.StatusBadRequest)
  3296  	}
  3297  
  3298  	if _, err := time.Parse("15:04", *s.PostsAggregatorJobStartTime); err != nil {
  3299  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.posts_aggregator_job_start_time.app_error", nil, err.Error(), http.StatusBadRequest)
  3300  	}
  3301  
  3302  	if *s.LiveIndexingBatchSize < 1 {
  3303  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.live_indexing_batch_size.app_error", nil, "", http.StatusBadRequest)
  3304  	}
  3305  
  3306  	if *s.BulkIndexingTimeWindowSeconds < 1 {
  3307  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.bulk_indexing_time_window_seconds.app_error", nil, "", http.StatusBadRequest)
  3308  	}
  3309  
  3310  	if *s.RequestTimeoutSeconds < 1 {
  3311  		return NewAppError("Config.IsValid", "model.config.is_valid.elastic_search.request_timeout_seconds.app_error", nil, "", http.StatusBadRequest)
  3312  	}
  3313  
  3314  	return nil
  3315  }
  3316  
  3317  func (bs *BleveSettings) isValid() *AppError {
  3318  	if *bs.EnableIndexing {
  3319  		if len(*bs.IndexDir) == 0 {
  3320  			return NewAppError("Config.IsValid", "model.config.is_valid.bleve_search.filename.app_error", nil, "", http.StatusBadRequest)
  3321  		}
  3322  	} else {
  3323  		if *bs.EnableSearching {
  3324  			return NewAppError("Config.IsValid", "model.config.is_valid.bleve_search.enable_searching.app_error", nil, "", http.StatusBadRequest)
  3325  		}
  3326  		if *bs.EnableAutocomplete {
  3327  			return NewAppError("Config.IsValid", "model.config.is_valid.bleve_search.enable_autocomplete.app_error", nil, "", http.StatusBadRequest)
  3328  		}
  3329  	}
  3330  	if *bs.BulkIndexingTimeWindowSeconds < 1 {
  3331  		return NewAppError("Config.IsValid", "model.config.is_valid.bleve_search.bulk_indexing_time_window_seconds.app_error", nil, "", http.StatusBadRequest)
  3332  	}
  3333  
  3334  	return nil
  3335  }
  3336  
  3337  func (s *DataRetentionSettings) isValid() *AppError {
  3338  	if *s.MessageRetentionDays <= 0 {
  3339  		return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.message_retention_days_too_low.app_error", nil, "", http.StatusBadRequest)
  3340  	}
  3341  
  3342  	if *s.FileRetentionDays <= 0 {
  3343  		return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.file_retention_days_too_low.app_error", nil, "", http.StatusBadRequest)
  3344  	}
  3345  
  3346  	if _, err := time.Parse("15:04", *s.DeletionJobStartTime); err != nil {
  3347  		return NewAppError("Config.IsValid", "model.config.is_valid.data_retention.deletion_job_start_time.app_error", nil, err.Error(), http.StatusBadRequest)
  3348  	}
  3349  
  3350  	return nil
  3351  }
  3352  
  3353  func (s *LocalizationSettings) isValid() *AppError {
  3354  	if len(*s.AvailableLocales) > 0 {
  3355  		if !strings.Contains(*s.AvailableLocales, *s.DefaultClientLocale) {
  3356  			return NewAppError("Config.IsValid", "model.config.is_valid.localization.available_locales.app_error", nil, "", http.StatusBadRequest)
  3357  		}
  3358  	}
  3359  
  3360  	return nil
  3361  }
  3362  
  3363  func (s *MessageExportSettings) isValid(fs FileSettings) *AppError {
  3364  	if s.EnableExport == nil {
  3365  		return NewAppError("Config.IsValid", "model.config.is_valid.message_export.enable.app_error", nil, "", http.StatusBadRequest)
  3366  	}
  3367  	if *s.EnableExport {
  3368  		if s.ExportFromTimestamp == nil || *s.ExportFromTimestamp < 0 || *s.ExportFromTimestamp > GetMillis() {
  3369  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.export_from.app_error", nil, "", http.StatusBadRequest)
  3370  		} else if s.DailyRunTime == nil {
  3371  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.daily_runtime.app_error", nil, "", http.StatusBadRequest)
  3372  		} else if _, err := time.Parse("15:04", *s.DailyRunTime); err != nil {
  3373  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.daily_runtime.app_error", nil, err.Error(), http.StatusBadRequest)
  3374  		} else if s.BatchSize == nil || *s.BatchSize < 0 {
  3375  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.batch_size.app_error", nil, "", http.StatusBadRequest)
  3376  		} else if s.ExportFormat == nil || (*s.ExportFormat != COMPLIANCE_EXPORT_TYPE_ACTIANCE && *s.ExportFormat != COMPLIANCE_EXPORT_TYPE_GLOBALRELAY && *s.ExportFormat != COMPLIANCE_EXPORT_TYPE_CSV) {
  3377  			return NewAppError("Config.IsValid", "model.config.is_valid.message_export.export_type.app_error", nil, "", http.StatusBadRequest)
  3378  		}
  3379  
  3380  		if *s.ExportFormat == COMPLIANCE_EXPORT_TYPE_GLOBALRELAY {
  3381  			if s.GlobalRelaySettings == nil {
  3382  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.config_missing.app_error", nil, "", http.StatusBadRequest)
  3383  			} else if s.GlobalRelaySettings.CustomerType == nil || (*s.GlobalRelaySettings.CustomerType != GLOBALRELAY_CUSTOMER_TYPE_A9 && *s.GlobalRelaySettings.CustomerType != GLOBALRELAY_CUSTOMER_TYPE_A10) {
  3384  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.customer_type.app_error", nil, "", http.StatusBadRequest)
  3385  			} else if s.GlobalRelaySettings.EmailAddress == nil || !strings.Contains(*s.GlobalRelaySettings.EmailAddress, "@") {
  3386  				// validating email addresses is hard - just make sure it contains an '@' sign
  3387  				// see https://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address
  3388  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.email_address.app_error", nil, "", http.StatusBadRequest)
  3389  			} else if s.GlobalRelaySettings.SmtpUsername == nil || *s.GlobalRelaySettings.SmtpUsername == "" {
  3390  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.smtp_username.app_error", nil, "", http.StatusBadRequest)
  3391  			} else if s.GlobalRelaySettings.SmtpPassword == nil || *s.GlobalRelaySettings.SmtpPassword == "" {
  3392  				return NewAppError("Config.IsValid", "model.config.is_valid.message_export.global_relay.smtp_password.app_error", nil, "", http.StatusBadRequest)
  3393  			}
  3394  		}
  3395  	}
  3396  	return nil
  3397  }
  3398  
  3399  func (s *DisplaySettings) isValid() *AppError {
  3400  	if len(s.CustomUrlSchemes) != 0 {
  3401  		validProtocolPattern := regexp.MustCompile(`(?i)^\s*[A-Za-z][A-Za-z0-9.+-]*\s*$`)
  3402  
  3403  		for _, scheme := range s.CustomUrlSchemes {
  3404  			if !validProtocolPattern.MatchString(scheme) {
  3405  				return NewAppError(
  3406  					"Config.IsValid",
  3407  					"model.config.is_valid.display.custom_url_schemes.app_error",
  3408  					map[string]interface{}{"Scheme": scheme},
  3409  					"",
  3410  					http.StatusBadRequest,
  3411  				)
  3412  			}
  3413  		}
  3414  	}
  3415  
  3416  	return nil
  3417  }
  3418  
  3419  func (s *ImageProxySettings) isValid() *AppError {
  3420  	if *s.Enable {
  3421  		switch *s.ImageProxyType {
  3422  		case IMAGE_PROXY_TYPE_LOCAL:
  3423  			// No other settings to validate
  3424  		case IMAGE_PROXY_TYPE_ATMOS_CAMO:
  3425  			if *s.RemoteImageProxyURL == "" {
  3426  				return NewAppError("Config.IsValid", "model.config.is_valid.atmos_camo_image_proxy_url.app_error", nil, "", http.StatusBadRequest)
  3427  			}
  3428  
  3429  			if *s.RemoteImageProxyOptions == "" {
  3430  				return NewAppError("Config.IsValid", "model.config.is_valid.atmos_camo_image_proxy_options.app_error", nil, "", http.StatusBadRequest)
  3431  			}
  3432  		default:
  3433  			return NewAppError("Config.IsValid", "model.config.is_valid.image_proxy_type.app_error", nil, "", http.StatusBadRequest)
  3434  		}
  3435  	}
  3436  
  3437  	return nil
  3438  }
  3439  
  3440  func (o *Config) GetSanitizeOptions() map[string]bool {
  3441  	options := map[string]bool{}
  3442  	options["fullname"] = *o.PrivacySettings.ShowFullName
  3443  	options["email"] = *o.PrivacySettings.ShowEmailAddress
  3444  
  3445  	return options
  3446  }
  3447  
  3448  func (o *Config) Sanitize() {
  3449  	if o.LdapSettings.BindPassword != nil && len(*o.LdapSettings.BindPassword) > 0 {
  3450  		*o.LdapSettings.BindPassword = FAKE_SETTING
  3451  	}
  3452  
  3453  	*o.FileSettings.PublicLinkSalt = FAKE_SETTING
  3454  
  3455  	if len(*o.FileSettings.AmazonS3SecretAccessKey) > 0 {
  3456  		*o.FileSettings.AmazonS3SecretAccessKey = FAKE_SETTING
  3457  	}
  3458  
  3459  	if o.EmailSettings.SMTPPassword != nil && len(*o.EmailSettings.SMTPPassword) > 0 {
  3460  		*o.EmailSettings.SMTPPassword = FAKE_SETTING
  3461  	}
  3462  
  3463  	if len(*o.GitLabSettings.Secret) > 0 {
  3464  		*o.GitLabSettings.Secret = FAKE_SETTING
  3465  	}
  3466  
  3467  	*o.SqlSettings.DataSource = FAKE_SETTING
  3468  	*o.SqlSettings.AtRestEncryptKey = FAKE_SETTING
  3469  
  3470  	*o.ElasticsearchSettings.Password = FAKE_SETTING
  3471  
  3472  	for i := range o.SqlSettings.DataSourceReplicas {
  3473  		o.SqlSettings.DataSourceReplicas[i] = FAKE_SETTING
  3474  	}
  3475  
  3476  	for i := range o.SqlSettings.DataSourceSearchReplicas {
  3477  		o.SqlSettings.DataSourceSearchReplicas[i] = FAKE_SETTING
  3478  	}
  3479  }