[MM-15639] Add config setting to explicitly define which IP headers are trusted (#10907)
* Add config setting to explicitly define which IP headers are trusted * fix variable shadowing * Optimize code flow; Add Ratelimit test for header set * Extend Ratelimit tests * Add additional unit tests * Structured logging
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
e8af4872c6
Коммит
2d97f01781
@@ -23,9 +23,10 @@ type RateLimiter struct {
|
||||
useAuth bool
|
||||
useIP bool
|
||||
header string
|
||||
trustedProxyIPHeader []string
|
||||
}
|
||||
|
||||
func NewRateLimiter(settings *model.RateLimitSettings) (*RateLimiter, error) {
|
||||
func NewRateLimiter(settings *model.RateLimitSettings, trustedProxyIPHeader []string) (*RateLimiter, error) {
|
||||
store, err := memstore.New(*settings.MemoryStoreSize)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, utils.T("api.server.start_server.rate_limiting_memory_store"))
|
||||
@@ -46,6 +47,7 @@ func NewRateLimiter(settings *model.RateLimitSettings) (*RateLimiter, error) {
|
||||
useAuth: *settings.VaryByUser,
|
||||
useIP: *settings.VaryByRemoteAddr,
|
||||
header: settings.VaryByHeader,
|
||||
trustedProxyIPHeader: trustedProxyIPHeader,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -57,10 +59,10 @@ func (rl *RateLimiter) GenerateKey(r *http.Request) string {
|
||||
if tokenLocation != TokenLocationNotFound {
|
||||
key += token
|
||||
} else if rl.useIP { // If we don't find an authentication token and IP based is enabled, fall back to IP
|
||||
key += utils.GetIpAddress(r)
|
||||
key += utils.GetIpAddress(r, rl.trustedProxyIPHeader)
|
||||
}
|
||||
} else if rl.useIP { // Only if Auth based is not enabed do we use a plain IP based
|
||||
key += utils.GetIpAddress(r)
|
||||
key += utils.GetIpAddress(r, rl.trustedProxyIPHeader)
|
||||
}
|
||||
|
||||
// Note that most of the time the user won't have to set this because the utils.GetIpAddress above tries the
|
||||
|
||||
Ссылка в новой задаче
Block a user