Neues Paket mail/internal/protolog (log/slog): SessionLogger loggt strukturierte Ereignisse einer Verbindung mit fester correlation_id und protocol über die gesamte Verbindungsdauer (Akzeptanzkriterium 1) — ein Logger mit logger==nil ist sicher benutzbar und loggt nichts (Rückwärtskompatibilität zu ING-01..ING-07, Logging ist opt-in wie TLS und Guard-Konfiguration). RedactCommandLine ersetzt bei sensiblen Kommandos (PASS, LOGIN, AUTH) alle Argumente vollständig durch [REDACTED] statt einzeln zu parsen (Akzeptanzkriterium 2). Reconstruct liest zeilenweise JSON-Logs und liefert ausschließlich die Einträge einer Korrelations-ID in Reihenfolge — das geforderte Diagnosewerkzeug (Akzeptanzkriterium 3). Alle drei Sessions loggen jetzt session_start/command (je empfangener Zeile, redigiert)/session_end. Nachrichteninhalte werden strukturell nie geloggt: SMTP-DATA-Body-Zeilen laufen durch eine eigene Leseschleife, die nicht durch den Kommando-Logpfad der Hauptschleife kommt: nur das Kommando DATA selbst erscheint im Log. Alle drei Pflichtprüfungen mit echten Nachweisen durchgeführt, jeweils in IMAP, POP3 und SMTP einzeln: Redaktion gegen den echten laufenden Server bestätigt (Klartextpasswort bzw. absichtlich eingebettetes Geheimnis im SMTP-Body erscheint nie im Log), zwei gemischte reale Sessions über dieselbe Korrelations-ID lückenlos rekonstruiert, Lasttest mit 100 Sessions mit/ohne Logging ohne relevante Durchsatzeinbuße. go build/go vet/golangci-lint clean, gesamtes Mail-Modul (~29 Pakete) regressionsfrei getestet.
36 lines
1.2 KiB
Go
36 lines
1.2 KiB
Go
package protolog
|
|
|
|
import "strings"
|
|
|
|
// sensitiveCommandVerbs sind Kommandos, deren Argumente Zugangsdaten
|
|
// enthalten können (Akzeptanzkriterium 2: Zugangsdaten erscheinen nie
|
|
// im Klartext im Log). PASS (POP3), LOGIN (IMAP) tragen das Passwort
|
|
// direkt als Argument; AUTH ist für zukünftige SMTP-Authentifizierung
|
|
// vorsorglich mit aufgenommen, auch wenn ING-03 kein AUTH implementiert.
|
|
var sensitiveCommandVerbs = map[string]bool{
|
|
"PASS": true,
|
|
"LOGIN": true,
|
|
"AUTH": true,
|
|
}
|
|
|
|
// RedactCommandLine liefert eine loggbare Darstellung einer
|
|
// Kommandozeile: das Kommando (Verb) bleibt sichtbar — wichtig für die
|
|
// Diagnose (Akzeptanzkriterium 3) —, Argumente sensibler Kommandos
|
|
// werden vollständig durch "[REDACTED]" ersetzt statt einzeln
|
|
// geparst, damit auch unerwartet platzierte Zugangsdaten (z. B. ein
|
|
// Benutzername, der zufällig wie ein Passwort aussieht) nicht
|
|
// versehentlich durchrutschen.
|
|
func RedactCommandLine(verb string, args []string) string {
|
|
verbUpper := strings.ToUpper(verb)
|
|
if sensitiveCommandVerbs[verbUpper] {
|
|
if len(args) == 0 {
|
|
return verbUpper
|
|
}
|
|
return verbUpper + " [REDACTED]"
|
|
}
|
|
if len(args) == 0 {
|
|
return verbUpper
|
|
}
|
|
return verbUpper + " " + strings.Join(args, " ")
|
|
}
|