GODT-2223: Fix handling of create/update label events

This commit is contained in:
James Houlahan
2023-01-17 17:23:01 +01:00
committed by Leander Beernaert
parent d68014ec7b
commit e35f3b6056
3 changed files with 14 additions and 10 deletions

View File

@ -21,10 +21,12 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/ProtonMail/gluon/reporter"
"github.com/ProtonMail/proton-bridge/v3/internal/events" "github.com/ProtonMail/proton-bridge/v3/internal/events"
"github.com/ProtonMail/proton-bridge/v3/internal/safe" "github.com/ProtonMail/proton-bridge/v3/internal/safe"
"github.com/ProtonMail/proton-bridge/v3/internal/user" "github.com/ProtonMail/proton-bridge/v3/internal/user"
"github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/ProtonMail/proton-bridge/v3/internal/vault"
"github.com/sirupsen/logrus"
) )
func (bridge *Bridge) handleUserEvent(ctx context.Context, user *user.User, event events.Event) error { func (bridge *Bridge) handleUserEvent(ctx context.Context, user *user.User, event events.Event) error {
@ -53,7 +55,7 @@ func (bridge *Bridge) handleUserEvent(ctx context.Context, user *user.User, even
bridge.handleUserDeauth(ctx, user) bridge.handleUserDeauth(ctx, user)
case events.UserBadEvent: case events.UserBadEvent:
bridge.handleUserBadEvent(ctx, user) bridge.handleUserBadEvent(ctx, user, event.Error)
} }
return nil return nil
@ -134,8 +136,14 @@ func (bridge *Bridge) handleUserDeauth(ctx context.Context, user *user.User) {
}, bridge.usersLock) }, bridge.usersLock)
} }
func (bridge *Bridge) handleUserBadEvent(ctx context.Context, user *user.User) { func (bridge *Bridge) handleUserBadEvent(ctx context.Context, user *user.User, err error) {
safe.Lock(func() { safe.Lock(func() {
if rerr := bridge.reporter.ReportMessageWithContext("Failed to handle event", reporter.Context{
"error": err,
}); rerr != nil {
logrus.WithError(rerr).Error("Failed to report failed event handling")
}
bridge.logoutUser(ctx, user, true, false) bridge.logoutUser(ctx, user, true, false)
}, bridge.usersLock) }, bridge.usersLock)
} }

View File

@ -21,8 +21,6 @@ import "errors"
var ( var (
ErrNoSuchAddress = errors.New("no such address") ErrNoSuchAddress = errors.New("no such address")
ErrNotImplemented = errors.New("not implemented")
ErrNotSupported = errors.New("not supported")
ErrInvalidReturnPath = errors.New("invalid return path") ErrInvalidReturnPath = errors.New("invalid return path")
ErrInvalidRecipient = errors.New("invalid recipient") ErrInvalidRecipient = errors.New("invalid recipient")
ErrMissingAddrKey = errors.New("missing address key") ErrMissingAddrKey = errors.New("missing address key")

View File

@ -333,14 +333,13 @@ func (user *User) handleLabelEvents(ctx context.Context, labelEvents []proton.La
func (user *User) handleCreateLabelEvent(ctx context.Context, event proton.LabelEvent) ([]imap.Update, error) { //nolint:unparam func (user *User) handleCreateLabelEvent(ctx context.Context, event proton.LabelEvent) ([]imap.Update, error) { //nolint:unparam
return safe.LockRetErr(func() ([]imap.Update, error) { return safe.LockRetErr(func() ([]imap.Update, error) {
var updates []imap.Update var updates []imap.Update
user.log.WithFields(logrus.Fields{ user.log.WithFields(logrus.Fields{
"labelID": event.ID, "labelID": event.ID,
"name": logging.Sensitive(event.Label.Name), "name": logging.Sensitive(event.Label.Name),
}).Info("Handling label created event") }).Info("Handling label created event")
if _, ok := user.apiLabels[event.Label.ID]; ok { user.apiLabels[event.Label.ID] = event.Label
user.apiLabels[event.Label.ID] = event.Label
}
for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) { for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) {
update := newMailboxCreatedUpdate(imap.MailboxID(event.ID), getMailboxName(event.Label)) update := newMailboxCreatedUpdate(imap.MailboxID(event.ID), getMailboxName(event.Label))
@ -361,14 +360,13 @@ func (user *User) handleCreateLabelEvent(ctx context.Context, event proton.Label
func (user *User) handleUpdateLabelEvent(ctx context.Context, event proton.LabelEvent) ([]imap.Update, error) { //nolint:unparam func (user *User) handleUpdateLabelEvent(ctx context.Context, event proton.LabelEvent) ([]imap.Update, error) { //nolint:unparam
return safe.LockRetErr(func() ([]imap.Update, error) { return safe.LockRetErr(func() ([]imap.Update, error) {
var updates []imap.Update var updates []imap.Update
user.log.WithFields(logrus.Fields{ user.log.WithFields(logrus.Fields{
"labelID": event.ID, "labelID": event.ID,
"name": logging.Sensitive(event.Label.Name), "name": logging.Sensitive(event.Label.Name),
}).Info("Handling label updated event") }).Info("Handling label updated event")
if _, ok := user.apiLabels[event.Label.ID]; !ok { user.apiLabels[event.Label.ID] = event.Label
user.apiLabels[event.Label.ID] = event.Label
}
for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) { for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) {
update := imap.NewMailboxUpdated( update := imap.NewMailboxUpdated(