feat(mail): ING-02 POP3-Server (RFC 1939) mit Zustandsmaschine
Vollständiger POP3-Server von Grund auf implementiert, analog zum bestehenden IMAP-Server (ING-01): TCP-Listener mit einer Goroutine pro Verbindung, CRLF/Byte-Stuffing-sichere Response-Writer, Zustandsmaschine (Authorization/Transaction/Update), Kommandos USER, PASS, STAT, LIST, RETR, DELE, QUIT. Zentrale Designentscheidungen: - USER antwortet immer +OK (RFC-konform), Prüfung erst bei PASS - Fehlgeschlagene Anmeldung liefert für unbekannten Benutzer und falsches Passwort denselben generischen Text (keine Informationspreisgabe, Akzeptanzkriterium 3) - DELE markiert Nachrichten nur sitzungslokal; store.Delete wird strukturell ausschließlich in QUIT (Transaction -> Update) aufgerufen, wodurch ein Verbindungsabbruch ohne QUIT nichts endgültig löscht (Pflichtprüfung 3) Alle drei Pflichtprüfungen mit echten Nachweisen durchgeführt: Zustandsübergangs-Tests gegen realen TCP-Server, manuelle Session mit Python-Standardbibliothek poplib (echtes Transkript im Prüfprotokoll), automatisierter Test für DELE-ohne-QUIT. Zusätzlich: 20 parallele reale Sessions (Akzeptanzkriterium 1), vollständiger RETR+DELE+QUIT-Zyklus (Akzeptanzkriterium 2). go build/go vet/golangci-lint clean, gesamtes Mail-Modul (~24 Pakete) regressionsfrei getestet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
5dcfa36f99
commit
bd1f52648c
@@ -0,0 +1,26 @@
|
||||
package pop3
|
||||
|
||||
import "strings"
|
||||
|
||||
// command ist eine geparste POP3-Kommandozeile — POP3 hat (anders als
|
||||
// IMAP) keine Tags, nur "KOMMANDO [Argumente]".
|
||||
type command struct {
|
||||
Name string // groß geschrieben (z. B. "USER")
|
||||
Args []string
|
||||
}
|
||||
|
||||
// parseCommandLine zerlegt eine Kommandozeile (bereits ohne CRLF) in
|
||||
// Kommandoname und Leerzeichen-getrennte Argumente. POP3-Argumente
|
||||
// (Benutzername/Passwort/Nachrichtennummern) enthalten in der Praxis
|
||||
// keine Anführungszeichen-Syntax wie IMAP — ein einfacher Split genügt
|
||||
// für die kleinste Lösung.
|
||||
func parseCommandLine(line string) command {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) == 0 {
|
||||
return command{}
|
||||
}
|
||||
return command{
|
||||
Name: strings.ToUpper(fields[0]),
|
||||
Args: fields[1:],
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user