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