diff --git a/cmd/pasty/main.go b/cmd/pasty/main.go index 03c87b4..006144f 100644 --- a/cmd/pasty/main.go +++ b/cmd/pasty/main.go @@ -29,6 +29,7 @@ func main() { } // Load the configuration + config.Compatibility() cfg, err := config.Load() if err != nil { log.Fatal().Err(err).Msg("Could not load the configuration.") @@ -46,10 +47,6 @@ func main() { zerolog.SetGlobalLevel(level) } - // Run the configuration compatibility layer - // TODO: Remove this at a later state - configCompatibilityLayer(cfg) - // Determine the correct storage driver to use var driver storage.Driver switch strings.TrimSpace(strings.ToLower(cfg.StorageDriver)) { @@ -78,17 +75,16 @@ func main() { }() // Start the web server - log.Info().Str("address", cfg.WebAddress).Msg("Starting the web server...") + log.Info().Str("address", cfg.Address).Msg("Starting the web server...") webServer := &web.Server{ - Address: cfg.WebAddress, + Address: cfg.Address, Storage: driver, - HastebinSupport: cfg.HastebinSupport, - PasteIDLength: cfg.IDLength, - PasteIDCharset: cfg.IDCharacters, - PasteLengthCap: cfg.LengthCap, + PasteIDLength: cfg.PasteIDLength, + PasteIDCharset: cfg.PasteIDCharset, + PasteLengthCap: cfg.PasteLengthCap, ModificationTokensEnabled: cfg.ModificationTokens, ModificationTokenLength: cfg.ModificationTokenLength, - ModificationTokenCharset: cfg.ModificationTokenCharacters, + ModificationTokenCharset: cfg.ModificationTokenCharset, } if cfg.Reports.Enabled { webServer.ReportClient = &reports.Client{ @@ -117,10 +113,3 @@ func main() { signal.Notify(shutdownChan, os.Interrupt) <-shutdownChan } - -func configCompatibilityLayer(cfg *config.Config) { - // Print a notice if the (now removed) Hastebin support has been enabled - if cfg.HastebinSupport { - log.Warn().Msg("You have enabled the legacy 'Hastebin support' feature. This feature has been removed.") - } -} diff --git a/internal/config/compatibility.go b/internal/config/compatibility.go new file mode 100644 index 0000000..976ad1b --- /dev/null +++ b/internal/config/compatibility.go @@ -0,0 +1,69 @@ +package config + +import ( + "github.com/joho/godotenv" + "github.com/rs/zerolog/log" + "os" +) + +var removedKeys = []string{ + "PASTY_HASTEBIN_SUPPORT", + "PASTY_STORAGE_FILE_PATH", + "PASTY_STORAGE_MONGODB_CONNECTION_STRING", + "PASTY_STORAGE_MONGODB_DATABASE", + "PASTY_STORAGE_MONGODB_COLLECTION", + "PASTY_STORAGE_S3_ENDPOINT", + "PASTY_STORAGE_S3_ACCESS_KEY_ID", + "PASTY_STORAGE_S3_SECRET_ACCESS_KEY", + "PASTY_STORAGE_S3_SECRET_TOKEN", + "PASTY_STORAGE_S3_SECURE", + "PASTY_STORAGE_S3_REGION", + "PASTY_STORAGE_S3_BUCKET", +} + +var keyRedirects = map[string][]string{ + "PASTY_ADDRESS": {"PASTY_WEB_ADDRESS"}, + "PASTY_STORAGE_DRIVER": {"PASTY_STORAGE_TYPE"}, + "PASTY_POSTGRES_DSN": {"PASTY_STORAGE_POSTGRES_DSN"}, + "PASTY_PASTE_ID_LENGTH": {"PASTY_ID_LENGTH"}, + "PASTY_PASTE_ID_CHARSET": {"PASTY_ID_CHARACTERS"}, + "PASTY_PASTE_LENGTH_CAP": {"PASTY_LENGTH_CAP"}, + "PASTY_REPORTS_ENABLED": {"PASTY_REPORTS_ENABLED"}, + "PASTY_REPORTS_WEBHOOK_URL": {"PASTY_REPORT_WEBHOOK"}, + "PASTY_REPORTS_WEBHOOK_TOKEN": {"PASTY_REPORT_WEBHOOK_TOKEN"}, + "PASTY_MODIFICATION_TOKEN_CHARSET": {"PASTY_MODIFICATION_TOKEN_CHARACTERS"}, + "PASTY_MODIFICATION_TOKENS": {"PASTY_DELETION_TOKENS"}, + "PASTY_MODIFICATION_TOKEN_MASTER": {"PASTY_DELETION_TOKEN_MASTER"}, + "PASTY_MODIFICATION_TOKEN_LENGTH": {"PASTY_DELETION_TOKEN_LENGTH"}, +} + +// Compatibility runs several compatibility measurements. +// This is used to redirect legacy config keys to their new equivalent or print warnings about deprecated ones. +func Compatibility() { + _ = godotenv.Overload() + + for _, key := range removedKeys { + if isSet(key) { + log.Warn().Msgf("You have set the '%s' environment variable. This variable has been discontinued and has no further effect.", key) + } + } + + for newKey, oldKeys := range keyRedirects { + if !isSet(newKey) { + for _, oldKey := range oldKeys { + if isSet(oldKey) { + if err := os.Setenv(newKey, os.Getenv(oldKey)); err != nil { + continue + } + log.Warn().Msgf("You have set the '%s' environment variable. This variable has been renamed to '%s'. The value has been propagated, but please consider changing your configuration to avoid further complications.", oldKey, newKey) + break + } + } + } + } +} + +func isSet(key string) bool { + _, ok := os.LookupEnv(key) + return ok +} diff --git a/internal/config/config.go b/internal/config/config.go index 1ce7b19..3cac944 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -7,22 +7,21 @@ import ( ) type Config struct { - LogLevel string `default:"info" split_words:"true"` - WebAddress string `default:":8080" split_words:"true"` - StorageDriver string `default:"sqlite" split_words:"true"` - HastebinSupport bool `default:"false" split_words:"true"` // TODO: Legacy - IDLength int `default:"6" split_words:"true"` - IDCharacters string `default:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" split_words:"true"` - ModificationTokens bool `default:"true" split_words:"true"` - ModificationTokenMaster string `split_words:"true"` - ModificationTokenLength int `default:"12" split_words:"true"` - ModificationTokenCharacters string `default:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" split_words:"true"` - RateLimit string `default:"30-M" split_words:"true"` - LengthCap int `default:"50000" split_words:"true"` - AutoDelete *AutoDeleteConfig `split_words:"true"` - Reports *ReportConfig - Postgres *PostgresConfig - SQLite *SQLiteConfig + LogLevel string `default:"info" split_words:"true"` + Address string `default:":8080" split_words:"true"` + StorageDriver string `default:"sqlite" split_words:"true"` + PasteIDLength int `default:"6" split_words:"true"` + PasteIDCharset string `default:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" split_words:"true"` + ModificationTokens bool `default:"true" split_words:"true"` + ModificationTokenMaster string `split_words:"true"` + ModificationTokenLength int `default:"12" split_words:"true"` + ModificationTokenCharset string `default:"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" split_words:"true"` + RateLimit string `default:"30-M" split_words:"true"` + PasteLengthCap int `default:"50000" split_words:"true"` + AutoDelete *AutoDeleteConfig `split_words:"true"` + Reports *ReportConfig + Postgres *PostgresConfig + SQLite *SQLiteConfig } type AutoDeleteConfig struct { diff --git a/internal/web/server.go b/internal/web/server.go index 14fc1e4..f4f244b 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -23,10 +23,6 @@ type Server struct { // If this is set to nil, the report system will be considered deactivated. ReportClient *reports.Client - // Whether the Hastebin support should be enabled. - // If this is set to 'false', the Hastebin specific endpoints will not be registered. - HastebinSupport bool - // The length of newly generated paste IDs. PasteIDLength int // The charset to use when generating new paste IDs. diff --git a/pkg/chiimplicitok/middleware.go b/pkg/chiimplicitok/middleware.go index 30e98d0..446999d 100644 --- a/pkg/chiimplicitok/middleware.go +++ b/pkg/chiimplicitok/middleware.go @@ -16,7 +16,7 @@ func Middleware(next http.Handler) http.Handler { } }() - next.ServeHTTP(writer, request) + next.ServeHTTP(proxy, request) } return http.HandlerFunc(fn) }