package httpapi import ( "log/slog" "net/http" "github.com/syncova/syncova/packages/platform/logging" "github.com/syncova/syncova/packages/security" ) // securityHandler bedient das Security Center (Phase 15). type securityHandler struct { // inspector prüft die Sicherheitslage. inspector *security.Inspector // logger protokolliert technische Fehler. logger *slog.Logger } // handleGetAssessment bedient GET /security. // // Die Lage wird bei jedem Aufruf neu erhoben, nicht gelesen: Sie hängt am // Zustand der Anlage und veraltet von selbst. Ein gespeicherter Wert wäre nach // jeder Änderung falsch — dieselbe Überlegung wie bei der Recovery Assurance. func (handler *securityHandler) handleGetAssessment(responseWriter http.ResponseWriter, request *http.Request) { requestLogger := logging.WithContext(request.Context(), handler.logger) assessment, inspectError := handler.inspector.Inspect(request.Context()) if inspectError != nil { WriteError(responseWriter, request, requestLogger, NewInternalError(inspectError)) return } WriteSuccess(responseWriter, request, http.StatusOK, map[string]any{ "assessment": assessment, "is_trustworthy": assessment.IsTrustworthy(), }) } // handleListFindings bedient GET /security/findings. // // Getrennt von der Gesamtlage, weil die Befunde die eigentliche Arbeitsliste // sind: Sie stehen nach Schweregrad geordnet, damit oben steht, was zuerst zu // tun ist. func (handler *securityHandler) handleListFindings(responseWriter http.ResponseWriter, request *http.Request) { requestLogger := logging.WithContext(request.Context(), handler.logger) assessment, inspectError := handler.inspector.Inspect(request.Context()) if inspectError != nil { WriteError(responseWriter, request, requestLogger, NewInternalError(inspectError)) return } allFindings := assessment.AllFindings() WriteSuccess(responseWriter, request, http.StatusOK, map[string]any{ "findings": allFindings, "finding_count": len(allFindings), "critical_count": assessment.CriticalFindingCount, "high_count": assessment.HighFindingCount, "unchecked_areas": assessment.UncheckedAreas, }) }