@@ -4,9 +4,13 @@ import (
44 "context"
55 "fmt"
66 "net/http"
7+ "os"
8+ "strconv"
9+ "time"
710
811 "github.com/gorilla/mux"
912 "github.com/rs/cors"
13+ log "github.com/sirupsen/logrus"
1014
1115 "github.com/netbirdio/management-integrations/integrations"
1216
@@ -38,7 +42,12 @@ import (
3842 "github.com/netbirdio/netbird/management/server/telemetry"
3943)
4044
41- const apiPrefix = "/api"
45+ const (
46+ apiPrefix = "/api"
47+ rateLimitingEnabledKey = "NB_API_RATE_LIMITING_ENABLED"
48+ rateLimitingBurstKey = "NB_API_RATE_LIMITING_BURST"
49+ rateLimitingRPMKey = "NB_API_RATE_LIMITING_RPM"
50+ )
4251
4352// NewAPIHandler creates the Management service HTTP API handler registering all the available endpoints.
4453func NewAPIHandler (
@@ -58,11 +67,42 @@ func NewAPIHandler(
5867 settingsManager settings.Manager ,
5968) (http.Handler , error ) {
6069
70+ var rateLimitingConfig * middleware.RateLimiterConfig
71+ if os .Getenv (rateLimitingEnabledKey ) == "true" {
72+ rpm := 6
73+ if v := os .Getenv (rateLimitingRPMKey ); v != "" {
74+ value , err := strconv .Atoi (v )
75+ if err != nil {
76+ log .Warnf ("parsing %s env var: %v, using default %d" , rateLimitingRPMKey , err , rpm )
77+ } else {
78+ rpm = value
79+ }
80+ }
81+
82+ burst := 500
83+ if v := os .Getenv (rateLimitingBurstKey ); v != "" {
84+ value , err := strconv .Atoi (v )
85+ if err != nil {
86+ log .Warnf ("parsing %s env var: %v, using default %d" , rateLimitingBurstKey , err , burst )
87+ } else {
88+ burst = value
89+ }
90+ }
91+
92+ rateLimitingConfig = & middleware.RateLimiterConfig {
93+ RequestsPerMinute : float64 (rpm ),
94+ Burst : burst ,
95+ CleanupInterval : 6 * time .Hour ,
96+ LimiterTTL : 24 * time .Hour ,
97+ }
98+ }
99+
61100 authMiddleware := middleware .NewAuthMiddleware (
62101 authManager ,
63102 accountManager .GetAccountIDFromUserAuth ,
64103 accountManager .SyncUserJWTGroups ,
65104 accountManager .GetUserFromUserAuth ,
105+ rateLimitingConfig ,
66106 )
67107
68108 corsMiddleware := cors .AllowAll ()
0 commit comments