forked from emersion/go-imap-id
-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
71 lines (54 loc) · 1.09 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package id
import (
"github.com/linanh/go-imap/server"
)
type Conn interface {
ID() ID
setID(id ID)
}
type conn struct {
server.Conn
id ID
}
func (conn *conn) ID() ID {
return conn.id
}
func (conn *conn) setID(id ID) {
conn.id = id
}
type Handler struct {
Command
ext *extension
}
func (hdlr *Handler) Handle(conn server.Conn) error {
//user has logged in
if idInfo := map[string]string(hdlr.Command.ID); idInfo != nil {
if u := conn.Context().User; u != nil {
u.SetExtensionID(idInfo)
}
}
if conn, ok := conn.(Conn); ok {
conn.setID(hdlr.Command.ID)
}
return conn.WriteResp(&Response{hdlr.ext.serverID})
}
type extension struct {
serverID ID
}
func (ext *extension) Capabilities(c server.Conn) []string {
return []string{Capability}
}
func (ext *extension) Command(name string) server.HandlerFactory {
if name != commandName {
return nil
}
return func() server.Handler {
return &Handler{ext: ext}
}
}
func (ext *extension) NewConn(c server.Conn) server.Conn {
return &conn{Conn: c}
}
func NewExtension(serverID ID) server.Extension {
return &extension{serverID}
}