116 lines
2.9 KiB
Go
116 lines
2.9 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
)
|
|
|
|
func (cfg *Config) ApplyOverrides(overrides map[string]string) error {
|
|
if !cfg.AllowAdminSettingsOverride {
|
|
return nil
|
|
}
|
|
for key, value := range overrides {
|
|
if err := cfg.ApplyOverride(key, value); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (cfg *Config) ApplyOverride(key string, value string) error {
|
|
def, ok := Definition(key)
|
|
if !ok {
|
|
return fmt.Errorf("unknown setting %q", key)
|
|
}
|
|
if !def.Editable || def.HardLimit {
|
|
return fmt.Errorf("setting %q cannot be changed from the admin UI", key)
|
|
}
|
|
|
|
switch def.Type {
|
|
case SettingTypeBool:
|
|
parsed, err := parseBool(value)
|
|
if err != nil {
|
|
return fmt.Errorf("%s: %w", key, err)
|
|
}
|
|
cfg.assignBool(key, parsed, SourceDB)
|
|
case SettingTypeInt64:
|
|
parsed, err := parseInt64(value, def.Minimum)
|
|
if err != nil {
|
|
return fmt.Errorf("%s: %w", key, err)
|
|
}
|
|
cfg.assignInt64(key, parsed, SourceDB)
|
|
case SettingTypeInt:
|
|
parsed64, err := parseInt64(value, def.Minimum)
|
|
if err != nil {
|
|
return fmt.Errorf("%s: %w", key, err)
|
|
}
|
|
cfg.assignInt(key, int(parsed64), SourceDB)
|
|
default:
|
|
return fmt.Errorf("setting %q is not runtime editable", key)
|
|
}
|
|
return nil
|
|
}
|
|
func (cfg *Config) assignBool(key string, value bool, source Source) {
|
|
switch key {
|
|
case SettingGuestUploadsEnabled:
|
|
cfg.GuestUploadsEnabled = value
|
|
case SettingAPIEnabled:
|
|
cfg.APIEnabled = value
|
|
case SettingZipDownloadsEnabled:
|
|
cfg.ZipDownloadsEnabled = value
|
|
case SettingOneTimeDownloadsEnabled:
|
|
cfg.OneTimeDownloadsEnabled = value
|
|
case SettingRenewOnAccessEnabled:
|
|
cfg.RenewOnAccessEnabled = value
|
|
case SettingRenewOnDownloadEnabled:
|
|
cfg.RenewOnDownloadEnabled = value
|
|
}
|
|
cfg.setValue(key, formatBool(value), source)
|
|
}
|
|
|
|
func (cfg *Config) assignInt64(key string, value int64, source Source) {
|
|
switch key {
|
|
case SettingDefaultGuestExpirySecs:
|
|
cfg.DefaultGuestExpirySeconds = value
|
|
case SettingMaxGuestExpirySecs:
|
|
cfg.MaxGuestExpirySeconds = value
|
|
case SettingOneTimeDownloadExpirySecs:
|
|
cfg.OneTimeDownloadExpirySeconds = value
|
|
case SettingDefaultUserMaxFileBytes:
|
|
cfg.DefaultUserMaxFileSizeBytes = value
|
|
case SettingDefaultUserMaxBoxBytes:
|
|
cfg.DefaultUserMaxBoxSizeBytes = value
|
|
case SettingSessionTTLSeconds:
|
|
cfg.SessionTTLSeconds = value
|
|
}
|
|
cfg.setValue(key, strconv.FormatInt(value, 10), source)
|
|
}
|
|
|
|
func (cfg *Config) assignInt(key string, value int, source Source) {
|
|
switch key {
|
|
case SettingBoxPollIntervalMS:
|
|
cfg.BoxPollIntervalMS = value
|
|
case SettingThumbnailBatchSize:
|
|
cfg.ThumbnailBatchSize = value
|
|
case SettingThumbnailIntervalSeconds:
|
|
cfg.ThumbnailIntervalSeconds = value
|
|
}
|
|
cfg.setValue(key, strconv.Itoa(value), source)
|
|
}
|
|
|
|
func (cfg *Config) setValue(key string, value string, source Source) {
|
|
if key == "" {
|
|
return
|
|
}
|
|
cfg.values[key] = value
|
|
cfg.sources[key] = source
|
|
}
|
|
|
|
func (cfg *Config) sourceFor(key string) Source {
|
|
source, ok := cfg.sources[key]
|
|
if !ok {
|
|
return SourceDefault
|
|
}
|
|
return source
|
|
}
|