diff --git a/cmd/pushbits/main.go b/cmd/pushbits/main.go index 79c6198..d866405 100644 --- a/cmd/pushbits/main.go +++ b/cmd/pushbits/main.go @@ -82,7 +82,10 @@ func main() { log.L.Fatal(err) } - engine := router.Create(c.Debug, cm, db, dp, &c.Alertmanager) + engine, err := router.Create(c.Debug, c.HTTP.TrustedProxies, cm, db, dp, &c.Alertmanager) + if err != nil { + log.L.Fatal(err) + } err = runner.Run(engine, c.HTTP.ListenAddress, c.HTTP.Port) if err != nil { diff --git a/config.example.yml b/config.example.yml index 526457e..813f08f 100644 --- a/config.example.yml +++ b/config.example.yml @@ -13,6 +13,9 @@ http: # The port to listen on. port: 8080 + # What proxies to trust. + trustedproxies: [] + database: # Currently sqlite3 and mysql are supported. dialect: 'sqlite3' diff --git a/internal/configuration/configuration.go b/internal/configuration/configuration.go index 83d0482..5d50f38 100644 --- a/internal/configuration/configuration.go +++ b/internal/configuration/configuration.go @@ -43,8 +43,9 @@ type Alertmanager struct { type Configuration struct { Debug bool `default:"false"` HTTP struct { - ListenAddress string `default:""` - Port int `default:"8080"` + ListenAddress string `default:""` + Port int `default:"8080"` + TrustedProxies []string `default:"[]"` } Database struct { Dialect string `default:"sqlite3"` diff --git a/internal/router/router.go b/internal/router/router.go index d884f40..7c4d92d 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -15,7 +15,7 @@ import ( ) // Create a Gin engine and setup all routes. -func Create(debug bool, cm *credentials.Manager, db *database.Database, dp *dispatcher.Dispatcher, alertmanagerConfig *configuration.Alertmanager) *gin.Engine { +func Create(debug bool, trustedProxies []string, cm *credentials.Manager, db *database.Database, dp *dispatcher.Dispatcher, alertmanagerConfig *configuration.Alertmanager) (*gin.Engine, error) { log.L.Println("Setting up HTTP routes.") if !debug { @@ -36,6 +36,16 @@ func Create(debug bool, cm *credentials.Manager, db *database.Database, dp *disp r := gin.New() r.Use(log.GinLogger(log.L), gin.Recovery()) + var err error + if len(trustedProxies) > 0 { + err = r.SetTrustedProxies(trustedProxies) + } else { + err = r.SetTrustedProxies(nil) + } + if err != nil { + return nil, err + } + r.Use(location.Default()) applicationGroup := r.Group("/application") @@ -67,5 +77,5 @@ func Create(debug bool, cm *credentials.Manager, db *database.Database, dp *disp r.POST("/alert", auth.RequireApplicationToken(), alertmanagerHandler.CreateAlert) - return r + return r, nil }