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
}
// 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 {

View File

@ -366,7 +366,7 @@ func (mbox *mailbox) CreateMessage(flags []string, date time.Time, body imap.Lit
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 {
return err
}

View File

@ -376,7 +376,7 @@ func (mbox *mailbox) fetchBodySection(msg *protonmail.Message, section *imap.Bod
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
mr, err := mail.CreateReader(r)
if err != nil {
@ -398,7 +398,7 @@ func createMessage(c *protonmail.Client, u *protonmail.User, privateKeys openpgp
fromAddrStr := fromList[0].Address
var fromAddr *protonmail.Address
for _, addr := range u.Addresses {
for _, addr := range addrs {
if strings.EqualFold(addr.Email, fromAddrStr) {
fromAddr = addr
break

View File

@ -33,6 +33,7 @@ type user struct {
c *protonmail.Client
u *protonmail.User
privateKeys openpgp.EntityList
addrs []*protonmail.Address
db *database.User
eventsReceiver *events.Receiver
@ -44,11 +45,12 @@ type user 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{
c: c,
u: u,
privateKeys: privateKeys,
addrs: addrs,
eventSent: make(chan struct{}),
}

View File

@ -1,5 +1,9 @@
package protonmail
import (
"net/http"
)
type (
AddressSend int
AddressStatus int
@ -37,3 +41,21 @@ type Address struct {
HasKeys int
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 {
ID string
Name string
NotificationEmail string
Signature string // HTML
NumMessagePerPage 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
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
MaxUpload int
Subscribed int // TODO
Services int // TODO
Role int // TODO
Private int
VPN interface{} // TODO
Subscribed int // TODO
Services int // TODO
Delinquent int
Addresses []*Address
Keys []*PrivateKey
}
@ -70,28 +36,13 @@ func (c *Client) GetCurrentUser() (*User, error) {
return nil, err
}
var userData struct {
var respData struct {
resp
User *User
}
if err := c.doJSON(req, &userData); err != nil {
if err := c.doJSON(req, &respData); err != nil {
return nil, err
}
req, err = c.newRequest(http.MethodGet, "/addresses", 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
return respData.User, nil
}

View File

@ -41,6 +41,7 @@ type user struct {
c *protonmail.Client
u *protonmail.User
privateKeys openpgp.EntityList
addrs []*protonmail.Address
}
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
var fromAddr *protonmail.Address
for _, addr := range u.u.Addresses {
for _, addr := range u.addrs {
if strings.EqualFold(addr.Email, fromAddrStr) {
fromAddr = addr
break
@ -360,9 +361,14 @@ func (be *backend) Login(username, password string) (smtp.User, error) {
return nil, err
}
addrs, err := c.ListAddresses()
if err != nil {
return nil, err
}
// 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) {