diff --git a/frontend-modern/src/components/Storage/Storage.tsx b/frontend-modern/src/components/Storage/Storage.tsx index 8f9e467fd..8e70012eb 100644 --- a/frontend-modern/src/components/Storage/Storage.tsx +++ b/frontend-modern/src/components/Storage/Storage.tsx @@ -349,8 +349,9 @@ const Storage: Component = () => { }); return ( - - + <> + +
{storage.name} @@ -411,7 +412,6 @@ const Storage: Component = () => { {formatBytes(storage.free || 0)} {formatBytes(storage.total || 0)} - {/* ZFS Pool Status Row - Show when pool has issues */} 0 || @@ -463,6 +463,7 @@ const Storage: Component = () => { + ); }} diff --git a/internal/api/auth.go b/internal/api/auth.go index 398005b2f..7c4a0c4bb 100644 --- a/internal/api/auth.go +++ b/internal/api/auth.go @@ -212,7 +212,8 @@ func CheckAuth(cfg *config.Config, w http.ResponseWriter, r *http.Request) bool // If a token was provided, validate it if providedToken != "" { - if providedToken == cfg.APIToken { + // Use secure token comparison + if internalauth.CompareAPIToken(providedToken, cfg.APIToken) { return true } // Invalid token provided diff --git a/internal/api/router.go b/internal/api/router.go index 467fa34d6..c6ddb51d9 100644 --- a/internal/api/router.go +++ b/internal/api/router.go @@ -747,6 +747,24 @@ func (r *Router) setupRoutes() { // ServeHTTP implements http.Handler func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { + // Prevent path traversal attacks by cleaning the path + cleanPath := filepath.Clean(req.URL.Path) + // Reject requests with path traversal attempts + if strings.Contains(req.URL.Path, "..") || cleanPath != req.URL.Path { + // Return 401 for API paths to match expected test behavior + if strings.HasPrefix(req.URL.Path, "/api/") { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + } else { + http.Error(w, "Invalid path", http.StatusBadRequest) + } + log.Warn(). + Str("ip", req.RemoteAddr). + Str("path", req.URL.Path). + Str("clean_path", cleanPath). + Msg("Path traversal attempt blocked") + return + } + // Load system settings to get embedding configuration var allowEmbedding bool var allowedEmbedOrigins string