focalboard/server/services/config/config.go
Doug Lauder 75bd409ba0
Notifications phase 1 (#1851)
Backend support for subscribing/unsubscribing to blocks, typically cards and boards. Notifies subscribers when changes are made to cards they are subscribed to.
2021-12-10 10:46:37 -05:00

127 lines
5.4 KiB
Go

package config
import (
"log"
"github.com/spf13/viper"
)
const (
DefaultServerRoot = "http://localhost:8000"
DefaultPort = 8000
)
type AmazonS3Config struct {
AccessKeyID string
SecretAccessKey string
Bucket string
PathPrefix string
Region string
Endpoint string
SSL bool
SignV2 bool
SSE bool
Trace bool
}
// Configuration is the app configuration stored in a json file.
type Configuration struct {
ServerRoot string `json:"serverRoot" mapstructure:"serverRoot"`
Port int `json:"port" mapstructure:"port"`
DBType string `json:"dbtype" mapstructure:"dbtype"`
DBConfigString string `json:"dbconfig" mapstructure:"dbconfig"`
DBTablePrefix string `json:"dbtableprefix" mapstructure:"dbtableprefix"`
UseSSL bool `json:"useSSL" mapstructure:"useSSL"`
SecureCookie bool `json:"secureCookie" mapstructure:"secureCookie"`
WebPath string `json:"webpath" mapstructure:"webpath"`
FilesDriver string `json:"filesdriver" mapstructure:"filesdriver"`
FilesS3Config AmazonS3Config `json:"filess3config" mapstructure:"filess3config"`
FilesPath string `json:"filespath" mapstructure:"filespath"`
Telemetry bool `json:"telemetry" mapstructure:"telemetry"`
TelemetryID string `json:"telemetryid" mapstructure:"telemetryid"`
PrometheusAddress string `json:"prometheus_address" mapstructure:"prometheus_address"`
WebhookUpdate []string `json:"webhook_update" mapstructure:"webhook_update"`
Secret string `json:"secret" mapstructure:"secret"`
SessionExpireTime int64 `json:"session_expire_time" mapstructure:"session_expire_time"`
SessionRefreshTime int64 `json:"session_refresh_time" mapstructure:"session_refresh_time"`
LocalOnly bool `json:"localonly" mapstructure:"localonly"`
EnableLocalMode bool `json:"enableLocalMode" mapstructure:"enableLocalMode"`
LocalModeSocketLocation string `json:"localModeSocketLocation" mapstructure:"localModeSocketLocation"`
EnablePublicSharedBoards bool `json:"enablePublicSharedBoards" mapstructure:"enablePublicSharedBoards"`
FeatureFlags map[string]string `json:"featureFlags" mapstructure:"featureFlags"`
AuthMode string `json:"authMode" mapstructure:"authMode"`
LoggingCfgFile string `json:"logging_cfg_file" mapstructure:"logging_cfg_file"`
LoggingCfgJSON string `json:"logging_cfg_json" mapstructure:"logging_cfg_json"`
AuditCfgFile string `json:"audit_cfg_file" mapstructure:"audit_cfg_file"`
AuditCfgJSON string `json:"audit_cfg_json" mapstructure:"audit_cfg_json"`
NotifyFreqCardSeconds int `json:"notify_freq_card_seconds" mapstructure:"notify_freq_card_seconds"`
NotifyFreqBoardSeconds int `json:"notify_freq_board_seconds" mapstructure:"notify_freq_board_seconds"`
}
// IsSubscriptionsEnabled returns true if the block change notification subscription service should be enabled.
func (c *Configuration) IsSubscriptionsEnabled() bool {
if enabled, ok := c.FeatureFlags["subscriptions"]; ok && enabled == "true" {
return true
}
return false
}
// ReadConfigFile read the configuration from the filesystem.
func ReadConfigFile(configFilePath string) (*Configuration, error) {
if configFilePath == "" {
viper.SetConfigFile("./config.json")
} else {
viper.SetConfigFile(configFilePath)
}
viper.SetEnvPrefix("focalboard")
viper.AutomaticEnv() // read config values from env like FOCALBOARD_SERVERROOT=...
viper.SetDefault("ServerRoot", DefaultServerRoot)
viper.SetDefault("Port", DefaultPort)
viper.SetDefault("DBType", "sqlite3")
viper.SetDefault("DBConfigString", "./focalboard.db")
viper.SetDefault("DBTablePrefix", "")
viper.SetDefault("SecureCookie", false)
viper.SetDefault("WebPath", "./pack")
viper.SetDefault("FilesPath", "./files")
viper.SetDefault("FilesDriver", "local")
viper.SetDefault("Telemetry", true)
viper.SetDefault("TelemetryID", "")
viper.SetDefault("WebhookUpdate", nil)
viper.SetDefault("SessionExpireTime", 60*60*24*30) // 30 days session lifetime
viper.SetDefault("SessionRefreshTime", 60*60*5) // 5 minutes session refresh
viper.SetDefault("LocalOnly", false)
viper.SetDefault("EnableLocalMode", false)
viper.SetDefault("LocalModeSocketLocation", "/var/tmp/focalboard_local.socket")
viper.SetDefault("EnablePublicSharedBoards", false)
viper.SetDefault("FeatureFlags", map[string]string{})
viper.SetDefault("AuthMode", "native")
viper.SetDefault("NotifyFreqCardSeconds", 120) // 2 minutes after last card edit
viper.SetDefault("NotifyFreqBoardSeconds", 86400) // 1 day after last card edit
err := viper.ReadInConfig() // Find and read the config file
if err != nil { // Handle errors reading the config file
return nil, err
}
configuration := Configuration{}
err = viper.Unmarshal(&configuration)
if err != nil {
return nil, err
}
log.Println("readConfigFile")
log.Printf("%+v", removeSecurityData(configuration))
return &configuration, nil
}
func removeSecurityData(config Configuration) Configuration {
clean := config
return clean
}