summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2022-11-06 10:47:48 +0100
committerLibravatar GitHub <noreply@github.com>2022-11-06 09:47:48 +0000
commit4d66fb9603ada9b04f642576bbc541189876a3f3 (patch)
tree7f9b4f3a5ab95b20eb1ad4ceaf2e6779c1e02630 /internal
parent[bugfix] Check `media-description-min-chars` on submission of new status (#960) (diff)
downloadgotosocial-4d66fb9603ada9b04f642576bbc541189876a3f3.tar.xz
[feature] Make rate limit requests amount configurable (#966)
* update rate limit documentation * regenerate landingpage config helpers * make rate limit rate configurable
Diffstat (limited to 'internal')
-rw-r--r--internal/api/security/security.go14
-rw-r--r--internal/config/config.go3
-rw-r--r--internal/config/defaults.go3
-rw-r--r--internal/config/flags.go1
-rw-r--r--internal/config/helpers.gen.go50
5 files changed, 51 insertions, 20 deletions
diff --git a/internal/api/security/security.go b/internal/api/security/security.go
index f06862dd9..1dce111d3 100644
--- a/internal/api/security/security.go
+++ b/internal/api/security/security.go
@@ -23,6 +23,7 @@ import (
"time"
"github.com/superseriousbusiness/gotosocial/internal/api"
+ "github.com/superseriousbusiness/gotosocial/internal/config"
"github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/oauth"
"github.com/superseriousbusiness/gotosocial/internal/router"
@@ -46,11 +47,14 @@ func New(db db.DB, server oauth.Server) api.ClientModule {
// Route attaches security middleware to the given router
func (m *Module) Route(s router.Router) error {
- s.AttachMiddleware(m.RateLimit(RateLimitOptions{
- // accept a maximum of 1000 requests in 5 minutes window
- Period: 5 * time.Minute,
- Limit: 1000,
- }))
+ // only enable rate limit middleware if configured
+ // advanced-rate-limit-requests is greater than 0
+ if rateLimitRequests := config.GetAdvancedRateLimitRequests(); rateLimitRequests > 0 {
+ s.AttachMiddleware(m.RateLimit(RateLimitOptions{
+ Period: 5 * time.Minute,
+ Limit: int64(rateLimitRequests),
+ }))
+ }
s.AttachMiddleware(m.SignatureCheck)
s.AttachMiddleware(m.FlocBlock)
s.AttachMiddleware(m.ExtraHeaders)
diff --git a/internal/config/config.go b/internal/config/config.go
index 98114dea3..313e6ab05 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -129,7 +129,8 @@ type Configuration struct {
AdminAccountPassword string `name:"password" usage:"the password to set for this account"`
AdminTransPath string `name:"path" usage:"the path of the file to import from/export to"`
- AdvancedCookiesSamesite string `name:"advanced-cookies-samesite" usage:"'strict' or 'lax', see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite"`
+ AdvancedCookiesSamesite string `name:"advanced-cookies-samesite" usage:"'strict' or 'lax', see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite"`
+ AdvancedRateLimitRequests int `name:"advanced-rate-limit-requests" usage:"Amount of HTTP requests to permit within a 5 minute window. 0 or less turns rate limiting off."`
}
// MarshalMap will marshal current Configuration into a map structure (useful for JSON).
diff --git a/internal/config/defaults.go b/internal/config/defaults.go
index 37ca5e31d..058b3efb1 100644
--- a/internal/config/defaults.go
+++ b/internal/config/defaults.go
@@ -97,5 +97,6 @@ var Defaults = Configuration{
SyslogProtocol: "udp",
SyslogAddress: "localhost:514",
- AdvancedCookiesSamesite: "lax",
+ AdvancedCookiesSamesite: "lax",
+ AdvancedRateLimitRequests: 1000, // per 5 minutes
}
diff --git a/internal/config/flags.go b/internal/config/flags.go
index 38d4cd51a..bb3f67732 100644
--- a/internal/config/flags.go
+++ b/internal/config/flags.go
@@ -121,6 +121,7 @@ func AddServerFlags(cmd *cobra.Command) {
// Advanced flags
cmd.Flags().String(AdvancedCookiesSamesiteFlag(), cfg.AdvancedCookiesSamesite, fieldtag("AdvancedCookiesSamesite", "usage"))
+ cmd.Flags().Int(AdvancedRateLimitRequestsFlag(), cfg.AdvancedRateLimitRequests, fieldtag("AdvancedRateLimitRequests", "usage"))
})
}
diff --git a/internal/config/helpers.gen.go b/internal/config/helpers.gen.go
index f42593a54..45a56e796 100644
--- a/internal/config/helpers.gen.go
+++ b/internal/config/helpers.gen.go
@@ -95,6 +95,31 @@ func GetApplicationName() string { return global.GetApplicationName() }
// SetApplicationName safely sets the value for global configuration 'ApplicationName' field
func SetApplicationName(v string) { global.SetApplicationName(v) }
+// GetLandingPageUser safely fetches the Configuration value for state's 'LandingPageUser' field
+func (st *ConfigState) GetLandingPageUser() (v string) {
+ st.mutex.Lock()
+ v = st.config.LandingPageUser
+ st.mutex.Unlock()
+ return
+}
+
+// SetLandingPageUser safely sets the Configuration value for state's 'LandingPageUser' field
+func (st *ConfigState) SetLandingPageUser(v string) {
+ st.mutex.Lock()
+ defer st.mutex.Unlock()
+ st.config.LandingPageUser = v
+ st.reloadToViper()
+}
+
+// LandingPageUserFlag returns the flag name for the 'LandingPageUser' field
+func LandingPageUserFlag() string { return "landing-page-user" }
+
+// GetLandingPageUser safely fetches the value for global configuration 'LandingPageUser' field
+func GetLandingPageUser() string { return global.GetLandingPageUser() }
+
+// SetLandingPageUser safely sets the value for global configuration 'LandingPageUser' field
+func SetLandingPageUser(v string) { global.SetLandingPageUser(v) }
+
// GetConfigPath safely fetches the Configuration value for state's 'ConfigPath' field
func (st *ConfigState) GetConfigPath() (v string) {
st.mutex.Lock()
@@ -1795,28 +1820,27 @@ func GetAdvancedCookiesSamesite() string { return global.GetAdvancedCookiesSames
// SetAdvancedCookiesSamesite safely sets the value for global configuration 'AdvancedCookiesSamesite' field
func SetAdvancedCookiesSamesite(v string) { global.SetAdvancedCookiesSamesite(v) }
-// GetLandingPageUser safely fetches the Configuration value for state's 'LandingPageUser' field
-func (st *ConfigState) GetLandingPageUser() (v string) {
+// GetAdvancedRateLimitRequests safely fetches the Configuration value for state's 'AdvancedRateLimitRequests' field
+func (st *ConfigState) GetAdvancedRateLimitRequests() (v int) {
st.mutex.Lock()
- v = st.config.LandingPageUser
+ v = st.config.AdvancedRateLimitRequests
st.mutex.Unlock()
return
}
-// SetLandingPageUser safely sets the Configuration value for state's 'LandingPageUser' field
-func (st *ConfigState) SetLandingPageUser(v string) {
+// SetAdvancedRateLimitRequests safely sets the Configuration value for state's 'AdvancedRateLimitRequests' field
+func (st *ConfigState) SetAdvancedRateLimitRequests(v int) {
st.mutex.Lock()
defer st.mutex.Unlock()
- st.config.LandingPageUser = v
+ st.config.AdvancedRateLimitRequests = v
st.reloadToViper()
}
-// LandingPageUserFlag returns the flag name for the 'LandingPageUser' field
-func LandingPageUserFlag() string { return "landing-page-user" }
+// AdvancedRateLimitRequestsFlag returns the flag name for the 'AdvancedRateLimitRequests' field
+func AdvancedRateLimitRequestsFlag() string { return "advanced-rate-limit-requests" }
-// GetLandingPageUser safely fetches the value for global configuration 'LandingPageUser' field
-func GetLandingPageUser() string { return global.GetLandingPageUser() }
-
-// SetLandingPageUser safely sets the value for global configuration 'LandingPageUser' field
-func SetLandingPageUser(v string) { global.SetLandingPageUser(v) }
+// GetAdvancedRateLimitRequests safely fetches the value for global configuration 'AdvancedRateLimitRequests' field
+func GetAdvancedRateLimitRequests() int { return global.GetAdvancedRateLimitRequests() }
+// SetAdvancedRateLimitRequests safely sets the value for global configuration 'AdvancedRateLimitRequests' field
+func SetAdvancedRateLimitRequests(v int) { global.SetAdvancedRateLimitRequests(v) }