17 func (srv *Server) ListenAndServe() error {
19 return errors.New("nil listener")
21 return srv.Serve(srv.ln)
24 func (srv *Server) Serve(ln net.Listener) error {
26 return errors.New("nil listener")
29 conn, err := ln.Accept()
34 if err := srv.handleConn(conn); err != nil {
35 fmt.Fprintln(os.Stderr, err)
40 return errors.New("unreachable?")
43 func (srv *Server) handleConn(conn net.Conn) error {
44 tmsg, err := ParseMcall(conn)
46 err = fmt.Errorf("parse mcall: %w", err)
47 rerror(conn, err.Error())
50 if tmsg.Type != Tauth {
51 rerror(conn, "unauthorised")
54 if err := srv.Users.Authenticate(tmsg.Username, Password(tmsg.Password)); err != nil {
55 rerror(conn, "authentication failed")
58 rmsg := &Mcall{Type: Rauth, Username: tmsg.Username}
59 writeMcall(conn, rmsg)
63 tmsg, err := ParseMcall(conn)
64 if errors.Is(err, io.EOF) {
66 } else if err != nil {
67 rerror(conn, err.Error())
73 rmsg = &Mcall{Type: Rerror, Error: "already authenticated"}
75 rmsg = srv.listAliases(user)
77 rmsg = srv.createAlias(user)
79 rmsg = &Mcall{Type: Rerror, Error: "this tmessage not implemented yet"}
81 writeMcall(conn, rmsg)
85 func (srv *Server) createAlias(username string) *Mcall {
86 alias, err := srv.Aliases.Create(username)
88 return &Mcall{Type: Rerror, Error: err.Error()}
90 return &Mcall{Type: Rcreate, Aliases: []Alias{alias}}
93 func (srv *Server) listAliases(username string) *Mcall {
94 a, err := srv.Aliases.Aliases(username)
96 return &Mcall{Type: Rerror, Error: fmt.Sprintf("aliases for %s: %v", username, err)}
98 return &Mcall{Type: Rlist, Aliases: a}