diff --git a/protonmail/adresses.go b/protonmail/adresses.go index 66e785b..c4b48b2 100644 --- a/protonmail/adresses.go +++ b/protonmail/adresses.go @@ -31,6 +31,7 @@ type Address struct { Receive int Status AddressStatus Type AddressType + Order int DisplayName string Signature string // HTML HasKeys int diff --git a/protonmail/messages.go b/protonmail/messages.go index 8c79d8e..4e0fa5c 100644 --- a/protonmail/messages.go +++ b/protonmail/messages.go @@ -403,7 +403,7 @@ type MessagePackageSet struct { Body string // Encrypted body data packet // Only if cleartext is sent - BodyKey string + BodyKey *MessageBodyKey `json:",omitempty"` AttachmentKeys map[string]string bodyKey *packet.EncryptedKey @@ -411,6 +411,11 @@ type MessagePackageSet struct { signature int } +type MessageBodyKey struct { + Algorithm string + Key string +} + func NewMessagePackageSet(attachmentKeys map[string]*packet.EncryptedKey) *MessagePackageSet { return &MessagePackageSet{ Addresses: make(map[string]*MessagePackage), @@ -494,8 +499,11 @@ func (set *MessagePackageSet) AddCleartext(addr string) (*MessagePackage, error) set.Addresses[addr] = pkg set.Type |= MessagePackageCleartext - if set.BodyKey == "" || set.AttachmentKeys == nil { - set.BodyKey = base64.StdEncoding.EncodeToString(set.bodyKey.Key) + if set.BodyKey == nil || set.AttachmentKeys == nil { + set.BodyKey = &MessageBodyKey{ + Algorithm: "aes256", + Key: base64.StdEncoding.EncodeToString(set.bodyKey.Key), + } set.AttachmentKeys = make(map[string]string, len(set.attachmentKeys)) for att, key := range set.attachmentKeys { @@ -563,7 +571,7 @@ type OutgoingMessage struct { } func (c *Client) SendMessage(msg *OutgoingMessage) (sent, parent *Message, err error) { - req, err := c.newJSONRequest(http.MethodPost, "/messages/send/"+msg.ID, msg) + req, err := c.newJSONRequest(http.MethodPost, "/messages/"+msg.ID, msg) if err != nil { return nil, nil, err } diff --git a/protonmail/users.go b/protonmail/users.go index dc35b4a..426f677 100644 --- a/protonmail/users.go +++ b/protonmail/users.go @@ -70,13 +70,28 @@ func (c *Client) GetCurrentUser() (*User, error) { return nil, err } - var respData struct { + var userData struct { resp User *User } - if err := c.doJSON(req, &respData); err != nil { + if err := c.doJSON(req, &userData); err != nil { return nil, err } - return respData.User, nil + 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 } diff --git a/smtp/smtp.go b/smtp/smtp.go index 13e9818..60a8783 100644 --- a/smtp/smtp.go +++ b/smtp/smtp.go @@ -95,6 +95,11 @@ func (u *user) Send(from string, to []string, r io.Reader) error { return errors.New("sender address key hasn't been decrypted") } + senderAddress := &protonmail.MessageAddress{ + Address: fromAddr.Email, + Name: fromAddr.DisplayName, + } + msg := &protonmail.Message{ ToList: toPMAddressList(toList), CCList: toPMAddressList(ccList), @@ -102,6 +107,7 @@ func (u *user) Send(from string, to []string, r io.Reader) error { Subject: subject, Header: formatHeader(mr.Header), AddressID: fromAddr.ID, + Sender: senderAddress, } // Create an empty draft