From 4abc22d6feacae47d53af01e5823ff2cd7531e4d Mon Sep 17 00:00:00 2001 From: Michael Reber Date: Wed, 14 Jan 2026 16:37:11 +0100 Subject: [PATCH] Fixed the 'Manually Block / Test' endpoint returning a 500 error. The handler didn't validate the integration configuration before attempting the test. --- README.md | 2 +- deployment/container/README.md | 2 +- internal/integrations/pfsense.go | 2 +- pkg/web/handlers.go | 21 +++++++++++++++++++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1d606ce..9700e75 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,7 @@ Comprehensive settings management for alerts, advanced banning, and system prefe Pull and run the official image from Docker Hub: ```bash -# Pull the image from Docker Hub (default) +# Pull the image with podman from Docker Hub (default) podman pull swissmakers/fail2ban-ui:latest # or with Docker: docker pull swissmakers/fail2ban-ui:latest diff --git a/deployment/container/README.md b/deployment/container/README.md index b81321a..d2b5243 100644 --- a/deployment/container/README.md +++ b/deployment/container/README.md @@ -19,7 +19,7 @@ A comprehensive guide for building and deploying Fail2Ban UI using containers (D ### Using Pre-built Image -**Pull the official image from Docker Hub (default):** +**Pull the official image with podman from Docker Hub (default):** ```bash podman pull swissmakers/fail2ban-ui:latest # or with Docker: diff --git a/internal/integrations/pfsense.go b/internal/integrations/pfsense.go index 3a84327..74b20c6 100644 --- a/internal/integrations/pfsense.go +++ b/internal/integrations/pfsense.go @@ -71,7 +71,7 @@ func (p *pfSenseIntegration) callAPI(req Request, action string, payload map[str return fmt.Errorf("failed to encode pfSense payload: %w", err) } - apiURL := strings.TrimSuffix(cfg.BaseURL, "/") + "/api/v1/firewall/alias/ip" + apiURL := strings.TrimSuffix(cfg.BaseURL, "/") + "/api/v2/firewall/alias/ip" httpClient := &http.Client{ Timeout: 10 * time.Second, diff --git a/pkg/web/handlers.go b/pkg/web/handlers.go index 3c8e8b0..5f494e7 100644 --- a/pkg/web/handlers.go +++ b/pkg/web/handlers.go @@ -44,6 +44,7 @@ import ( "github.com/oschwald/maxminddb-golang" "github.com/swissmakers/fail2ban-ui/internal/config" "github.com/swissmakers/fail2ban-ui/internal/fail2ban" + "github.com/swissmakers/fail2ban-ui/internal/integrations" "github.com/swissmakers/fail2ban-ui/internal/storage" ) @@ -1445,6 +1446,26 @@ func AdvancedActionsTestHandler(c *gin.Context) { } settings := config.GetSettings() + + // Check if integration is configured + if settings.AdvancedActions.Integration == "" { + c.JSON(http.StatusBadRequest, gin.H{"error": "no integration configured. Please configure an integration (MikroTik or pfSense) in Advanced Actions settings first"}) + return + } + + // Verify integration exists + integration, ok := integrations.Get(settings.AdvancedActions.Integration) + if !ok { + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("integration %s not found or not registered", settings.AdvancedActions.Integration)}) + return + } + + // Validate integration configuration + if err := integration.Validate(settings.AdvancedActions); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("integration configuration is invalid: %v", err)}) + return + } + server := config.Fail2banServer{} if req.ServerID != "" { if srv, ok := config.GetServerByID(req.ServerID); ok {