GODT-35: New pmapi client and manager using resty

This commit is contained in:
James Houlahan
2021-02-22 18:23:51 +01:00
committed by Jakub
parent 1d538e8540
commit 2284e9ede1
163 changed files with 3333 additions and 8124 deletions

View File

@ -18,6 +18,7 @@
package liveapi
import (
"context"
"time"
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
@ -43,7 +44,7 @@ func cleanup(client pmapi.Client, addresses *pmapi.AddressList) error {
func cleanSystemFolders(client pmapi.Client) error {
for _, labelID := range []string{pmapi.InboxLabel, pmapi.SentLabel, pmapi.ArchiveLabel, pmapi.AllMailLabel, pmapi.DraftLabel} {
for {
messages, total, err := client.ListMessages(&pmapi.MessagesFilter{
messages, total, err := client.ListMessages(context.TODO(), &pmapi.MessagesFilter{
PageSize: 150,
LabelID: labelID,
})
@ -60,7 +61,7 @@ func cleanSystemFolders(client pmapi.Client) error {
messageIDs = append(messageIDs, message.ID)
}
if err := client.DeleteMessages(messageIDs); err != nil {
if err := client.DeleteMessages(context.TODO(), messageIDs); err != nil {
return errors.Wrap(err, "failed to delete messages")
}
@ -73,7 +74,7 @@ func cleanSystemFolders(client pmapi.Client) error {
}
func cleanCustomLables(client pmapi.Client) error {
labels, err := client.ListLabels()
labels, err := client.ListLabels(context.TODO())
if err != nil {
return errors.Wrap(err, "failed to list labels")
}
@ -82,7 +83,7 @@ func cleanCustomLables(client pmapi.Client) error {
if err := emptyFolder(client, label.ID); err != nil {
return errors.Wrap(err, "failed to empty label")
}
if err := client.DeleteLabel(label.ID); err != nil {
if err := client.DeleteLabel(context.TODO(), label.ID); err != nil {
return errors.Wrap(err, "failed to delete label")
}
}
@ -92,7 +93,7 @@ func cleanCustomLables(client pmapi.Client) error {
func cleanTrash(client pmapi.Client) error {
for {
_, total, err := client.ListMessages(&pmapi.MessagesFilter{
_, total, err := client.ListMessages(context.TODO(), &pmapi.MessagesFilter{
PageSize: 1,
LabelID: pmapi.TrashLabel,
})
@ -114,12 +115,12 @@ func cleanTrash(client pmapi.Client) error {
}
func emptyFolder(client pmapi.Client, labelID string) error {
err := client.EmptyFolder(labelID, "")
err := client.EmptyFolder(context.TODO(), labelID, "")
if err != nil {
return err
}
for {
_, total, err := client.ListMessages(&pmapi.MessagesFilter{
_, total, err := client.ListMessages(context.TODO(), &pmapi.MessagesFilter{
PageSize: 1,
LabelID: labelID,
})
@ -141,5 +142,5 @@ func reorderAddresses(client pmapi.Client, addresses *pmapi.AddressList) error {
addressIDs = append(addressIDs, address.ID)
}
return client.ReorderAddresses(addressIDs)
return client.ReorderAddresses(context.TODO(), addressIDs)
}

View File

@ -30,27 +30,29 @@ type Controller struct {
calls []*fakeCall
pmapiByUsername map[string]pmapi.Client
messageIDsByUsername map[string][]string
clientManager *pmapi.ClientManager
clientManager pmapi.Manager
// State controlled by test.
noInternetConnection bool
}
func NewController(cm *pmapi.ClientManager) *Controller {
func NewController() (*Controller, pmapi.Manager) {
controller := &Controller{
lock: &sync.RWMutex{},
calls: []*fakeCall{},
pmapiByUsername: map[string]pmapi.Client{},
messageIDsByUsername: map[string][]string{},
clientManager: cm,
noInternetConnection: false,
}
cm.SetRoundTripper(&fakeTransport{
// FIXME(conman): Set connect values here?
cm := pmapi.New(pmapi.DefaultConfig)
cm.SetTransport(&fakeTransport{
ctl: controller,
transport: http.DefaultTransport,
})
return controller
return controller, cm
}

View File

@ -18,6 +18,7 @@
package liveapi
import (
"context"
"fmt"
"strings"
@ -44,7 +45,7 @@ func (ctl *Controller) AddUserLabel(username string, label *pmapi.Label) error {
label.Exclusive = getLabelExclusive(label.Name)
label.Name = getLabelNameWithoutPrefix(label.Name)
label.Color = pmapi.LabelColors[0]
if _, err := client.CreateLabel(label); err != nil {
if _, err := client.CreateLabel(context.TODO(), label); err != nil {
return errors.Wrap(err, "failed to create label")
}
return nil
@ -72,7 +73,7 @@ func (ctl *Controller) getLabelID(username, labelName string) (string, error) {
return "", fmt.Errorf("user %s does not exist", username)
}
labels, err := client.ListLabels()
labels, err := client.ListLabels(context.TODO())
if err != nil {
return "", errors.Wrap(err, "failed to list labels")
}

View File

@ -18,6 +18,7 @@
package liveapi
import (
"context"
"fmt"
messageUtils "github.com/ProtonMail/proton-bridge/pkg/message"
@ -50,15 +51,17 @@ func (ctl *Controller) AddUserMessage(username string, message *pmapi.Message) (
}
req := &pmapi.ImportMsgReq{
AddressID: message.AddressID,
Body: body,
Unread: message.Unread,
Time: message.Time,
Flags: message.Flags,
LabelIDs: message.LabelIDs,
Metadata: &pmapi.ImportMetadata{
AddressID: message.AddressID,
Unread: message.Unread,
Time: message.Time,
Flags: message.Flags,
LabelIDs: message.LabelIDs,
},
Message: body,
}
results, err := client.Import([]*pmapi.ImportMsgReq{req})
results, err := client.Import(context.TODO(), pmapi.ImportMsgReqs{req})
if err != nil {
return "", errors.Wrap(err, "failed to make an import")
}
@ -82,7 +85,7 @@ func (ctl *Controller) GetMessages(username, labelID string) ([]*pmapi.Message,
for {
// ListMessages returns empty result, not error, asking for page out of range.
pageMessages, _, err := client.ListMessages(&pmapi.MessagesFilter{
pageMessages, _, err := client.ListMessages(context.TODO(), &pmapi.MessagesFilter{
Page: page,
PageSize: 150,
LabelID: labelID,

View File

@ -18,6 +18,8 @@
package liveapi
import (
"context"
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
"github.com/cucumber/godog"
"github.com/pkg/errors"
@ -28,19 +30,12 @@ func (ctl *Controller) AddUser(user *pmapi.User, addresses *pmapi.AddressList, p
return godog.ErrPending
}
client := ctl.clientManager.GetClient(user.ID)
authInfo, err := client.AuthInfo(user.Name)
client, _, err := ctl.clientManager.NewClientWithLogin(context.TODO(), user.Name, password)
if err != nil {
return errors.Wrap(err, "failed to get auth info")
return errors.Wrap(err, "failed to create new client")
}
_, err = client.Auth(user.Name, password, authInfo)
if err != nil {
return errors.Wrap(err, "failed to auth user")
}
salt, err := client.AuthSalt()
salt, err := client.AuthSalt(context.TODO())
if err != nil {
return errors.Wrap(err, "failed to get salt")
}
@ -50,7 +45,7 @@ func (ctl *Controller) AddUser(user *pmapi.User, addresses *pmapi.AddressList, p
return errors.Wrap(err, "failed to hash mailbox password")
}
if err := client.Unlock([]byte(mailboxPassword)); err != nil {
if err := client.Unlock(context.TODO(), mailboxPassword); err != nil {
return errors.Wrap(err, "failed to unlock user")
}
@ -64,7 +59,5 @@ func (ctl *Controller) AddUser(user *pmapi.User, addresses *pmapi.AddressList, p
}
func (ctl *Controller) ReorderAddresses(user *pmapi.User, addressIDs []string) error {
client := ctl.clientManager.GetClient(user.ID)
return client.ReorderAddresses(addressIDs)
return ctl.pmapiByUsername[user.Name].ReorderAddresses(context.TODO(), addressIDs)
}