From bc078964369f374a915c05916e75e5c15383b9b7 Mon Sep 17 00:00:00 2001 From: Michal Horejsek Date: Mon, 31 Aug 2020 17:23:22 +0200 Subject: [PATCH] Sentry report after parser panic --- internal/importexport/importexport.go | 2 +- internal/transfer/provider_pmapi.go | 4 +++- internal/transfer/provider_pmapi_target.go | 11 ++++++++++- internal/transfer/provider_pmapi_test.go | 12 ++++++------ internal/transfer/transfer_test.go | 3 +++ 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/internal/importexport/importexport.go b/internal/importexport/importexport.go index 3cab2c92..26a3e1c2 100644 --- a/internal/importexport/importexport.go +++ b/internal/importexport/importexport.go @@ -167,5 +167,5 @@ func (ie *ImportExport) getPMAPIProvider(address string) (*transfer.PMAPIProvide log.WithError(err).Info("Address does not exist, using all addresses") } - return transfer.NewPMAPIProvider(ie.clientManager, user.ID(), addressID) + return transfer.NewPMAPIProvider(ie.config.GetAPIConfig(), ie.clientManager, user.ID(), addressID) } diff --git a/internal/transfer/provider_pmapi.go b/internal/transfer/provider_pmapi.go index 3baa5993..33210b9b 100644 --- a/internal/transfer/provider_pmapi.go +++ b/internal/transfer/provider_pmapi.go @@ -27,6 +27,7 @@ import ( // PMAPIProvider implements import and export to/from ProtonMail server. type PMAPIProvider struct { + clientConfig *pmapi.ClientConfig clientManager ClientManager userID string addressID string @@ -37,8 +38,9 @@ type PMAPIProvider struct { } // NewPMAPIProvider returns new PMAPIProvider. -func NewPMAPIProvider(clientManager ClientManager, userID, addressID string) (*PMAPIProvider, error) { +func NewPMAPIProvider(config *pmapi.ClientConfig, clientManager ClientManager, userID, addressID string) (*PMAPIProvider, error) { provider := &PMAPIProvider{ + clientConfig: config, clientManager: clientManager, userID: userID, addressID: addressID, diff --git a/internal/transfer/provider_pmapi_target.go b/internal/transfer/provider_pmapi_target.go index 2220bcfc..9fd3d3af 100644 --- a/internal/transfer/provider_pmapi_target.go +++ b/internal/transfer/provider_pmapi_target.go @@ -25,6 +25,7 @@ import ( pkgMessage "github.com/ProtonMail/proton-bridge/pkg/message" "github.com/ProtonMail/proton-bridge/pkg/pmapi" + "github.com/ProtonMail/proton-bridge/pkg/sentry" "github.com/pkg/errors" ) @@ -211,7 +212,15 @@ func (p *PMAPIProvider) parseMessage(msg Message) (m *pmapi.Message, r []io.Read // Instead of crashing we try to convert to regular error. defer func() { if r := recover(); r != nil { - err = fmt.Errorf("%v", r) + err = fmt.Errorf("panic while parse: %v", r) + if sentryErr := sentry.ReportSentryCrash( + p.clientConfig.ClientID, + p.clientConfig.AppVersion, + p.clientConfig.UserAgent, + err, + ); sentryErr != nil { + log.Error("Sentry crash report failed: ", sentryErr) + } } }() message, _, _, attachmentReaders, err := pkgMessage.Parse(bytes.NewBuffer(msg.Body), "", "") diff --git a/internal/transfer/provider_pmapi_test.go b/internal/transfer/provider_pmapi_test.go index 76ce8327..fd32b887 100644 --- a/internal/transfer/provider_pmapi_test.go +++ b/internal/transfer/provider_pmapi_test.go @@ -33,7 +33,7 @@ func TestPMAPIProviderMailboxes(t *testing.T) { defer m.ctrl.Finish() setupPMAPIClientExpectationForExport(&m) - provider, err := NewPMAPIProvider(m.clientManager, "user", "addressID") + provider, err := NewPMAPIProvider(m.pmapiConfig, m.clientManager, "user", "addressID") r.NoError(t, err) tests := []struct { @@ -78,7 +78,7 @@ func TestPMAPIProviderTransferTo(t *testing.T) { defer m.ctrl.Finish() setupPMAPIClientExpectationForExport(&m) - provider, err := NewPMAPIProvider(m.clientManager, "user", "addressID") + provider, err := NewPMAPIProvider(m.pmapiConfig, m.clientManager, "user", "addressID") r.NoError(t, err) rules, rulesClose := newTestRules(t) @@ -96,7 +96,7 @@ func TestPMAPIProviderTransferFrom(t *testing.T) { defer m.ctrl.Finish() setupPMAPIClientExpectationForImport(&m) - provider, err := NewPMAPIProvider(m.clientManager, "user", "addressID") + provider, err := NewPMAPIProvider(m.pmapiConfig, m.clientManager, "user", "addressID") r.NoError(t, err) rules, rulesClose := newTestRules(t) @@ -114,7 +114,7 @@ func TestPMAPIProviderTransferFromDraft(t *testing.T) { defer m.ctrl.Finish() setupPMAPIClientExpectationForImportDraft(&m) - provider, err := NewPMAPIProvider(m.clientManager, "user", "addressID") + provider, err := NewPMAPIProvider(m.pmapiConfig, m.clientManager, "user", "addressID") r.NoError(t, err) rules, rulesClose := newTestRules(t) @@ -133,9 +133,9 @@ func TestPMAPIProviderTransferFromTo(t *testing.T) { setupPMAPIClientExpectationForExport(&m) setupPMAPIClientExpectationForImport(&m) - source, err := NewPMAPIProvider(m.clientManager, "user", "addressID") + source, err := NewPMAPIProvider(m.pmapiConfig, m.clientManager, "user", "addressID") r.NoError(t, err) - target, err := NewPMAPIProvider(m.clientManager, "user", "addressID") + target, err := NewPMAPIProvider(m.pmapiConfig, m.clientManager, "user", "addressID") r.NoError(t, err) rules, rulesClose := newTestRules(t) diff --git a/internal/transfer/transfer_test.go b/internal/transfer/transfer_test.go index 2d0128f9..653407f9 100644 --- a/internal/transfer/transfer_test.go +++ b/internal/transfer/transfer_test.go @@ -23,6 +23,7 @@ import ( "github.com/ProtonMail/gopenpgp/v2/crypto" transfermocks "github.com/ProtonMail/proton-bridge/internal/transfer/mocks" + "github.com/ProtonMail/proton-bridge/pkg/pmapi" pmapimocks "github.com/ProtonMail/proton-bridge/pkg/pmapi/mocks" gomock "github.com/golang/mock/gomock" ) @@ -34,6 +35,7 @@ type mocks struct { panicHandler *transfermocks.MockPanicHandler clientManager *transfermocks.MockClientManager pmapiClient *pmapimocks.MockClient + pmapiConfig *pmapi.ClientConfig keyring *crypto.KeyRing } @@ -48,6 +50,7 @@ func initMocks(t *testing.T) mocks { panicHandler: transfermocks.NewMockPanicHandler(mockCtrl), clientManager: transfermocks.NewMockClientManager(mockCtrl), pmapiClient: pmapimocks.NewMockClient(mockCtrl), + pmapiConfig: &pmapi.ClientConfig{}, keyring: newTestKeyring(), }