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