package imap import ( "bufio" "strings" ) // sanitizeResponseText entfernt eingebettete CR/LF aus text, BEVOR er in // eine Antwortzeile eingebettet wird (Bekannter Fehler vermeiden: // archivmail erlaubte Header-/Zeilen-Injection durch Stringkonkatenation // ohne CRLF-Prüfung — jede Antwortzeile dieses Pakets läuft durch diese // Funktion, niemals direkte Interpolation von Nutzereingaben in eine // Rohantwort). func sanitizeResponseText(text string) string { text = strings.ReplaceAll(text, "\r", "") text = strings.ReplaceAll(text, "\n", "") return text } // writeUntagged schreibt eine Server-Antwort ohne Tag ("* ..."). func writeUntagged(w *bufio.Writer, text string) error { _, err := w.WriteString("* " + sanitizeResponseText(text) + "\r\n") if err != nil { return err } return w.Flush() } // writeTagged schreibt eine getaggte Server-Antwort (" OK/NO/BAD ..."). // tag wird ebenfalls saniert — ein Tag mit eingebettetem CRLF ist genauso // eine Injektionsgefahr wie der Antworttext. func writeTagged(w *bufio.Writer, tag, status, text string) error { _, err := w.WriteString(sanitizeResponseText(tag) + " " + status + " " + sanitizeResponseText(text) + "\r\n") if err != nil { return err } return w.Flush() }