2017-12-03 15:58:24 +02:00
|
|
|
package imap
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2020-02-29 13:13:32 +02:00
|
|
|
"sync"
|
2017-12-03 15:58:24 +02:00
|
|
|
|
2019-06-22 13:15:41 +03:00
|
|
|
"github.com/emersion/go-imap"
|
2017-12-03 15:58:24 +02:00
|
|
|
imapbackend "github.com/emersion/go-imap/backend"
|
|
|
|
|
2024-03-26 21:26:28 +02:00
|
|
|
"github.com/0ranki/hydroxide-push/auth"
|
|
|
|
"github.com/0ranki/hydroxide-push/events"
|
2017-12-03 15:58:24 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
var errNotYetImplemented = errors.New("not yet implemented")
|
|
|
|
|
|
|
|
type backend struct {
|
2018-10-21 13:15:20 +03:00
|
|
|
sessions *auth.Manager
|
2018-01-12 14:20:17 +02:00
|
|
|
eventsManager *events.Manager
|
2018-10-21 13:15:20 +03:00
|
|
|
updates chan imapbackend.Update
|
2020-02-29 13:13:32 +02:00
|
|
|
|
|
|
|
sync.Mutex // protects everything below
|
|
|
|
|
|
|
|
users map[string]*user
|
2017-12-03 15:58:24 +02:00
|
|
|
}
|
|
|
|
|
2019-06-22 13:15:41 +03:00
|
|
|
func (be *backend) Login(info *imap.ConnInfo, username, password string) (imapbackend.User, error) {
|
2017-12-03 15:58:24 +02:00
|
|
|
c, privateKeys, err := be.sessions.Auth(username, password)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2020-01-27 20:35:40 +02:00
|
|
|
return getUser(be, username, c, privateKeys)
|
2017-12-03 15:58:24 +02:00
|
|
|
}
|
|
|
|
|
2018-01-14 12:21:34 +02:00
|
|
|
func (be *backend) Updates() <-chan imapbackend.Update {
|
2018-01-12 16:16:26 +02:00
|
|
|
return be.updates
|
|
|
|
}
|
|
|
|
|
2018-01-12 14:20:17 +02:00
|
|
|
func New(sessions *auth.Manager, eventsManager *events.Manager) imapbackend.Backend {
|
2020-01-27 20:35:40 +02:00
|
|
|
return &backend{
|
|
|
|
sessions: sessions,
|
|
|
|
eventsManager: eventsManager,
|
|
|
|
updates: make(chan imapbackend.Update, 50),
|
|
|
|
users: make(map[string]*user),
|
|
|
|
}
|
2017-12-03 15:58:24 +02:00
|
|
|
}
|