diff --git a/nzx_tmpmail/network/lmtp.go b/nzx_tmpmail/network/lmtp.go new file mode 100644 index 0000000..58fda19 --- /dev/null +++ b/nzx_tmpmail/network/lmtp.go @@ -0,0 +1,85 @@ +package network + +import ( + "bufio" + "fmt" + "io" + "net" + "strings" + + "git.uwushka.cc/nzx056/nzx056/nzx_tmpmail/loggingshit" +) + +type Session struct { + Conn net.Conn + Reader *bufio.Reader + Writer *bufio.Writer + MailFrom string + RcptTo []string + RemoteAddr string +} + +func init() { + loggingshit.Log("lmtp init", 1) + ln, err := net.Listen("tcp", "127.0.0.1:2525") + if err != nil { + loggingshit.Log("lmtp init failed with error %v", 3, err) + } + + for { + conn, err := ln.Accept() + if err != nil { + loggingshit.Log("failed to accept connection with error %v, skipping", 2, err) + continue + } + + go handle_conn(conn) + } +} + +func handle_conn(conn net.Conn) { + defer conn.Close() + + s := &Session{ + Conn: conn, + Writer: bufio.NewWriter(conn), + Reader: bufio.NewReader(conn), + RemoteAddr: conn.RemoteAddr().String(), + } + + s.reply("220 nzx056.love LMTP ready") + + for { + l, err := s.readline() + if err != nil { + if err != io.EOF { + loggingshit.Log("readline failed for %s with error: %v", 2, s.RemoteAddr, err) + } + loggingshit.Log("caught EOF from %s, closing conn", 2, s.RemoteAddr) + return + } + + upper := strings.ToUpper(l) + + switch { + + } + } +} + +func (s *Session) readline() (string, error) { + l, err := s.Reader.ReadString('\n') + if err != nil { + return "", err + } + + l = strings.TrimRight(l, "\r\n") + loggingshit.Log("readline %s from %s", 1, l, s.RemoteAddr) + return l, nil +} + +func (s *Session) reply(st string) { + loggingshit.Log("write to %s: %s", 1, s.RemoteAddr, st) + fmt.Fprintf(s.Writer, "%s\r\n", st) + s.Writer.Flush() +}