From 8b84d81f9b56c02a53d1224eb20b25ba93609aa1 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 2 Dec 2019 17:24:19 +0100 Subject: Add initial login logic --- conn_pool.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 conn_pool.go (limited to 'conn_pool.go') diff --git a/conn_pool.go b/conn_pool.go new file mode 100644 index 0000000..147c022 --- /dev/null +++ b/conn_pool.go @@ -0,0 +1,58 @@ +package koushin + +import ( + "crypto/rand" + "encoding/base64" + "errors" + + imapclient "github.com/emersion/go-imap/client" +) + +func generateToken() (string, error) { + b := make([]byte, 32) + _, err := rand.Read(b) + if err != nil { + return "", err + } + return base64.URLEncoding.EncodeToString(b), nil +} + +var ErrSessionExpired = errors.New("session expired") + +// TODO: expiration timer +type ConnPool struct { + // TODO: add synchronization + conns map[string]*imapclient.Client +} + +func NewConnPool() *ConnPool { + return &ConnPool{ + conns: make(map[string]*imapclient.Client), + } +} + +func (pool *ConnPool) Get(token string) (*imapclient.Client, error) { + conn, ok := pool.conns[token] + if !ok { + return nil, ErrSessionExpired + } + return conn, nil +} + +func (pool *ConnPool) Put(conn *imapclient.Client) (token string, err error) { + for { + var err error + token, err = generateToken() + if err != nil { + conn.Logout() + return "", err + } + + if _, ok := pool.conns[token]; !ok { + break + } + } + + pool.conns[token] = conn + return token, nil +} -- cgit v1.2.3-59-g8ed1b