summaryrefslogtreecommitdiff
path: root/internal/config
diff options
context:
space:
mode:
Diffstat (limited to 'internal/config')
-rw-r--r--internal/config/config.go116
-rw-r--r--internal/config/default.go177
-rw-r--r--internal/config/media.go4
-rw-r--r--internal/config/statuses.go33
4 files changed, 318 insertions, 12 deletions
diff --git a/internal/config/config.go b/internal/config/config.go
index 811cf166d..a21eaa589 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -36,6 +36,7 @@ type Config struct {
AccountsConfig *AccountsConfig `yaml:"accounts"`
MediaConfig *MediaConfig `yaml:"media"`
StorageConfig *StorageConfig `yaml:"storage"`
+ StatusesConfig *StatusesConfig `yaml:"statuses"`
}
// FromFile returns a new config from a file, or an error if something goes amiss.
@@ -50,7 +51,7 @@ func FromFile(path string) (*Config, error) {
return Empty(), nil
}
-// Empty just returns an empty config
+// Empty just returns a new empty config
func Empty() *Config {
return &Config{
DBConfig: &DBConfig{},
@@ -58,6 +59,7 @@ func Empty() *Config {
AccountsConfig: &AccountsConfig{},
MediaConfig: &MediaConfig{},
StorageConfig: &StorageConfig{},
+ StatusesConfig: &StatusesConfig{},
}
}
@@ -140,8 +142,8 @@ func (c *Config) ParseCLIFlags(f KeyedFlags) {
c.AccountsConfig.OpenRegistration = f.Bool(fn.AccountsOpenRegistration)
}
- if f.IsSet(fn.AccountsRequireApproval) {
- c.AccountsConfig.RequireApproval = f.Bool(fn.AccountsRequireApproval)
+ if f.IsSet(fn.AccountsApprovalRequired) {
+ c.AccountsConfig.RequireApproval = f.Bool(fn.AccountsApprovalRequired)
}
// media flags
@@ -153,6 +155,14 @@ func (c *Config) ParseCLIFlags(f KeyedFlags) {
c.MediaConfig.MaxVideoSize = f.Int(fn.MediaMaxVideoSize)
}
+ if c.MediaConfig.MinDescriptionChars == 0 || f.IsSet(fn.MediaMinDescriptionChars) {
+ c.MediaConfig.MinDescriptionChars = f.Int(fn.MediaMinDescriptionChars)
+ }
+
+ if c.MediaConfig.MaxDescriptionChars == 0 || f.IsSet(fn.MediaMaxDescriptionChars) {
+ c.MediaConfig.MaxDescriptionChars = f.Int(fn.MediaMaxDescriptionChars)
+ }
+
// storage flags
if c.StorageConfig.Backend == "" || f.IsSet(fn.StorageBackend) {
c.StorageConfig.Backend = f.String(fn.StorageBackend)
@@ -173,6 +183,23 @@ func (c *Config) ParseCLIFlags(f KeyedFlags) {
if c.StorageConfig.ServeBasePath == "" || f.IsSet(fn.StorageServeBasePath) {
c.StorageConfig.ServeBasePath = f.String(fn.StorageServeBasePath)
}
+
+ // statuses flags
+ if c.StatusesConfig.MaxChars == 0 || f.IsSet(fn.StatusesMaxChars) {
+ c.StatusesConfig.MaxChars = f.Int(fn.StatusesMaxChars)
+ }
+ if c.StatusesConfig.CWMaxChars == 0 || f.IsSet(fn.StatusesCWMaxChars) {
+ c.StatusesConfig.CWMaxChars = f.Int(fn.StatusesCWMaxChars)
+ }
+ if c.StatusesConfig.PollMaxOptions == 0 || f.IsSet(fn.StatusesPollMaxOptions) {
+ c.StatusesConfig.PollMaxOptions = f.Int(fn.StatusesPollMaxOptions)
+ }
+ if c.StatusesConfig.PollOptionMaxChars == 0 || f.IsSet(fn.StatusesPollOptionMaxChars) {
+ c.StatusesConfig.PollOptionMaxChars = f.Int(fn.StatusesPollOptionMaxChars)
+ }
+ if c.StatusesConfig.MaxMediaFiles == 0 || f.IsSet(fn.StatusesMaxMediaFiles) {
+ c.StatusesConfig.MaxMediaFiles = f.Int(fn.StatusesMaxMediaFiles)
+ }
}
// KeyedFlags is a wrapper for any type that can store keyed flags and give them back.
@@ -203,16 +230,63 @@ type Flags struct {
TemplateBaseDir string
AccountsOpenRegistration string
- AccountsRequireApproval string
+ AccountsApprovalRequired string
+ AccountsReasonRequired string
- MediaMaxImageSize string
- MediaMaxVideoSize string
+ MediaMaxImageSize string
+ MediaMaxVideoSize string
+ MediaMinDescriptionChars string
+ MediaMaxDescriptionChars string
StorageBackend string
StorageBasePath string
StorageServeProtocol string
StorageServeHost string
StorageServeBasePath string
+
+ StatusesMaxChars string
+ StatusesCWMaxChars string
+ StatusesPollMaxOptions string
+ StatusesPollOptionMaxChars string
+ StatusesMaxMediaFiles string
+}
+
+type Defaults struct {
+ LogLevel string
+ ApplicationName string
+ ConfigPath string
+ Host string
+ Protocol string
+
+ DbType string
+ DbAddress string
+ DbPort int
+ DbUser string
+ DbPassword string
+ DbDatabase string
+
+ TemplateBaseDir string
+
+ AccountsOpenRegistration bool
+ AccountsRequireApproval bool
+ AccountsReasonRequired bool
+
+ MediaMaxImageSize int
+ MediaMaxVideoSize int
+ MediaMinDescriptionChars int
+ MediaMaxDescriptionChars int
+
+ StorageBackend string
+ StorageBasePath string
+ StorageServeProtocol string
+ StorageServeHost string
+ StorageServeBasePath string
+
+ StatusesMaxChars int
+ StatusesCWMaxChars int
+ StatusesPollMaxOptions int
+ StatusesPollOptionMaxChars int
+ StatusesMaxMediaFiles int
}
// GetFlagNames returns a struct containing the names of the various flags used for
@@ -235,16 +309,25 @@ func GetFlagNames() Flags {
TemplateBaseDir: "template-basedir",
AccountsOpenRegistration: "accounts-open-registration",
- AccountsRequireApproval: "accounts-require-approval",
+ AccountsApprovalRequired: "accounts-approval-required",
+ AccountsReasonRequired: "accounts-reason-required",
- MediaMaxImageSize: "media-max-image-size",
- MediaMaxVideoSize: "media-max-video-size",
+ MediaMaxImageSize: "media-max-image-size",
+ MediaMaxVideoSize: "media-max-video-size",
+ MediaMinDescriptionChars: "media-min-description-chars",
+ MediaMaxDescriptionChars: "media-max-description-chars",
StorageBackend: "storage-backend",
StorageBasePath: "storage-base-path",
StorageServeProtocol: "storage-serve-protocol",
StorageServeHost: "storage-serve-host",
StorageServeBasePath: "storage-serve-base-path",
+
+ StatusesMaxChars: "statuses-max-chars",
+ StatusesCWMaxChars: "statuses-cw-max-chars",
+ StatusesPollMaxOptions: "statuses-poll-max-options",
+ StatusesPollOptionMaxChars: "statuses-poll-option-max-chars",
+ StatusesMaxMediaFiles: "statuses-max-media-files",
}
}
@@ -268,15 +351,24 @@ func GetEnvNames() Flags {
TemplateBaseDir: "GTS_TEMPLATE_BASEDIR",
AccountsOpenRegistration: "GTS_ACCOUNTS_OPEN_REGISTRATION",
- AccountsRequireApproval: "GTS_ACCOUNTS_REQUIRE_APPROVAL",
+ AccountsApprovalRequired: "GTS_ACCOUNTS_APPROVAL_REQUIRED",
+ AccountsReasonRequired: "GTS_ACCOUNTS_REASON_REQUIRED",
- MediaMaxImageSize: "GTS_MEDIA_MAX_IMAGE_SIZE",
- MediaMaxVideoSize: "GTS_MEDIA_MAX_VIDEO_SIZE",
+ MediaMaxImageSize: "GTS_MEDIA_MAX_IMAGE_SIZE",
+ MediaMaxVideoSize: "GTS_MEDIA_MAX_VIDEO_SIZE",
+ MediaMinDescriptionChars: "GTS_MEDIA_MIN_DESCRIPTION_CHARS",
+ MediaMaxDescriptionChars: "GTS_MEDIA_MAX_DESCRIPTION_CHARS",
StorageBackend: "GTS_STORAGE_BACKEND",
StorageBasePath: "GTS_STORAGE_BASE_PATH",
StorageServeProtocol: "GTS_STORAGE_SERVE_PROTOCOL",
StorageServeHost: "GTS_STORAGE_SERVE_HOST",
StorageServeBasePath: "GTS_STORAGE_SERVE_BASE_PATH",
+
+ StatusesMaxChars: "GTS_STATUSES_MAX_CHARS",
+ StatusesCWMaxChars: "GTS_STATUSES_CW_MAX_CHARS",
+ StatusesPollMaxOptions: "GTS_STATUSES_POLL_MAX_OPTIONS",
+ StatusesPollOptionMaxChars: "GTS_STATUSES_POLL_OPTION_MAX_CHARS",
+ StatusesMaxMediaFiles: "GTS_STATUSES_MAX_MEDIA_FILES",
}
}
diff --git a/internal/config/default.go b/internal/config/default.go
new file mode 100644
index 000000000..16a7ec46d
--- /dev/null
+++ b/internal/config/default.go
@@ -0,0 +1,177 @@
+package config
+
+// TestDefault returns a default config for testing
+func TestDefault() *Config {
+ defaults := GetTestDefaults()
+ return &Config{
+ LogLevel: defaults.LogLevel,
+ ApplicationName: defaults.ApplicationName,
+ Host: defaults.Host,
+ Protocol: defaults.Protocol,
+ DBConfig: &DBConfig{
+ Type: defaults.DbType,
+ Address: defaults.DbAddress,
+ Port: defaults.DbPort,
+ User: defaults.DbUser,
+ Password: defaults.DbPassword,
+ Database: defaults.DbDatabase,
+ ApplicationName: defaults.ApplicationName,
+ },
+ TemplateConfig: &TemplateConfig{
+ BaseDir: defaults.TemplateBaseDir,
+ },
+ AccountsConfig: &AccountsConfig{
+ OpenRegistration: defaults.AccountsOpenRegistration,
+ RequireApproval: defaults.AccountsRequireApproval,
+ ReasonRequired: defaults.AccountsReasonRequired,
+ },
+ MediaConfig: &MediaConfig{
+ MaxImageSize: defaults.MediaMaxImageSize,
+ MaxVideoSize: defaults.MediaMaxVideoSize,
+ MinDescriptionChars: defaults.MediaMinDescriptionChars,
+ MaxDescriptionChars: defaults.MediaMaxDescriptionChars,
+ },
+ StorageConfig: &StorageConfig{
+ Backend: defaults.StorageBackend,
+ BasePath: defaults.StorageBasePath,
+ ServeProtocol: defaults.StorageServeProtocol,
+ ServeHost: defaults.StorageServeHost,
+ ServeBasePath: defaults.StorageServeBasePath,
+ },
+ StatusesConfig: &StatusesConfig{
+ MaxChars: defaults.StatusesMaxChars,
+ CWMaxChars: defaults.StatusesCWMaxChars,
+ PollMaxOptions: defaults.StatusesPollMaxOptions,
+ PollOptionMaxChars: defaults.StatusesPollOptionMaxChars,
+ MaxMediaFiles: defaults.StatusesMaxMediaFiles,
+ },
+ }
+}
+
+// Default returns a config with all default values set
+func Default() *Config {
+ defaults := GetDefaults()
+ return &Config{
+ LogLevel: defaults.LogLevel,
+ ApplicationName: defaults.ApplicationName,
+ Host: defaults.Host,
+ Protocol: defaults.Protocol,
+ DBConfig: &DBConfig{
+ Type: defaults.DbType,
+ Address: defaults.DbAddress,
+ Port: defaults.DbPort,
+ User: defaults.DbUser,
+ Password: defaults.DbPassword,
+ Database: defaults.DbDatabase,
+ ApplicationName: defaults.ApplicationName,
+ },
+ TemplateConfig: &TemplateConfig{
+ BaseDir: defaults.TemplateBaseDir,
+ },
+ AccountsConfig: &AccountsConfig{
+ OpenRegistration: defaults.AccountsOpenRegistration,
+ RequireApproval: defaults.AccountsRequireApproval,
+ ReasonRequired: defaults.AccountsReasonRequired,
+ },
+ MediaConfig: &MediaConfig{
+ MaxImageSize: defaults.MediaMaxImageSize,
+ MaxVideoSize: defaults.MediaMaxVideoSize,
+ MinDescriptionChars: defaults.MediaMinDescriptionChars,
+ MaxDescriptionChars: defaults.MediaMaxDescriptionChars,
+ },
+ StorageConfig: &StorageConfig{
+ Backend: defaults.StorageBackend,
+ BasePath: defaults.StorageBasePath,
+ ServeProtocol: defaults.StorageServeProtocol,
+ ServeHost: defaults.StorageServeHost,
+ ServeBasePath: defaults.StorageServeBasePath,
+ },
+ StatusesConfig: &StatusesConfig{
+ MaxChars: defaults.StatusesMaxChars,
+ CWMaxChars: defaults.StatusesCWMaxChars,
+ PollMaxOptions: defaults.StatusesPollMaxOptions,
+ PollOptionMaxChars: defaults.StatusesPollOptionMaxChars,
+ MaxMediaFiles: defaults.StatusesMaxMediaFiles,
+ },
+ }
+}
+
+func GetDefaults() Defaults {
+ return Defaults{
+ LogLevel: "info",
+ ApplicationName: "gotosocial",
+ ConfigPath: "",
+ Host: "",
+ Protocol: "https",
+
+ DbType: "postgres",
+ DbAddress: "localhost",
+ DbPort: 5432,
+ DbUser: "postgres",
+ DbPassword: "postgres",
+ DbDatabase: "postgres",
+
+ TemplateBaseDir: "./web/template/",
+
+ AccountsOpenRegistration: true,
+ AccountsRequireApproval: true,
+ AccountsReasonRequired: true,
+
+ MediaMaxImageSize: 2097152, //2mb
+ MediaMaxVideoSize: 10485760, //10mb
+ MediaMinDescriptionChars: 0,
+ MediaMaxDescriptionChars: 500,
+
+ StorageBackend: "local",
+ StorageBasePath: "/gotosocial/storage",
+ StorageServeProtocol: "https",
+ StorageServeHost: "localhost",
+ StorageServeBasePath: "/fileserver",
+
+ StatusesMaxChars: 5000,
+ StatusesCWMaxChars: 100,
+ StatusesPollMaxOptions: 6,
+ StatusesPollOptionMaxChars: 50,
+ StatusesMaxMediaFiles: 6,
+ }
+}
+
+func GetTestDefaults() Defaults {
+ return Defaults{
+ LogLevel: "trace",
+ ApplicationName: "gotosocial",
+ ConfigPath: "",
+ Host: "localhost:8080",
+ Protocol: "http",
+
+ DbType: "postgres",
+ DbAddress: "localhost",
+ DbPort: 5432,
+ DbUser: "postgres",
+ DbPassword: "postgres",
+ DbDatabase: "postgres",
+
+ TemplateBaseDir: "./web/template/",
+
+ AccountsOpenRegistration: true,
+ AccountsRequireApproval: true,
+ AccountsReasonRequired: true,
+
+ MediaMaxImageSize: 1048576, //1mb
+ MediaMaxVideoSize: 5242880, //5mb
+ MediaMinDescriptionChars: 0,
+ MediaMaxDescriptionChars: 500,
+
+ StorageBackend: "local",
+ StorageBasePath: "/gotosocial/storage",
+ StorageServeProtocol: "http",
+ StorageServeHost: "localhost:8080",
+ StorageServeBasePath: "/fileserver",
+
+ StatusesMaxChars: 5000,
+ StatusesCWMaxChars: 100,
+ StatusesPollMaxOptions: 6,
+ StatusesPollOptionMaxChars: 50,
+ StatusesMaxMediaFiles: 6,
+ }
+}
diff --git a/internal/config/media.go b/internal/config/media.go
index 816e236b2..136dba528 100644
--- a/internal/config/media.go
+++ b/internal/config/media.go
@@ -24,4 +24,8 @@ type MediaConfig struct {
MaxImageSize int `yaml:"maxImageSize"`
// Max size of uploaded video in bytes
MaxVideoSize int `yaml:"maxVideoSize"`
+ // Minimum amount of chars required in an image description
+ MinDescriptionChars int `yaml:"minDescriptionChars"`
+ // Max amount of chars allowed in an image description
+ MaxDescriptionChars int `yaml:"maxDescriptionChars"`
}
diff --git a/internal/config/statuses.go b/internal/config/statuses.go
new file mode 100644
index 000000000..fbb5225b4
--- /dev/null
+++ b/internal/config/statuses.go
@@ -0,0 +1,33 @@
+/*
+ GoToSocial
+ Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package config
+
+// StatusesConfig pertains to posting/deleting/interacting with statuses
+type StatusesConfig struct {
+ // Maximum amount of characters allowed in a status, excluding CW
+ MaxChars int `yaml:"max_chars"`
+ // Maximum amount of characters allowed in a content-warning/spoiler field
+ CWMaxChars int `yaml:"cw_max_chars"`
+ // Maximum number of options allowed in a poll
+ PollMaxOptions int `yaml:"poll_max_options"`
+ // Maximum characters allowed per poll option
+ PollOptionMaxChars int `yaml:"poll_option_max_chars"`
+ // Maximum amount of media files allowed to be attached to one status
+ MaxMediaFiles int `yaml:"max_media_files"`
+}