IMAP-Server-Grundgerüst: TCP-Listener, Command-Parser, Session- Zustandsmaschine (Not Authenticated/Authenticated/Selected), Grundbefehle CAPABILITY/LOGIN/SELECT/FETCH/LOGOUT. - parser.go: Tag+Kommando+Argumente (Atome, zitierte Zeichenketten), keine IMAP-Literalsyntax (kleinste Lösung). - response.go: sanitizeResponseText entfernt eingebettete CR/LF vor jeder Antwortzeile — bekannten archivmail-Fehler (Header-/Zeilen-Injection durch Stringkonkatenation ohne CRLF-Prüfung) strukturell vermieden. - session.go/commands.go: strikte Zustandsprüfung je Kommando, verbotene Übergänge und fehlerhafte Zeilen liefern BAD/NO statt Verbindungsabbruch. maxCommandLineBytes begrenzt Pufferwachstum defensiv. - server.go: TCP-Accept-Schleife, eine Goroutine je Verbindung. - Authenticator/MailboxStore als schmale Schnittstellen — echte Benutzerverwaltungs-/Postfach-Anbindung ist Sache von IMP-01 u. a. Prüfungen (alle real durchgeführt, siehe mail/docs/ING-01-PRUEFPROTOKOLL.md): 1. Manuelle Session mit Pythons imaplib gegen den echten laufenden Server: alle Grundbefehle real beantwortet, ungültiges SELECT liefert real NO ohne Verbindungsabbruch. 2. TestSession_StateTransitionsAndForbiddenTransitions: alle drei Zustandsübergänge und deren verbotene Übergänge real über TCP geprüft. 3. TestServer_50ParallelSessionsNoLeak: 50 reale parallele Sessions, 0 Fehler. Kein Umbau: alle bestehenden Pakete unverändert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
40 lines
1.7 KiB
Go
40 lines
1.7 KiB
Go
// Package imap implementiert ING-01: das IMAP-Server-Grundgerüst
|
|
// (TCP-Listener, Command-Parser, Session-Zustandsmaschine, Grundbefehle
|
|
// CAPABILITY/LOGIN/SELECT/FETCH/LOGOUT). Bewusste Neuimplementierung nach
|
|
// NEXARCH-Techstack, kein 1:1-Übernehmen von archivmail (siehe "Bekannte
|
|
// Fehler vermeiden": Header-/Zeilen-Injection durch Stringkonkatenation
|
|
// ohne CRLF-Prüfung — alle Antworten laufen ausschließlich über
|
|
// writeLine/writeTagged, die eingebettete CR/LF im Text ersetzen, siehe
|
|
// response.go).
|
|
//
|
|
// Authentifizierung (Authenticator) und Postfachzugriff (MailboxStore)
|
|
// sind schmale Schnittstellen — echte Anbindung an Benutzerverwaltung/
|
|
// Nachrichtenspeicher ist Sache späterer Ingestion-Tickets (IMP-01 u. a.,
|
|
// siehe "Nicht Bestandteil dieser Kachel" im Ticket). Dieses Paket kennt
|
|
// weder Core-IAM noch mail/internal/storage.
|
|
package imap
|
|
|
|
import "context"
|
|
|
|
// Authenticator prüft Zugangsdaten für LOGIN.
|
|
type Authenticator interface {
|
|
Authenticate(ctx context.Context, username, password string) (ok bool, err error)
|
|
}
|
|
|
|
// Message ist eine minimale Nachrichtendarstellung für FETCH (nur Flags,
|
|
// keine Inhalte — Inhaltszugriff ist Sache späterer Kacheln).
|
|
type Message struct {
|
|
SequenceNumber uint32
|
|
Flags []string
|
|
}
|
|
|
|
// MailboxStore liefert Postfachzustand für SELECT/FETCH.
|
|
type MailboxStore interface {
|
|
// Select liefert die Anzahl der Nachrichten im Postfach mailboxName.
|
|
// ok=false, wenn das Postfach nicht existiert.
|
|
Select(ctx context.Context, mailboxName string) (exists int, ok bool, err error)
|
|
// Fetch liefert die Nachrichten im aktuell gewählten Postfach, deren
|
|
// Sequenznummer in seqNumbers enthalten ist.
|
|
Fetch(ctx context.Context, mailboxName string, seqNumbers []uint32) ([]Message, error)
|
|
}
|