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 }