62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
// 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
|
|
}
|