networking
This commit is contained in:
85
nzx_tmpmail/network/lmtp.go
Normal file
85
nzx_tmpmail/network/lmtp.go
Normal file
@@ -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()
|
||||
}
|
||||
Reference in New Issue
Block a user