protonmail: remove User.Addresses, add Client.ListAddresses

This commit is contained in:
emersion 2018-10-21 12:24:56 +02:00
parent 6bd8ce1b6e
commit d76f081114
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
7 changed files with 57 additions and 73 deletions

View File

@ -28,9 +28,12 @@ func (be *backend) Login(username, password string) (imapbackend.User, error) {
return nil, err return nil, err
} }
// TODO: decrypt private keys in u.Addresses addrs, err := c.ListAddresses()
if err != nil {
return nil, err
}
return newUser(be, c, u, privateKeys) return newUser(be, c, u, privateKeys, addrs)
} }
func (be *backend) Updates() <-chan imapbackend.Update { func (be *backend) Updates() <-chan imapbackend.Update {

View File

@ -366,7 +366,7 @@ func (mbox *mailbox) CreateMessage(flags []string, date time.Time, body imap.Lit
return err return err
} }
_, err := createMessage(mbox.u.c, mbox.u.u, mbox.u.privateKeys, body) _, err := createMessage(mbox.u.c, mbox.u.u, mbox.u.privateKeys, mbox.u.addrs, body)
if err != nil { if err != nil {
return err return err
} }

View File

@ -376,7 +376,7 @@ func (mbox *mailbox) fetchBodySection(msg *protonmail.Message, section *imap.Bod
return l, nil return l, nil
} }
func createMessage(c *protonmail.Client, u *protonmail.User, privateKeys openpgp.EntityList, r io.Reader) (*protonmail.Message, error) { func createMessage(c *protonmail.Client, u *protonmail.User, privateKeys openpgp.EntityList, addrs []*protonmail.Address, r io.Reader) (*protonmail.Message, error) {
// Parse the incoming MIME message header // Parse the incoming MIME message header
mr, err := mail.CreateReader(r) mr, err := mail.CreateReader(r)
if err != nil { if err != nil {
@ -398,7 +398,7 @@ func createMessage(c *protonmail.Client, u *protonmail.User, privateKeys openpgp
fromAddrStr := fromList[0].Address fromAddrStr := fromList[0].Address
var fromAddr *protonmail.Address var fromAddr *protonmail.Address
for _, addr := range u.Addresses { for _, addr := range addrs {
if strings.EqualFold(addr.Email, fromAddrStr) { if strings.EqualFold(addr.Email, fromAddrStr) {
fromAddr = addr fromAddr = addr
break break

View File

@ -33,6 +33,7 @@ type user struct {
c *protonmail.Client c *protonmail.Client
u *protonmail.User u *protonmail.User
privateKeys openpgp.EntityList privateKeys openpgp.EntityList
addrs []*protonmail.Address
db *database.User db *database.User
eventsReceiver *events.Receiver eventsReceiver *events.Receiver
@ -44,11 +45,12 @@ type user struct {
eventSent chan struct{} eventSent chan struct{}
} }
func newUser(be *backend, c *protonmail.Client, u *protonmail.User, privateKeys openpgp.EntityList) (*user, error) { func newUser(be *backend, c *protonmail.Client, u *protonmail.User, privateKeys openpgp.EntityList, addrs []*protonmail.Address) (*user, error) {
uu := &user{ uu := &user{
c: c, c: c,
u: u, u: u,
privateKeys: privateKeys, privateKeys: privateKeys,
addrs: addrs,
eventSent: make(chan struct{}), eventSent: make(chan struct{}),
} }

View File

@ -1,5 +1,9 @@
package protonmail package protonmail
import (
"net/http"
)
type ( type (
AddressSend int AddressSend int
AddressStatus int AddressStatus int
@ -37,3 +41,21 @@ type Address struct {
HasKeys int HasKeys int
Keys []*PrivateKey Keys []*PrivateKey
} }
func (c *Client) ListAddresses() ([]*Address, error) {
// TODO: Page, PageSize
req, err := c.newRequest(http.MethodGet, "/addresses", nil)
if err != nil {
return nil, err
}
var respData struct {
resp
Addresses []*Address
}
if err := c.doJSON(req, &respData); err != nil {
return nil, err
}
return respData.Addresses, nil
}

View File

@ -17,50 +17,16 @@ type (
type User struct { type User struct {
ID string ID string
Name string Name string
NotificationEmail string
Signature string // HTML
NumMessagePerPage int
UsedSpace int UsedSpace int
Notify int
AutoSaveContacts int
Language string // e.g. en_US
LogAuth LogAuth
ComposerMode ComposerMode
MessageButtons MessageButtons
Images ImagesMode
Moved int
ShowImages int
ShowEmbedded int
ViewMode ViewMode
ViewLayout ViewLayout
SwipeLeft SwipeAction
SwipeRight SwipeAction
Theme string
Currency string // e.g. EUR Currency string // e.g. EUR
Credit int Credit int
InvoiceText string
AlsoArchive int
Hotkeys int
PMSignature int
TwoFactor int
PasswordReset int
PasswordMode PasswordMode
News int
AutoResponder interface{} // TODO
AutoWildcardSearch int
DraftMIMEType string
ReceiveMIMEType string
ImageProxy int
DisplayName string
MaxSpace int MaxSpace int
MaxUpload int MaxUpload int
Subscribed int // TODO
Services int // TODO
Role int // TODO Role int // TODO
Private int Private int
VPN interface{} // TODO Subscribed int // TODO
Services int // TODO
Delinquent int Delinquent int
Addresses []*Address
Keys []*PrivateKey Keys []*PrivateKey
} }
@ -70,28 +36,13 @@ func (c *Client) GetCurrentUser() (*User, error) {
return nil, err return nil, err
} }
var userData struct { var respData struct {
resp resp
User *User User *User
} }
if err := c.doJSON(req, &userData); err != nil { if err := c.doJSON(req, &respData); err != nil {
return nil, err return nil, err
} }
req, err = c.newRequest(http.MethodGet, "/addresses", nil) return respData.User, nil
if err != nil {
return nil, err
}
var addrData struct {
resp
Addresses []*Address
}
if err := c.doJSON(req, &addrData); err != nil {
return nil, err
}
userData.User.Addresses = addrData.Addresses
return userData.User, nil
} }

View File

@ -41,6 +41,7 @@ type user struct {
c *protonmail.Client c *protonmail.Client
u *protonmail.User u *protonmail.User
privateKeys openpgp.EntityList privateKeys openpgp.EntityList
addrs []*protonmail.Address
} }
func (u *user) Send(from string, to []string, r io.Reader) error { func (u *user) Send(from string, to []string, r io.Reader) error {
@ -65,7 +66,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error {
fromAddrStr := fromList[0].Address fromAddrStr := fromList[0].Address
var fromAddr *protonmail.Address var fromAddr *protonmail.Address
for _, addr := range u.u.Addresses { for _, addr := range u.addrs {
if strings.EqualFold(addr.Email, fromAddrStr) { if strings.EqualFold(addr.Email, fromAddrStr) {
fromAddr = addr fromAddr = addr
break break
@ -360,9 +361,14 @@ func (be *backend) Login(username, password string) (smtp.User, error) {
return nil, err return nil, err
} }
addrs, err := c.ListAddresses()
if err != nil {
return nil, err
}
// TODO: decrypt private keys in u.Addresses // TODO: decrypt private keys in u.Addresses
return &user{c, u, privateKeys}, nil return &user{c, u, privateKeys, addrs}, nil
} }
func (be *backend) AnonymousLogin() (smtp.User, error) { func (be *backend) AnonymousLogin() (smtp.User, error) {