diff --git a/Changelog.md b/Changelog.md index 34bd981e..268c9bc2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,13 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## [Bridge 3.0.8] Perth Narrows + +### Fixed +* Other: Add sentry reports for event processing failures. +* Other: Do not fail on label events. + + ## [Bridge 3.0.7] Perth Narrows ### Fixed diff --git a/Makefile b/Makefile index 980b4c4a..f182c89c 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) .PHONY: build build-gui build-nogui build-launcher versioner hasher # Keep version hardcoded so app build works also without Git repository. -BRIDGE_APP_VERSION?=3.0.7+git +BRIDGE_APP_VERSION?=3.0.8+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG diff --git a/internal/user/events.go b/internal/user/events.go index bb14b710..b76926fa 100644 --- a/internal/user/events.go +++ b/internal/user/events.go @@ -155,16 +155,31 @@ func (user *User) handleAddressEvents(ctx context.Context, addressEvents []proto switch event.Action { case proton.EventCreate: if err := user.handleCreateAddressEvent(ctx, event); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply address create event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report address create event error") + } return fmt.Errorf("failed to handle create address event: %w", err) } case proton.EventUpdate, proton.EventUpdateFlags: if err := user.handleUpdateAddressEvent(ctx, event); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply address update event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report address update event error") + } return fmt.Errorf("failed to handle update address event: %w", err) } case proton.EventDelete: if err := user.handleDeleteAddressEvent(ctx, event); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply address delete event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report address delete event error") + } return fmt.Errorf("failed to delete address: %w", err) } } @@ -303,11 +318,9 @@ func (user *User) handleCreateLabelEvent(_ context.Context, event proton.LabelEv }).Info("Handling label created event") if _, ok := user.apiLabels[event.Label.ID]; ok { - return fmt.Errorf("label %q already exists", event.ID) + user.apiLabels[event.Label.ID] = event.Label } - user.apiLabels[event.Label.ID] = event.Label - for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) { updateCh.Enqueue(newMailboxCreatedUpdate(imap.MailboxID(event.ID), getMailboxName(event.Label))) } @@ -330,11 +343,9 @@ func (user *User) handleUpdateLabelEvent(_ context.Context, event proton.LabelEv }).Info("Handling label updated event") if _, ok := user.apiLabels[event.Label.ID]; !ok { - return fmt.Errorf("label %q does not exist", event.ID) + user.apiLabels[event.Label.ID] = event.Label } - user.apiLabels[event.Label.ID] = event.Label - for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) { updateCh.Enqueue(imap.NewMailboxUpdated( imap.MailboxID(event.ID), @@ -358,11 +369,9 @@ func (user *User) handleDeleteLabelEvent(_ context.Context, event proton.LabelEv label, ok := user.apiLabels[event.ID] if !ok { - return fmt.Errorf("label %q does not exist", event.ID) + delete(user.apiLabels, event.ID) } - delete(user.apiLabels, event.ID) - for _, updateCh := range xslices.Unique(maps.Values(user.updateCh)) { updateCh.Enqueue(imap.NewMailboxDeleted(imap.MailboxID(event.ID))) } @@ -378,7 +387,7 @@ func (user *User) handleDeleteLabelEvent(_ context.Context, event proton.LabelEv } // handleMessageEvents handles the given message events. -func (user *User) handleMessageEvents(ctx context.Context, messageEvents []proton.MessageEvent) error { +func (user *User) handleMessageEvents(ctx context.Context, messageEvents []proton.MessageEvent) error { //nolint:funlen for _, event := range messageEvents { ctx = logging.WithLogrusField(ctx, "messageID", event.ID) @@ -388,6 +397,11 @@ func (user *User) handleMessageEvents(ctx context.Context, messageEvents []proto logging.WithLogrusField(ctx, "action", "create message"), event, ); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply create message event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report create message event error") + } return fmt.Errorf("failed to handle create message event: %w", err) } @@ -398,6 +412,11 @@ func (user *User) handleMessageEvents(ctx context.Context, messageEvents []proto logging.WithLogrusField(ctx, "action", "update draft"), event, ); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply update draft message event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report update draft message event error") + } return fmt.Errorf("failed to handle update draft event: %w", err) } @@ -412,6 +431,11 @@ func (user *User) handleMessageEvents(ctx context.Context, messageEvents []proto logging.WithLogrusField(ctx, "action", "update message"), event, ); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply update message event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report update message event error") + } return fmt.Errorf("failed to handle update message event: %w", err) } @@ -420,6 +444,11 @@ func (user *User) handleMessageEvents(ctx context.Context, messageEvents []proto logging.WithLogrusField(ctx, "action", "delete message"), event, ); err != nil { + if rerr := user.reporter.ReportMessageWithContext("Failed to apply delete message event", reporter.Context{ + "error": err, + }); rerr != nil { + user.log.WithError(err).Error("Failed to report delete message event error") + } return fmt.Errorf("failed to handle delete message event: %w", err) } } @@ -523,7 +552,7 @@ func (user *User) handleUpdateDraftEvent(ctx context.Context, event proton.Messa user.log.WithError(err).Error("Failed to add failed message ID to vault") } - if err := user.reporter.ReportMessageWithContext("Failed to build message (event update)", reporter.Context{ + if err := user.reporter.ReportMessageWithContext("Failed to build draft message (event update)", reporter.Context{ "messageID": res.messageID, "error": res.err, }); err != nil {