From 98b250df38ca82f08ad0b6ee19eace3dfb182ede Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Thu, 25 Sep 2025 08:23:20 +0800 Subject: Mailing lists: implement sub/unsub --- forged/internal/unsorted/lmtp_server.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'forged/internal/unsorted/lmtp_server.go') diff --git a/forged/internal/unsorted/lmtp_server.go b/forged/internal/unsorted/lmtp_server.go index e1f3cab..4e92c23 100644 --- a/forged/internal/unsorted/lmtp_server.go +++ b/forged/internal/unsorted/lmtp_server.go @@ -185,8 +185,33 @@ func (session *lmtpSession) Data(r io.Reader) error { goto end } case "lists": - if err = session.s.lmtpHandleMailingList(session, groupPath, moduleName, email, data, from); err != nil { - slog.Error("error handling mailing list message", "error", err) + var moduleAction string + if len(segments) > sepIndex+3 { + moduleAction = segments[sepIndex+3] + if len(segments) > sepIndex+4 { + err = errors.New("too many path segments for mailing list command") + goto end + } + } + + switch moduleAction { + case "": + if err = session.s.lmtpHandleMailingList(session, groupPath, moduleName, email, data, from); err != nil { + slog.Error("error handling mailing list message", "error", err) + goto end + } + case "subscribe": + if err = session.s.lmtpHandleMailingListSubscribe(session, groupPath, moduleName, from); err != nil { + slog.Error("error handling mailing list subscribe", "error", err) + goto end + } + case "unsubscribe": + if err = session.s.lmtpHandleMailingListUnsubscribe(session, groupPath, moduleName, from); err != nil { + slog.Error("error handling mailing list unsubscribe", "error", err) + goto end + } + default: + err = fmt.Errorf("unsupported mailing list command: %q", moduleAction) goto end } default: -- cgit v1.2.3