package imap import ( "context" "errors" "fmt" "net" ) // Server nimmt IMAP-Verbindungen an und bedient jede in einer eigenen // Goroutine (Akzeptanzkriterium 1). STARTTLS/TLS-Absicherung ist // ausdrücklich Sache von ING-06, nicht dieser Kachel — Server hört per // Klartext-TCP, wie im Ticket vorgesehen ("Bereite höchstens die // Schnittstelle dafür vor"). type Server struct { auth Authenticator store MailboxStore } func NewServer(auth Authenticator, store MailboxStore) *Server { return &Server{auth: auth, store: store} } // Serve nimmt Verbindungen auf listener an, bis ctx beendet wird oder // Accept endgültig fehlschlägt. Blockiert den Aufrufer. func (srv *Server) Serve(ctx context.Context, listener net.Listener) error { go func() { <-ctx.Done() _ = listener.Close() }() for { conn, err := listener.Accept() if err != nil { if ctx.Err() != nil { return nil // beabsichtigtes Herunterfahren } var netErr net.Error if errors.As(err, &netErr) && netErr.Timeout() { continue } return fmt.Errorf("imap: verbindung annehmen: %w", err) } session := newSession(conn, srv.auth, srv.store) go session.Serve(ctx) } }