// Package imapmemserver implements an in-memory IMAP server. package imapmemserver import ( "sync" "github.com/emersion/go-imap/v2/imapserver" ) // Server is a server instance. // // A server contains a list of users. type Server struct { mutex sync.Mutex users map[string]*User } // New creates a new server. func New() *Server { return &Server{ users: make(map[string]*User), } } // NewSession creates a new IMAP session. func (s *Server) NewSession() imapserver.Session { return &serverSession{server: s} } func (s *Server) user(username string) *User { s.mutex.Lock() defer s.mutex.Unlock() return s.users[username] } // AddUser adds a user to the server. func (s *Server) AddUser(user *User) { s.mutex.Lock() s.users[user.username] = user s.mutex.Unlock() } type serverSession struct { *UserSession // may be nil server *Server // immutable } var _ imapserver.Session = (*serverSession)(nil) func (sess *serverSession) Login(username, password string) error { u := sess.server.user(username) if u == nil { return imapserver.ErrAuthFailed } if err := u.Login(username, password); err != nil { return err } sess.UserSession = NewUserSession(u) return nil }