fix(security): trusted-proxy-scoped login rate limit
This commit is contained in:
@@ -5,20 +5,22 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Addr string
|
||||
DatabaseURL string
|
||||
RedisURL string
|
||||
JWTSecret []byte
|
||||
AdminUser string
|
||||
AdminPassword string
|
||||
BooksDir string
|
||||
CacheDir string
|
||||
ScanInterval time.Duration
|
||||
UploadMaxMB int64
|
||||
Addr string
|
||||
DatabaseURL string
|
||||
RedisURL string
|
||||
JWTSecret []byte
|
||||
AdminUser string
|
||||
AdminPassword string
|
||||
BooksDir string
|
||||
CacheDir string
|
||||
ScanInterval time.Duration
|
||||
UploadMaxMB int64
|
||||
TrustedProxies []string
|
||||
}
|
||||
|
||||
func Load() (*Config, error) {
|
||||
@@ -28,6 +30,16 @@ func Load() (*Config, error) {
|
||||
}
|
||||
return def
|
||||
}
|
||||
envList := func(k, def string) []string {
|
||||
v := env(k, def)
|
||||
out := make([]string, 0, len(strings.Split(v, ",")))
|
||||
for _, s := range strings.Split(v, ",") {
|
||||
if s = strings.TrimSpace(s); s != "" {
|
||||
out = append(out, s)
|
||||
}
|
||||
}
|
||||
return out
|
||||
}
|
||||
scanSec, err := strconv.Atoi(env("SCAN_INTERVAL_SEC", "60"))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("SCAN_INTERVAL_SEC: %w", err)
|
||||
@@ -49,15 +61,16 @@ func Load() (*Config, error) {
|
||||
return dir
|
||||
}
|
||||
return &Config{
|
||||
Addr: env("ADDR", ":8080"),
|
||||
DatabaseURL: env("DATABASE_URL", ""),
|
||||
RedisURL: env("REDIS_URL", ""),
|
||||
JWTSecret: []byte(secret),
|
||||
AdminUser: env("ADMIN_USER", ""),
|
||||
AdminPassword: env("ADMIN_PASSWORD", ""),
|
||||
BooksDir: resolveDir(env("BOOKS_DIR", "/data/books")),
|
||||
CacheDir: resolveDir(env("CACHE_DIR", "/data/cache")),
|
||||
ScanInterval: time.Duration(scanSec) * time.Second,
|
||||
UploadMaxMB: uploadMB,
|
||||
Addr: env("ADDR", ":8080"),
|
||||
DatabaseURL: env("DATABASE_URL", ""),
|
||||
RedisURL: env("REDIS_URL", ""),
|
||||
JWTSecret: []byte(secret),
|
||||
AdminUser: env("ADMIN_USER", ""),
|
||||
AdminPassword: env("ADMIN_PASSWORD", ""),
|
||||
BooksDir: resolveDir(env("BOOKS_DIR", "/data/books")),
|
||||
CacheDir: resolveDir(env("CACHE_DIR", "/data/cache")),
|
||||
ScanInterval: time.Duration(scanSec) * time.Second,
|
||||
UploadMaxMB: uploadMB,
|
||||
TrustedProxies: envList("TRUSTED_PROXY_CIDRS", "172.16.0.0/12"),
|
||||
}, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user