diff --git a/go.mod b/go.mod index 061f13c9..d72b651c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.21.9 require ( github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557 github.com/Masterminds/semver/v3 v3.2.0 - github.com/ProtonMail/gluon v0.17.1-0.20240514133734-79cdd0fec41c + github.com/ProtonMail/gluon v0.17.1-0.20240923151549-d23b4bec3602 github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a github.com/ProtonMail/go-proton-api v0.4.1-0.20240918100656-b4860af56d47 github.com/ProtonMail/gopenpgp/v2 v2.7.4-proton diff --git a/go.sum b/go.sum index 698371ba..6b77452a 100644 --- a/go.sum +++ b/go.sum @@ -29,6 +29,12 @@ github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= github.com/ProtonMail/gluon v0.17.1-0.20240514133734-79cdd0fec41c h1:P3SvCACt13Zqdj0IRDB4bgwqI68+oMB2j0uVuPQyoTw= github.com/ProtonMail/gluon v0.17.1-0.20240514133734-79cdd0fec41c/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= +github.com/ProtonMail/gluon v0.17.1-0.20240918150504-3b2e7f40d961 h1:kCaz78X7OKETvK6AGHeyggHKxDBcqX7EWHf7spJ+D3g= +github.com/ProtonMail/gluon v0.17.1-0.20240918150504-3b2e7f40d961/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= +github.com/ProtonMail/gluon v0.17.1-0.20240923094038-e319bf6047c5 h1:LzaUpUj6M2PEBArFCkaimViNpGXDgwHVrdhvYwHLoJQ= +github.com/ProtonMail/gluon v0.17.1-0.20240923094038-e319bf6047c5/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= +github.com/ProtonMail/gluon v0.17.1-0.20240923151549-d23b4bec3602 h1:EoMjWlC32tg46L/07hWoiZfLkqJyxVMcsq4Cyn+Ofqc= +github.com/ProtonMail/gluon v0.17.1-0.20240923151549-d23b4bec3602/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a h1:D+aZah+k14Gn6kmL7eKxoo/4Dr/lK3ChBcwce2+SQP4= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a/go.mod h1:oTGdE7/DlWIr23G0IKW3OXK9wZ5Hw1GGiaJFccTvZi4= github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= diff --git a/internal/bridge/sentry_test.go b/internal/bridge/sentry_test.go index 2083ed90..1f8f5e5d 100644 --- a/internal/bridge/sentry_test.go +++ b/internal/bridge/sentry_test.go @@ -29,13 +29,12 @@ import ( "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/constants" "github.com/ProtonMail/proton-bridge/v3/internal/events" - "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) func TestBridge_Report(t *testing.T) { withEnv(t, func(ctx context.Context, s *server.Server, netCtl *proton.NetCtl, locator bridge.Locator, storeKey []byte) { - withBridge(ctx, t, s.GetHostURL(), netCtl, locator, storeKey, func(b *bridge.Bridge, mocks *bridge.Mocks) { + withBridge(ctx, t, s.GetHostURL(), netCtl, locator, storeKey, func(b *bridge.Bridge, _ *bridge.Mocks) { syncCh, done := chToType[events.Event, events.SyncFinished](b.GetEvents(events.SyncFinished{})) defer done() @@ -56,12 +55,6 @@ func TestBridge_Report(t *testing.T) { require.NoError(t, err) defer func() { require.NoError(t, conn.Close()) }() - // Sending garbage to the IMAP port should cause the bridge to report it. - mocks.Reporter.EXPECT().ReportMessageWithContext( - gomock.Eq("Failed to parse IMAP command"), - gomock.Any(), - ).Return(nil) - // Read lines from the IMAP port. lineCh := liner.New(conn).Lines(func() error { return nil }) diff --git a/internal/bridge/user_events.go b/internal/bridge/user_events.go index c4ef89aa..c41f771c 100644 --- a/internal/bridge/user_events.go +++ b/internal/bridge/user_events.go @@ -38,9 +38,6 @@ func (bridge *Bridge) handleUserEvent(ctx context.Context, user *user.User, even case events.UserLoadedCheckResync: user.VerifyResyncAndExecute() - - case events.UncategorizedEventError: - bridge.handleUncategorizedErrorEvent(event) } } @@ -67,12 +64,3 @@ func (bridge *Bridge) handleUserBadEvent(ctx context.Context, user *user.User, e user.OnBadEvent(ctx) }, bridge.usersLock) } - -func (bridge *Bridge) handleUncategorizedErrorEvent(event events.UncategorizedEventError) { - if rerr := bridge.reporter.ReportMessageWithContext("Failed to handle due to uncategorized error", reporter.Context{ - "error_type": internal.ErrCauseType(event.Error), - "error": event.Error, - }); rerr != nil { - logrus.WithField("pkg", "bridge/event").WithError(rerr).Error("Failed to report failed event handling") - } -} diff --git a/internal/frontend/bridge-gui/bridge-gui/main.cpp b/internal/frontend/bridge-gui/bridge-gui/main.cpp index dcb6025d..8c214363 100644 --- a/internal/frontend/bridge-gui/bridge-gui/main.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/main.cpp @@ -54,6 +54,7 @@ QString const bridgeGUILock = "bridge-v3-gui.lock"; ///< The file name used for QString const exeName = "bridge" + exeSuffix; ///< The bridge executable file name.* qint64 constexpr grpcServiceConfigWaitDelayMs = 180000; ///< The wait delay for the gRPC config file in milliseconds. QString const waitFlag = "--wait"; ///< The wait command-line flag. +QString const orphanInstanceException = "An orphan instance of bridge is already running. Please terminate it and relaunch the application."; } // anonymous namespace @@ -317,7 +318,7 @@ int main(int argc, char *argv[]) { QString bridgeExe; if (!cliOptions.attach) { if (isBridgeRunning()) { - throw Exception("An orphan instance of bridge is already running. Please terminate it and relaunch the application.", + throw Exception(orphanInstanceException, QString(), __FUNCTION__, tailOfLatestBridgeLog(sessionID)); } @@ -413,13 +414,18 @@ int main(int argc, char *argv[]) { lock.unlock(); return result; } catch (Exception const &e) { - sentry_uuid_s const uuid = reportSentryException("Exception occurred during main", e); QString message = e.qwhat(); if (e.showSupportLink()) { message += R"(

If the issue persists, please contact our customer support.)"; } QMessageBox::critical(nullptr, "Error", message); - QTextStream(stderr) << "reportID: " << QByteArray(uuid.bytes, 16).toHex() << " Captured exception :" << e.detailedWhat() << "\n"; + + if (e.qwhat() != orphanInstanceException) { + sentry_uuid_s const uuid = reportSentryException("Exception occurred during main", e); + QTextStream(stderr) << "reportID: " << QByteArray(uuid.bytes, 16).toHex() << " Captured exception :" + << e.detailedWhat() << "\n"; + } + return EXIT_FAILURE; } } diff --git a/internal/services/imapservice/connector.go b/internal/services/imapservice/connector.go index 70a64079..413f2ac3 100644 --- a/internal/services/imapservice/connector.go +++ b/internal/services/imapservice/connector.go @@ -31,7 +31,6 @@ import ( "github.com/ProtonMail/gluon/connector" "github.com/ProtonMail/gluon/imap" "github.com/ProtonMail/gluon/reporter" - "github.com/ProtonMail/gluon/rfc5322" "github.com/ProtonMail/gluon/rfc822" "github.com/ProtonMail/go-proton-api" "github.com/ProtonMail/gopenpgp/v2/crypto" @@ -690,8 +689,6 @@ func (s *Connector) importMessage( isDraft := slices.Contains(labelIDs, proton.DraftsLabel) - s.reportGODT3185(isDraft, addr.Email, p, s.addressMode == usertypes.AddressModeCombined) - if err := s.identityState.WithAddrKR(s.addrID, func(_, addrKR *crypto.KeyRing) error { primaryKey, errKey := addrKR.FirstKey() if errKey != nil { @@ -877,80 +874,3 @@ func stripPlusAlias(a string) string { func equalAddresses(a, b string) bool { return strings.EqualFold(stripPlusAlias(a), stripPlusAlias(b)) } - -func (s *Connector) reportGODT3185(isDraft bool, defaultAddr string, p *parser.Parser, isCombinedMode bool) { - reportAction := "draft" - if !isDraft { - reportAction = "import" - } - - reportMode := "combined" - if !isCombinedMode { - reportMode = "split" - } - - senderAddr := "" - if p != nil && p.Root() != nil && p.Root().Header.Len() != 0 { - addrField := p.Root().Header.Get("From") - if addrField == "" { - addrField = p.Root().Header.Get("Sender") - } - if addrField != "" { - sender, err := rfc5322.ParseAddressList(addrField) - if err == nil && len(sender) > 0 { - senderAddr = sender[0].Address - } else { - s.log.WithError(err).Warn("Invalid sender address in reporter") - } - } - } - - if equalAddresses(defaultAddr, senderAddr) { - return - } - - isDisabled := false - isUserAddress := false - for _, a := range s.identityState.GetAddresses() { - if !equalAddresses(a.Email, senderAddr) { - continue - } - - isUserAddress = true - isDisabled = !bool(a.Send) || (a.Status != proton.AddressStatusEnabled) - break - } - - if !isUserAddress && senderAddr != "" { - return - } - - reportResult := "using sender address" - - if !isCombinedMode { - reportResult = "error address not match" - } - - reportAddress := "" - if senderAddr == "" { - reportAddress = " invalid" - reportResult = "error import/draft" - } - - if isDisabled { - reportAddress = " disabled" - if isDraft { - reportResult = "error draft" - } - } - - report := fmt.Sprintf( - "GODT-3185: %s with non-default%s address in %s mode: %s", - reportAction, reportAddress, reportMode, reportResult, - ) - - s.log.Warn(report) - if s.reporter != nil { - _ = s.reporter.ReportMessage(report) - } -} diff --git a/internal/services/smtp/smtp.go b/internal/services/smtp/smtp.go index 34ebfa96..9cfa205c 100644 --- a/internal/services/smtp/smtp.go +++ b/internal/services/smtp/smtp.go @@ -30,7 +30,6 @@ import ( "time" "github.com/ProtonMail/gluon/async" - "github.com/ProtonMail/gluon/reporter" "github.com/ProtonMail/gluon/rfc5322" "github.com/ProtonMail/gluon/rfc822" "github.com/ProtonMail/go-proton-api" @@ -197,13 +196,7 @@ func (s *Service) sendWithKey( } parentID, draftsToDelete, err := getParentID(ctx, s.client, authAddrID, addrMode, references) if err != nil { - if err := s.reporter.ReportMessageWithContext("Failed to get parent ID", reporter.Context{ - "error": err, - "references": message.References, - }); err != nil { - logrus.WithError(err).Error("Failed to report error") - } - + // Sentry event has been removed; should be replaced with observability - BRIDGE-206. s.log.WithError(err).Warn("Failed to get parent ID") } diff --git a/tests/features/imap/message/create.feature b/tests/features/imap/message/create.feature index d1f41c92..9b7305c4 100644 --- a/tests/features/imap/message/create.feature +++ b/tests/features/imap/message/create.feature @@ -57,7 +57,6 @@ Feature: IMAP create messages And IMAP client "1" eventually sees the following messages in "All Mail": | from | to | subject | body | | [alias:alias]@[domain] | john.doe@email.com | foo | bar | - And bridge reports a message with "GODT-3185: import with non-default address in combined mode: using sender address" Scenario: Imports an unrelated message to inbox When IMAP client "1" appends the following messages to "INBOX": diff --git a/tests/features/imap/message/drafts.feature b/tests/features/imap/message/drafts.feature index f97c1945..12eb19e2 100644 --- a/tests/features/imap/message/drafts.feature +++ b/tests/features/imap/message/drafts.feature @@ -164,7 +164,6 @@ Feature: IMAP Draft messages And IMAP client "1" eventually sees the following messages in "Drafts": | to | subject | body | | someone@example.com | Draft without From | This is a Draft without From in header | - And bridge reports a message with "GODT-3185: draft with non-default invalid address in combined mode: error import/draft" @regression Scenario: Only one draft in Drafts and All Mail after editing it locally multiple times