From 71063ac5eecd165ce2db327426d7102f1be484c5 Mon Sep 17 00:00:00 2001 From: Jakub Date: Fri, 1 Sep 2023 14:44:27 +0200 Subject: [PATCH 01/58] fix(GODT-2902): do not check for changed values. Related to GODT-2857. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5cdf8ab2..eae0c022 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557 github.com/Masterminds/semver/v3 v3.2.0 - github.com/ProtonMail/gluon v0.16.1-0.20230808094407-85a10f17ae92 + github.com/ProtonMail/gluon v0.16.1-0.20230901124123-075229a92cc4 github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a github.com/ProtonMail/go-proton-api v0.4.1-0.20230727082922-9115b4750ec7 github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton diff --git a/go.sum b/go.sum index 69f79877..1e4090b0 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ 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/docker-credential-helpers v1.1.0 h1:+kvUIpwWcbtP3WFv5sSvkFn/XLzSqPOB5AAthuk9xPk= github.com/ProtonMail/docker-credential-helpers v1.1.0/go.mod h1:mK0aBveCxhnQ756AmaTfXMZDeULvheYVhF/MWMErN5g= -github.com/ProtonMail/gluon v0.16.1-0.20230808094407-85a10f17ae92 h1:yoaUatxdB6EXChiWdfIBpasJJxrQ6dHJknG0hwBAqmQ= -github.com/ProtonMail/gluon v0.16.1-0.20230808094407-85a10f17ae92/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= +github.com/ProtonMail/gluon v0.16.1-0.20230901124123-075229a92cc4 h1:Uq2v2NYEtlTaK2WTh9BMph2Kv51JxMgvTkd7CjGPYc8= +github.com/ProtonMail/gluon v0.16.1-0.20230901124123-075229a92cc4/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= 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= From a80fd92018438d8ec05d5d11560054537b9d947f Mon Sep 17 00:00:00 2001 From: Jakub Date: Fri, 1 Sep 2023 15:12:34 +0200 Subject: [PATCH 02/58] chore: Trift Bridge 3.4.2 changelog. --- Changelog.md | 6 ++++++ Makefile | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index e635f946..ff849841 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,12 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Trift Bridge 3.4.2 + +### Fixed +* GODT-2902: Do not check for changed values. Related to GODT-2857. + + ## Trift Bridge 3.4.1 ### Fixed diff --git a/Makefile b/Makefile index e61b1f7d..4aff7b68 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.4.1+git +BRIDGE_APP_VERSION?=3.4.2+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG From 86e8a566c741d0d4ac72bc355daa92eb8cd1f216 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 12 Sep 2023 07:45:08 +0200 Subject: [PATCH 03/58] chore: Umshiang Bridge 3.5.0 changelog. --- Changelog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changelog.md b/Changelog.md index 75db7f60..9f72ff55 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,8 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) ## Umshiang Bridge 3.5.0 ### Added +* GODT-2734: Add testing steps to modify account settings. +* GODT-2746: Integration tests for reporting a problem. * GODT-2891: Allow message create & delete during sync. * GODT-2848: Decouple IMAP service from Event Loop. * Add trace profiling option. @@ -19,6 +21,8 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * GODT-2803: Bridge Database access. ### Changed +* GODT-2909: Remove Timeout on event publish. +* GODT-2913: Reduce the number of configuration failure detected. * GODT-2828: Increase sync progress report frequency. * Test: Fix TestBridge_SyncWithOnGoingEvents. * GODT-2871: Is telemetry enabled as service. From 45d2e9ea639a9c1f9c12781e815b4e7cd071874d Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 13 Sep 2023 10:25:47 +0200 Subject: [PATCH 04/58] chore: update changelog. --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index 9f72ff55..918165f2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -75,6 +75,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * GODT-2780: Fix 'QSystemTrayIcon::setVisible: No Icon set' warning in bridge-gui log on startup. * GODT-2778: Fix login screen being disabled after an 'already logged in' error. * Fix typos found by codespell. +* GODT-2577: Answered flag should only be applied to replied messages. ## Trift Bridge 3.4.1 From e6b312b437494ed8866490ed7be4474625596b5f Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Tue, 26 Sep 2023 09:08:25 +0200 Subject: [PATCH 05/58] fix(GODT-2949): Fix close of close channel in event service This issue is triggered due to the `Service.Close()` call after the go-routine for the event service exists. It is possible that during this period a recently added subscriber with `pendingOpAdd` gets cancelled and closed. However, the subscriber later also enqueues a `pendingOpRemove` which gets processed again with a call in `user.eventService.Close()` leading to the double close panic. This patch simply removes the `s.Close()` from the service, and leaves the cleanup to called externally from user.Close() or user.Logout(). --- internal/services/userevents/service.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/services/userevents/service.go b/internal/services/userevents/service.go index 52e6d83d..104dfbe8 100644 --- a/internal/services/userevents/service.go +++ b/internal/services/userevents/service.go @@ -192,7 +192,6 @@ func (s *Service) run(ctx context.Context, lastEventID string) { defer s.cpc.Close() defer s.timer.Stop() defer s.log.Info("Exiting service") - defer s.Close() client := network.NewClientRetryWrapper(s.eventSource, &network.ExpCoolDown{}) @@ -303,14 +302,15 @@ func (s *Service) Close() { // Cleanup pending removes. for _, s := range s.pendingSubscriptions { - if s.op == pendingOpRemove { - if !processed.Contains(s.sub) { + if !processed.Contains(s.sub) { + processed.Add(s.sub) + + if s.op == pendingOpRemove { + s.sub.close() + } else { + s.sub.cancel() s.sub.close() } - } else { - s.sub.cancel() - s.sub.close() - processed.Add(s.sub) } } From 236c958703ed2b14702019bd0a2e1ab864b01ce8 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Tue, 26 Sep 2023 09:20:01 +0200 Subject: [PATCH 06/58] fix(GODT-2590): Fix send on closed channel Ensure periodic user tasks are terminated before the other user services. The panic triggered due to the fact that the telemetry service was shutdown before this periodic task. --- internal/user/user.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/user/user.go b/internal/user/user.go index 4e1470a6..e916bc81 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -589,6 +589,8 @@ func (user *User) Logout(ctx context.Context, withAPI bool) error { return fmt.Errorf("failed to remove user from imap server: %w", err) } + user.tasks.CancelAndWait() + // Stop Services user.serviceGroup.CancelAndWait() @@ -598,8 +600,6 @@ func (user *User) Logout(ctx context.Context, withAPI bool) error { // Close imap service. user.imapService.Close() - user.tasks.CancelAndWait() - if withAPI { user.log.Debug("Logging out from API") @@ -621,6 +621,9 @@ func (user *User) Logout(ctx context.Context, withAPI bool) error { func (user *User) Close() { user.log.Info("Closing user") + // Stop any ongoing background tasks. + user.tasks.CancelAndWait() + // Stop Services user.serviceGroup.CancelAndWait() @@ -630,9 +633,6 @@ func (user *User) Close() { // Close imap service. user.imapService.Close() - // Stop any ongoing background tasks. - user.tasks.CancelAndWait() - // Close the user's API client. user.client.Close() From bfe25e3a46c88725d9cd63a73de1b1b462c13239 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Tue, 26 Sep 2023 09:45:27 +0200 Subject: [PATCH 07/58] fix(GODT-2951): Negative WaitGroup Counter Do not defer call to `wg.Done()` in `job.onJobFinished`. If there is an error it will also call `wg.Done()`. --- internal/services/syncservice/job.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/internal/services/syncservice/job.go b/internal/services/syncservice/job.go index 8978ae6b..cad55c90 100644 --- a/internal/services/syncservice/job.go +++ b/internal/services/syncservice/job.go @@ -113,13 +113,14 @@ func (j *Job) onStageCompleted(ctx context.Context, count int64) { } func (j *Job) onJobFinished(ctx context.Context, lastMessageID string, count int64) { - defer j.wg.Done() - if err := j.state.SetLastMessageID(ctx, lastMessageID, count); err != nil { j.log.WithError(err).Error("Failed to store last synced message id") j.onError(err) return } + + // j.onError() also calls j.wg.Done(). + j.wg.Done() j.syncReporter.OnProgress(ctx, count) } From bbe19bf960fba367cfd22e559c12e3d5f19534f5 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Tue, 26 Sep 2023 12:47:53 +0200 Subject: [PATCH 08/58] fix(GODT-2956): Restore old deletion rules When unlabeling a message from trash we have to check if this message is present in another folder before perma-deleting. --- internal/services/imapservice/connector.go | 66 ++++++++++++++++++- tests/features/imap/message/copy.feature | 15 +++++ .../imap/message/delete_from_trash.feature | 6 +- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/internal/services/imapservice/connector.go b/internal/services/imapservice/connector.go index 03ca7dbe..e026752f 100644 --- a/internal/services/imapservice/connector.go +++ b/internal/services/imapservice/connector.go @@ -37,6 +37,7 @@ import ( "github.com/ProtonMail/proton-bridge/v3/pkg/message" "github.com/ProtonMail/proton-bridge/v3/pkg/message/parser" "github.com/bradenaw/juniper/stream" + "github.com/bradenaw/juniper/xslices" "github.com/sirupsen/logrus" "golang.org/x/exp/slices" ) @@ -334,8 +335,69 @@ func (s *Connector) RemoveMessagesFromMailbox(ctx context.Context, _ connector.I } if mboxID == proton.TrashLabel || mboxID == proton.DraftsLabel { - if err := s.client.DeleteMessage(ctx, msgIDs...); err != nil { - return err + const ChunkSize = 150 + var msgToPermaDelete []string + + rdLabels := s.labels.Read() + defer rdLabels.Close() + + // There's currently no limit on how many IDs we can filter on, + // but to be nice to API, let's chunk it by 150. + for _, messageIDs := range xslices.Chunk(messageIDs, ChunkSize) { + metadata, err := s.client.GetMessageMetadataPage(ctx, 0, ChunkSize, proton.MessageFilter{ + ID: usertypes.MapTo[imap.MessageID, string](messageIDs), + }) + if err != nil { + return err + } + + // If a message is not preset in any other label other than AllMail, AllDrafts and AllSent, it can be + // permanently deleted. + for _, m := range metadata { + var remainingLabels []string + + for _, id := range m.LabelIDs { + label, ok := rdLabels.GetLabel(id) + if !ok { + // Handle case where this label was newly introduced and we do not yet know about it. + logrus.WithField("labelID", id).Warnf("Unknown label found during expung from Trash, attempting to locate it") + label, err = s.client.GetLabel(ctx, id, proton.LabelTypeFolder, proton.LabelTypeSystem, proton.LabelTypeSystem) + if err != nil { + if errors.Is(err, proton.ErrNoSuchLabel) { + logrus.WithField("labelID", id).Warn("Label does not exist, ignoring") + continue + } + + logrus.WithField("labelID", id).Errorf("Failed to resolve label: %v", err) + return fmt.Errorf("failed to resolve label: %w", err) + } + } + if !WantLabel(label) { + continue + } + + if label.Type == proton.LabelTypeSystem && (id == proton.AllDraftsLabel || + id == proton.AllMailLabel || + id == proton.AllSentLabel || + id == proton.AllScheduledLabel) { + continue + } + + remainingLabels = append(remainingLabels, m.ID) + } + + if len(remainingLabels) == 0 { + msgToPermaDelete = append(msgToPermaDelete, m.ID) + } + } + } + + if len(msgToPermaDelete) != 0 { + logrus.Debugf("Following message(s) will be perma-deleted: %v", msgToPermaDelete) + + if err := s.client.DeleteMessage(ctx, msgToPermaDelete...); err != nil { + return err + } } } diff --git a/tests/features/imap/message/copy.feature b/tests/features/imap/message/copy.feature index 4dd0b6c6..1b44d794 100644 --- a/tests/features/imap/message/copy.feature +++ b/tests/features/imap/message/copy.feature @@ -85,3 +85,18 @@ Feature: IMAP copy messages | from | to | subject | unread | | john.doe@mail.com | [user:user]@[domain] | foo | false | + Scenario: Move message to trash then copy to folder does not delete message + When IMAP client "1" moves the message with subject "foo" from "INBOX" to "Trash" + And it succeeds + Then IMAP client "1" eventually sees the following messages in "Trash": + | from | to | subject | unread | + | john.doe@mail.com | [user:user]@[domain] | foo | false | + When IMAP client "1" copies the message with subject "foo" from "Trash" to "Folders/mbox" + And it succeeds + When IMAP client "1" marks the message with subject "foo" as deleted + Then it succeeds + When IMAP client "1" expunges + Then it succeeds + Then IMAP client "1" eventually sees the following messages in "Folders/mbox": + | from | to | subject | unread | + | john.doe@mail.com | [user:user]@[domain] | foo | false | diff --git a/tests/features/imap/message/delete_from_trash.feature b/tests/features/imap/message/delete_from_trash.feature index a8323e91..15446eed 100644 --- a/tests/features/imap/message/delete_from_trash.feature +++ b/tests/features/imap/message/delete_from_trash.feature @@ -7,7 +7,7 @@ Feature: IMAP remove messages from Trash | label | label | Then it succeeds - Scenario Outline: Message in Trash and some other label is permanently deleted + Scenario Outline: Message in Trash and some other label is not permanently deleted Given the address "[user:user]@[domain]" of account "[user:user]" has the following messages in "Trash": | from | to | subject | body | | john.doe@mail.com | [user:user]@[domain] | foo | hello | @@ -27,8 +27,8 @@ Feature: IMAP remove messages from Trash When IMAP client "1" expunges Then it succeeds And IMAP client "1" eventually sees 1 messages in "Trash" - And IMAP client "1" eventually sees 1 messages in "All Mail" - And IMAP client "1" eventually sees 0 messages in "Labels/label" + And IMAP client "1" eventually sees 2 messages in "All Mail" + And IMAP client "1" eventually sees 1 messages in "Labels/label" Scenario Outline: Message in Trash only is permanently deleted Given the address "[user:user]@[domain]" of account "[user:user]" has the following messages in "Trash": From 949666724d81e7619f4f79f523c5a0e31314c327 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 27 Sep 2023 10:54:50 +0200 Subject: [PATCH 09/58] chore: Umshiang Bridge 3.5.1 changelog. --- Changelog.md | 9 +++++++++ Makefile | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 918165f2..9538c1f9 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,15 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Umshiang Bridge 3.5.1 + +### Fixed +* GODT-2956: Restore old deletion rules. +* GODT-2951: Negative WaitGroup Counter. +* GODT-2590: Fix send on closed channel. +* GODT-2949: Fix close of close channel in event service. + + ## Umshiang Bridge 3.5.0 ### Added diff --git a/Makefile b/Makefile index 6f010be6..24d3ba27 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.5.0+git +BRIDGE_APP_VERSION?=3.5.1+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG From 0d03f84711a5399c640b71dfa1dde64ba372b94e Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Wed, 27 Sep 2023 11:30:46 +0200 Subject: [PATCH 10/58] fix(GODT-2963): Use multi error to report file removal errors Do not abort removing files on first error. Collect errors and try to remove as many as possible. This would cause some state files to not be removed on windows. --- pkg/files/removal.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/files/removal.go b/pkg/files/removal.go index 8f0b8db3..594f3010 100644 --- a/pkg/files/removal.go +++ b/pkg/files/removal.go @@ -72,11 +72,12 @@ func remove(dir string, except ...string) error { sort.Sort(sort.Reverse(sort.StringSlice(toRemove))) + var multiErr error for _, target := range toRemove { if err := os.RemoveAll(target); err != nil { - return err + multiErr = multierror.Append(multiErr, err) } } - return nil + return multiErr } From b7ef6e1486a69b3ed7aeb1462d7e9ad4bdeb58db Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 27 Sep 2023 13:18:23 +0200 Subject: [PATCH 11/58] chore: Umshiang Bridge 3.5.1 changelog. --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index 9538c1f9..5dc72bc3 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) ## Umshiang Bridge 3.5.1 ### Fixed +* GODT-2963: Use multi error to report file removal errors. * GODT-2956: Restore old deletion rules. * GODT-2951: Negative WaitGroup Counter. * GODT-2590: Fix send on closed channel. From 80c852a5b234e1f7a7a0d17383dd87f1fb719461 Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Tue, 3 Oct 2023 10:48:46 +0200 Subject: [PATCH 12/58] fix(GODT-2992): fix link in 'no account view' in main window after 2FA or TOTP are cancelled. (cherry picked from commit 1c344211d1ab436c80b4c0c185dc34af45d074e8) --- .../bridge-gui/qml/SetupWizard/LeftPane.qml | 10 ---------- .../bridge-gui/qml/SetupWizard/SetupWizard.qml | 11 +++++++++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml index 433c1ac1..e809aa98 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml @@ -75,16 +75,6 @@ Item { root.iconWidth = 265; } - Connections { - function onLogin2FARequested() { - showLogin2FA(); - } - function onLogin2PasswordRequested() { - showLoginMailboxPassword(); - } - - target: Backend - } ColumnLayout { anchors.left: parent.left anchors.right: parent.right diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml index 3248184a..ae384e0e 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml @@ -186,6 +186,17 @@ Item { target: clientConfigAppleMail } + + Connections { + function onLogin2FARequested() { + leftContent.showLogin2FA(); + } + function onLogin2PasswordRequested() { + leftContent.showLoginMailboxPassword(); + } + + target: Backend + } } Image { id: mailLogoWithWordmark From d3582fa981a8f13f8a8a360d72d661604ac5a477 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 3 Oct 2023 16:43:33 +0200 Subject: [PATCH 13/58] chore: Vasco da Gama Bridge 3.6.0 changelog. --- Changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 06759abe..5e4ba62d 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,7 +2,6 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) - ## Vasco da Gama Bridge 3.6.0 ### Added @@ -21,6 +20,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * GODT-2664: Trigger QA installer. ### Fixed +* GODT-2992: Fix link in 'no account view' in main window after 2FA or TOTP are cancelled. * GODT-2989: Allow to send bug report when no account connected. * GODT-2988: Fix setup wizard KB links. * GODT-2968: Use proper base64 encoded string even for bad password test. From e7423a95190ee096a3e10f1372db8cf4770de498 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Fri, 6 Oct 2023 10:09:10 +0100 Subject: [PATCH 14/58] fix(GODT-3001): Only create system labels during system label sync --- internal/services/imapservice/sync_update_applier.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/services/imapservice/sync_update_applier.go b/internal/services/imapservice/sync_update_applier.go index 58230ae5..4ba043b1 100644 --- a/internal/services/imapservice/sync_update_applier.go +++ b/internal/services/imapservice/sync_update_applier.go @@ -119,6 +119,10 @@ func (s *SyncUpdateApplier) SyncSystemLabelsOnly(ctx context.Context, labels map continue } + if label.Type != proton.LabelTypeSystem { + continue + } + for _, c := range connectors { update := newSystemMailboxCreatedUpdate(imap.MailboxID(label.ID), label.Name) updates = append(updates, update) From 951c7c27fba64613fca2d8e323033c11da47ba8f Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Fri, 6 Oct 2023 15:00:36 +0100 Subject: [PATCH 15/58] fix(GODT-3003): Ensure IMAP State is reset after vault corruption After we detect that the user has suffered the GODT-3003 bug due the vault corruption not ensuring that a previous sync state would be erased, we patch the gluon db directly and then reset the sync state. After the account is added, the sync is automatically triggered and the account state fixes itself. --- Makefile | 1 + go.mod | 2 +- go.sum | 4 +- internal/bridge/bridge_test.go | 2 +- internal/bridge/sync_test.go | 62 ++++++ internal/services/imapservice/connector.go | 71 +++++- .../services/imapservice/connector_test.go | 205 ++++++++++++++++++ internal/services/imapservice/mocks/mocks.go | 138 ++++++++++++ internal/services/imapservice/service.go | 6 +- .../imapservice/service_address_events.go | 1 + .../imapservice/sync_state_provider.go | 4 +- .../imapservice/sync_state_provider_test.go | 4 +- internal/services/imapsmtpserver/service.go | 5 + 13 files changed, 493 insertions(+), 12 deletions(-) create mode 100644 internal/services/imapservice/connector_test.go create mode 100644 internal/services/imapservice/mocks/mocks.go diff --git a/Makefile b/Makefile index 24d3ba27..ec68628a 100644 --- a/Makefile +++ b/Makefile @@ -304,6 +304,7 @@ ApplyStageInput,BuildStageInput,BuildStageOutput,DownloadStageInput,DownloadStag StateProvider,Regulator,UpdateApplier,MessageBuilder,APIClient,Reporter,DownloadRateModifier \ > tmp mv tmp internal/services/syncservice/mocks_test.go + mockgen --package mocks github.com/ProtonMail/gluon/connector IMAPStateWrite > internal/services/imapservice/mocks/mocks.go lint: gofiles lint-golang lint-license lint-dependencies lint-changelog lint-bug-report diff --git a/go.mod b/go.mod index ad3f2697..af219a1a 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 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.20230829112217-5d5c25c504b5 + github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a github.com/ProtonMail/go-proton-api v0.4.1-0.20230831064234-0e3a549b3f36 github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton diff --git a/go.sum b/go.sum index 5177f714..7a1236b5 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ 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/docker-credential-helpers v1.1.0 h1:+kvUIpwWcbtP3WFv5sSvkFn/XLzSqPOB5AAthuk9xPk= github.com/ProtonMail/docker-credential-helpers v1.1.0/go.mod h1:mK0aBveCxhnQ756AmaTfXMZDeULvheYVhF/MWMErN5g= -github.com/ProtonMail/gluon v0.17.1-0.20230829112217-5d5c25c504b5 h1:C/8P5NHAKi2yCKez+OZ5rSR8SsL7k8si4pK4SE2QtV8= -github.com/ProtonMail/gluon v0.17.1-0.20230829112217-5d5c25c504b5/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= +github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c h1:gUDu4pOswgbou0QczfreNiXQFrmvVlpSh8Q+vft/JvI= +github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= 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/bridge_test.go b/internal/bridge/bridge_test.go index acd0fd0c..6ce8b1bd 100644 --- a/internal/bridge/bridge_test.go +++ b/internal/bridge/bridge_test.go @@ -585,7 +585,7 @@ func TestBridge_MissingGluonStore(t *testing.T) { require.NoError(t, os.RemoveAll(gluonDir)) // Bridge starts but can't find the gluon store dir; there should be no error. - withBridge(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { + withBridgeWaitForServers(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { // ... }) }) diff --git a/internal/bridge/sync_test.go b/internal/bridge/sync_test.go index 1d613bf3..07c0988a 100644 --- a/internal/bridge/sync_test.go +++ b/internal/bridge/sync_test.go @@ -37,6 +37,7 @@ 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/ProtonMail/proton-bridge/v3/internal/services/imapservice" "github.com/bradenaw/juniper/iterator" "github.com/bradenaw/juniper/stream" "github.com/bradenaw/juniper/xslices" @@ -579,6 +580,67 @@ func TestBridge_MessageCreateDuringSync(t *testing.T) { }, server.WithTLS(false)) } +func TestBridge_CorruptedVaultClearsPreviousIMAPSyncState(t *testing.T) { + withEnv(t, func(ctx context.Context, s *server.Server, netCtl *proton.NetCtl, locator bridge.Locator, vaultKey []byte) { + userID, addrID, err := s.CreateUser("imap", password) + require.NoError(t, err) + + labelID, err := s.CreateLabel(userID, "folder", "", proton.LabelTypeFolder) + require.NoError(t, err) + + withClient(ctx, t, s, "imap", password, func(ctx context.Context, c *proton.Client) { + createNumMessages(ctx, t, c, addrID, labelID, 100) + }) + + withBridge(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { + syncCh, done := chToType[events.Event, events.SyncFinished](bridge.GetEvents(events.SyncFinished{})) + defer done() + + var err error + + userID, err = bridge.LoginFull(context.Background(), "imap", password, nil, nil) + require.NoError(t, err) + + // Wait for sync to finish + require.Equal(t, userID, (<-syncCh).UserID) + }) + + settingsPath, err := locator.ProvideSettingsPath() + require.NoError(t, err) + + syncConfigPath, err := locator.ProvideIMAPSyncConfigPath() + require.NoError(t, err) + + syncStatePath := imapservice.GetSyncConfigPath(syncConfigPath, userID) + // Check sync state is complete + { + state, err := imapservice.NewSyncState(syncStatePath) + require.NoError(t, err) + syncStatus, err := state.GetSyncStatus(context.Background()) + require.NoError(t, err) + require.True(t, syncStatus.IsComplete()) + } + + // corrupt the vault + require.NoError(t, os.WriteFile(filepath.Join(settingsPath, "vault.enc"), []byte("Trash!"), 0o600)) + + // Bridge starts but can't find the gluon database dir; there should be no error. + withBridge(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { + _, err := bridge.LoginFull(context.Background(), "imap", password, nil, nil) + require.NoError(t, err) + }) + + // Check sync state is reset. + { + state, err := imapservice.NewSyncState(syncStatePath) + require.NoError(t, err) + syncStatus, err := state.GetSyncStatus(context.Background()) + require.NoError(t, err) + require.False(t, syncStatus.IsComplete()) + } + }) +} + func withClient(ctx context.Context, t *testing.T, s *server.Server, username string, password []byte, fn func(context.Context, *proton.Client)) { //nolint:unparam m := proton.New( proton.WithHostURL(s.GetHostURL()), diff --git a/internal/services/imapservice/connector.go b/internal/services/imapservice/connector.go index e026752f..c21fe5ca 100644 --- a/internal/services/imapservice/connector.go +++ b/internal/services/imapservice/connector.go @@ -63,6 +63,7 @@ type Connector struct { log *logrus.Entry sharedCache *SharedCache + syncState *SyncState } func NewConnector( @@ -75,6 +76,7 @@ func NewConnector( panicHandler async.PanicHandler, telemetry Telemetry, showAllMail bool, + syncState *SyncState, ) *Connector { userID := identityState.UserID() @@ -106,6 +108,7 @@ func NewConnector( }), sharedCache: NewSharedCached(), + syncState: syncState, } } @@ -114,9 +117,35 @@ func (s *Connector) StateClose() { s.updateCh.CloseAndDiscardQueued() } -func (s *Connector) Init(_ context.Context, cache connector.IMAPState) error { +func (s *Connector) Init(ctx context.Context, cache connector.IMAPState) error { s.sharedCache.Set(cache) - return nil + + return cache.Write(ctx, func(ctx context.Context, write connector.IMAPStateWrite) error { + rd := s.labels.Read() + defer rd.Close() + + mboxes, err := write.GetMailboxesWithoutAttrib(ctx) + if err != nil { + return err + } + + // Attempt to fix bug when a vault got corrupted, but the sync state did not get reset leading to + // all labels being written to the root level. If we detect this happened, reset the sync state. + { + applied, err := fixGODT3003Labels(ctx, s.log, mboxes, rd, write) + if err != nil { + return err + } + + if applied { + s.log.Debug("Patched folders/labels after GODT-3003 incident, resetting sync state.") + if err := s.syncState.ClearSyncStatus(ctx); err != nil { + return err + } + } + } + return nil + }) } func (s *Connector) Authorize(ctx context.Context, username string, password []byte) bool { @@ -745,3 +774,41 @@ func (s *Connector) createDraft(ctx context.Context, literal []byte, addrKR *cry func (s *Connector) publishUpdate(_ context.Context, update imap.Update) { s.updateCh.Enqueue(update) } + +func fixGODT3003Labels( + ctx context.Context, + log *logrus.Entry, + mboxes []imap.MailboxNoAttrib, + rd labelsRead, + write connector.IMAPStateWrite, +) (bool, error) { + var applied bool + for _, mbox := range mboxes { + lbl, ok := rd.GetLabel(string(mbox.ID)) + if !ok { + continue + } + + if lbl.Type == proton.LabelTypeFolder { + if mbox.Name[0] != folderPrefix { + log.WithField("labelID", mbox.ID.ShortID()).Debug("Found folder without prefix, patching") + if err := write.PatchMailboxHierarchyWithoutTransforms(ctx, mbox.ID, xslices.Insert(mbox.Name, 0, folderPrefix)); err != nil { + return false, fmt.Errorf("failed to update mailbox name: %w", err) + } + + applied = true + } + } else if lbl.Type == proton.LabelTypeLabel { + if mbox.Name[0] != labelPrefix { + log.WithField("labelID", mbox.ID.ShortID()).Debug("Found label without prefix, patching") + if err := write.PatchMailboxHierarchyWithoutTransforms(ctx, mbox.ID, xslices.Insert(mbox.Name, 0, labelPrefix)); err != nil { + return false, fmt.Errorf("failed to update mailbox name: %w", err) + } + + applied = true + } + } + } + + return applied, nil +} diff --git a/internal/services/imapservice/connector_test.go b/internal/services/imapservice/connector_test.go new file mode 100644 index 00000000..f79b885d --- /dev/null +++ b/internal/services/imapservice/connector_test.go @@ -0,0 +1,205 @@ +// Copyright (c) 2023 Proton AG +// +// This file is part of Proton Mail Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +package imapservice + +import ( + "context" + "testing" + + "github.com/ProtonMail/gluon/imap" + "github.com/ProtonMail/go-proton-api" + "github.com/ProtonMail/proton-bridge/v3/internal/services/imapservice/mocks" + "github.com/golang/mock/gomock" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/require" +) + +func TestFixGODT3003Labels(t *testing.T) { + mockCtrl := gomock.NewController(t) + + log := logrus.WithField("test", "test") + + sharedLabels := newRWLabels() + wr := sharedLabels.Write() + wr.SetLabel("foo", proton.Label{ + ID: "foo", + ParentID: "bar", + Name: "Foo", + Path: []string{"bar", "Foo"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("0", proton.Label{ + ID: "0", + ParentID: "", + Name: "Inbox", + Path: []string{"Inbox"}, + Color: "", + Type: proton.LabelTypeSystem, + }) + + wr.SetLabel("bar", proton.Label{ + ID: "bar", + ParentID: "", + Name: "boo", + Path: []string{"bar"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("my_label", proton.Label{ + ID: "my_label", + ParentID: "", + Name: "MyLabel", + Path: []string{"MyLabel"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + + wr.SetLabel("my_label2", proton.Label{ + ID: "my_label2", + ParentID: "", + Name: "MyLabel2", + Path: []string{labelPrefix, "MyLabel2"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + wr.Close() + + mboxs := []imap.MailboxNoAttrib{ + { + ID: "0", + Name: []string{"Inbox"}, + }, + { + ID: "bar", + Name: []string{"bar"}, + }, + { + ID: "foo", + Name: []string{"bar", "Foo"}, + }, + { + ID: "my_label", + Name: []string{"MyLabel"}, + }, + { + ID: "my_label2", + Name: []string{labelPrefix, "MyLabel2"}, + }, + } + + rd := sharedLabels.Read() + defer rd.Close() + + imapState := mocks.NewMockIMAPStateWrite(mockCtrl) + + imapState.EXPECT().PatchMailboxHierarchyWithoutTransforms(gomock.Any(), gomock.Eq(imap.MailboxID("bar")), gomock.Eq([]string{folderPrefix, "bar"})) + imapState.EXPECT().PatchMailboxHierarchyWithoutTransforms(gomock.Any(), gomock.Eq(imap.MailboxID("foo")), gomock.Eq([]string{folderPrefix, "bar", "Foo"})) + imapState.EXPECT().PatchMailboxHierarchyWithoutTransforms(gomock.Any(), gomock.Eq(imap.MailboxID("my_label")), gomock.Eq([]string{labelPrefix, "MyLabel"})) + + applied, err := fixGODT3003Labels(context.Background(), log, mboxs, rd, imapState) + require.NoError(t, err) + require.True(t, applied) +} + +func TestFixGODT3003Labels_Noop(t *testing.T) { + mockCtrl := gomock.NewController(t) + + log := logrus.WithField("test", "test") + + sharedLabels := newRWLabels() + wr := sharedLabels.Write() + wr.SetLabel("foo", proton.Label{ + ID: "foo", + ParentID: "bar", + Name: "Foo", + Path: []string{folderPrefix, "bar", "Foo"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("0", proton.Label{ + ID: "0", + ParentID: "", + Name: "Inbox", + Path: []string{"Inbox"}, + Color: "", + Type: proton.LabelTypeSystem, + }) + + wr.SetLabel("bar", proton.Label{ + ID: "bar", + ParentID: "", + Name: "bar", + Path: []string{folderPrefix, "bar"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("my_label", proton.Label{ + ID: "my_label", + ParentID: "", + Name: "MyLabel", + Path: []string{labelPrefix, "MyLabel"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + + wr.SetLabel("my_label2", proton.Label{ + ID: "my_label2", + ParentID: "", + Name: "MyLabel2", + Path: []string{labelPrefix, "MyLabel2"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + wr.Close() + + mboxs := []imap.MailboxNoAttrib{ + { + ID: "0", + Name: []string{"Inbox"}, + }, + { + ID: "bar", + Name: []string{folderPrefix, "bar"}, + }, + { + ID: "foo", + Name: []string{folderPrefix, "bar", "Foo"}, + }, + { + ID: "my_label", + Name: []string{labelPrefix, "MyLabel"}, + }, + { + ID: "my_label2", + Name: []string{labelPrefix, "MyLabel2"}, + }, + } + + rd := sharedLabels.Read() + defer rd.Close() + + imapState := mocks.NewMockIMAPStateWrite(mockCtrl) + applied, err := fixGODT3003Labels(context.Background(), log, mboxs, rd, imapState) + require.NoError(t, err) + require.False(t, applied) +} diff --git a/internal/services/imapservice/mocks/mocks.go b/internal/services/imapservice/mocks/mocks.go new file mode 100644 index 00000000..17e5b7cd --- /dev/null +++ b/internal/services/imapservice/mocks/mocks.go @@ -0,0 +1,138 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ProtonMail/gluon/connector (interfaces: IMAPStateWrite) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + imap "github.com/ProtonMail/gluon/imap" + gomock "github.com/golang/mock/gomock" +) + +// MockIMAPStateWrite is a mock of IMAPStateWrite interface. +type MockIMAPStateWrite struct { + ctrl *gomock.Controller + recorder *MockIMAPStateWriteMockRecorder +} + +// MockIMAPStateWriteMockRecorder is the mock recorder for MockIMAPStateWrite. +type MockIMAPStateWriteMockRecorder struct { + mock *MockIMAPStateWrite +} + +// NewMockIMAPStateWrite creates a new mock instance. +func NewMockIMAPStateWrite(ctrl *gomock.Controller) *MockIMAPStateWrite { + mock := &MockIMAPStateWrite{ctrl: ctrl} + mock.recorder = &MockIMAPStateWriteMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockIMAPStateWrite) EXPECT() *MockIMAPStateWriteMockRecorder { + return m.recorder +} + +// CreateMailbox mocks base method. +func (m *MockIMAPStateWrite) CreateMailbox(arg0 context.Context, arg1 imap.Mailbox) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateMailbox", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateMailbox indicates an expected call of CreateMailbox. +func (mr *MockIMAPStateWriteMockRecorder) CreateMailbox(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMailbox", reflect.TypeOf((*MockIMAPStateWrite)(nil).CreateMailbox), arg0, arg1) +} + +// GetMailboxCount mocks base method. +func (m *MockIMAPStateWrite) GetMailboxCount(arg0 context.Context) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMailboxCount", arg0) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMailboxCount indicates an expected call of GetMailboxCount. +func (mr *MockIMAPStateWriteMockRecorder) GetMailboxCount(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMailboxCount", reflect.TypeOf((*MockIMAPStateWrite)(nil).GetMailboxCount), arg0) +} + +// GetMailboxesWithoutAttrib mocks base method. +func (m *MockIMAPStateWrite) GetMailboxesWithoutAttrib(arg0 context.Context) ([]imap.MailboxNoAttrib, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMailboxesWithoutAttrib", arg0) + ret0, _ := ret[0].([]imap.MailboxNoAttrib) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMailboxesWithoutAttrib indicates an expected call of GetMailboxesWithoutAttrib. +func (mr *MockIMAPStateWriteMockRecorder) GetMailboxesWithoutAttrib(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMailboxesWithoutAttrib", reflect.TypeOf((*MockIMAPStateWrite)(nil).GetMailboxesWithoutAttrib), arg0) +} + +// GetSettings mocks base method. +func (m *MockIMAPStateWrite) GetSettings(arg0 context.Context) (string, bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSettings", arg0) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(bool) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetSettings indicates an expected call of GetSettings. +func (mr *MockIMAPStateWriteMockRecorder) GetSettings(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSettings", reflect.TypeOf((*MockIMAPStateWrite)(nil).GetSettings), arg0) +} + +// PatchMailboxHierarchyWithoutTransforms mocks base method. +func (m *MockIMAPStateWrite) PatchMailboxHierarchyWithoutTransforms(arg0 context.Context, arg1 imap.MailboxID, arg2 []string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PatchMailboxHierarchyWithoutTransforms", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// PatchMailboxHierarchyWithoutTransforms indicates an expected call of PatchMailboxHierarchyWithoutTransforms. +func (mr *MockIMAPStateWriteMockRecorder) PatchMailboxHierarchyWithoutTransforms(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchMailboxHierarchyWithoutTransforms", reflect.TypeOf((*MockIMAPStateWrite)(nil).PatchMailboxHierarchyWithoutTransforms), arg0, arg1, arg2) +} + +// StoreSettings mocks base method. +func (m *MockIMAPStateWrite) StoreSettings(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StoreSettings", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// StoreSettings indicates an expected call of StoreSettings. +func (mr *MockIMAPStateWriteMockRecorder) StoreSettings(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreSettings", reflect.TypeOf((*MockIMAPStateWrite)(nil).StoreSettings), arg0, arg1) +} + +// UpdateMessageFlags mocks base method. +func (m *MockIMAPStateWrite) UpdateMessageFlags(arg0 context.Context, arg1 imap.MessageID, arg2 imap.FlagSet) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateMessageFlags", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateMessageFlags indicates an expected call of UpdateMessageFlags. +func (mr *MockIMAPStateWriteMockRecorder) UpdateMessageFlags(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateMessageFlags", reflect.TypeOf((*MockIMAPStateWrite)(nil).UpdateMessageFlags), arg0, arg1, arg2) +} diff --git a/internal/services/imapservice/service.go b/internal/services/imapservice/service.go index 701a62c6..79e4b9f0 100644 --- a/internal/services/imapservice/service.go +++ b/internal/services/imapservice/service.go @@ -158,7 +158,7 @@ func NewService( syncUpdateApplier: syncUpdateApplier, syncMessageBuilder: syncMessageBuilder, syncReporter: syncReporter, - syncConfigPath: getSyncConfigPath(syncConfigDir, identityState.User.ID), + syncConfigPath: GetSyncConfigPath(syncConfigDir, identityState.User.ID), } } @@ -498,6 +498,7 @@ func (s *Service) buildConnectors() (map[string]*Connector, error) { s.panicHandler, s.telemetry, s.showAllMail, + s.syncStateProvider, ) return connectors, nil @@ -514,6 +515,7 @@ func (s *Service) buildConnectors() (map[string]*Connector, error) { s.panicHandler, s.telemetry, s.showAllMail, + s.syncStateProvider, ) } @@ -644,6 +646,6 @@ type setAddressModeReq struct { type getSyncFailedMessagesReq struct{} -func getSyncConfigPath(path string, userID string) string { +func GetSyncConfigPath(path string, userID string) string { return filepath.Join(path, fmt.Sprintf("sync-%v", userID)) } diff --git a/internal/services/imapservice/service_address_events.go b/internal/services/imapservice/service_address_events.go index 2c5aed9c..78abe4a3 100644 --- a/internal/services/imapservice/service_address_events.go +++ b/internal/services/imapservice/service_address_events.go @@ -128,6 +128,7 @@ func addNewAddressSplitMode(ctx context.Context, s *Service, addrID string) erro s.panicHandler, s.telemetry, s.showAllMail, + s.syncStateProvider, ) if err := s.serverManager.AddIMAPUser(ctx, connector, connector.addrID, s.gluonIDProvider, s.syncStateProvider); err != nil { diff --git a/internal/services/imapservice/sync_state_provider.go b/internal/services/imapservice/sync_state_provider.go index 190d67a5..9b3723d2 100644 --- a/internal/services/imapservice/sync_state_provider.go +++ b/internal/services/imapservice/sync_state_provider.go @@ -220,7 +220,7 @@ func (s *SyncState) loadUnsafe() error { } func DeleteSyncState(configDir, userID string) error { - path := getSyncConfigPath(configDir, userID) + path := GetSyncConfigPath(configDir, userID) if err := os.Remove(path); err != nil && !errors.Is(err, os.ErrNotExist) { return err @@ -234,7 +234,7 @@ func MigrateVaultSettings( hasLabels, hasMessages bool, failedMessageIDs []string, ) (bool, error) { - filePath := getSyncConfigPath(configDir, userID) + filePath := GetSyncConfigPath(configDir, userID) _, err := os.ReadFile(filePath) //nolint:gosec if err == nil { diff --git a/internal/services/imapservice/sync_state_provider_test.go b/internal/services/imapservice/sync_state_provider_test.go index 0852c53f..e4dd93b7 100644 --- a/internal/services/imapservice/sync_state_provider_test.go +++ b/internal/services/imapservice/sync_state_provider_test.go @@ -29,7 +29,7 @@ import ( func TestMigrateSyncSettings_AlreadyExists(t *testing.T) { tmpDir := t.TempDir() - testFile := getSyncConfigPath(tmpDir, "test") + testFile := GetSyncConfigPath(tmpDir, "test") expected, err := generateTestState(testFile) require.NoError(t, err) @@ -53,7 +53,7 @@ func TestMigrateSyncSettings_DoesNotExist(t *testing.T) { require.NoError(t, err) require.True(t, migrated) - state, err := NewSyncState(getSyncConfigPath(tmpDir, "test")) + state, err := NewSyncState(GetSyncConfigPath(tmpDir, "test")) require.NoError(t, err) status, err := state.GetSyncStatus(context.Background()) require.NoError(t, err) diff --git a/internal/services/imapsmtpserver/service.go b/internal/services/imapsmtpserver/service.go index de186eb9..f2e22176 100644 --- a/internal/services/imapsmtpserver/service.go +++ b/internal/services/imapsmtpserver/service.go @@ -390,6 +390,11 @@ func (sm *Service) handleAddIMAPUserImpl(ctx context.Context, } else { log.Info("Creating new IMAP user") + // GODT-3003: Ensure previous IMAP sync state is cleared if we run into code path after vault corruption. + if err := syncStateProvider.ClearSyncStatus(ctx); err != nil { + return fmt.Errorf("failed to reset sync status: %w", err) + } + gluonID, err := sm.imapServer.AddUser(ctx, connector, idProvider.GluonKey()) if err != nil { return fmt.Errorf("failed to add IMAP user: %w", err) From 4b95ef4d8219f1ce15d48d913b353bef9f55e695 Mon Sep 17 00:00:00 2001 From: Jakub Date: Mon, 9 Oct 2023 13:25:44 +0200 Subject: [PATCH 16/58] chore: Umshiang Bridge 3.5.2 changelog. --- Changelog.md | 7 +++++++ Makefile | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 5dc72bc3..d896445a 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,13 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Umshiang Bridge 3.5.2 + +### Fixed +* GODT-3003: Ensure IMAP State is reset after vault corruption. +* GODT-3001: Only create system labels during system label sync. + + ## Umshiang Bridge 3.5.1 ### Fixed diff --git a/Makefile b/Makefile index ec68628a..b99c44b9 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.5.1+git +BRIDGE_APP_VERSION?=3.5.2+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG From ba65ffdbc7e85a49262bfff15e96d06cc9dded10 Mon Sep 17 00:00:00 2001 From: Jakub Date: Mon, 9 Oct 2023 13:25:44 +0200 Subject: [PATCH 17/58] chore: Umshiang Bridge 3.5.2 changelog. --- Changelog.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Changelog.md b/Changelog.md index 5e4ba62d..e033fbb2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -33,6 +33,13 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Umshiang Bridge 3.5.2 + +### Fixed +* GODT-3003: Ensure IMAP State is reset after vault corruption. +* GODT-3001: Only create system labels during system label sync. + + ## Umshiang Bridge 3.5.1 ### Fixed From cf9651bb9498d025b1e1697b97d448ed74e267a7 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Fri, 6 Oct 2023 10:09:10 +0100 Subject: [PATCH 18/58] fix(GODT-3001): Only create system labels during system label sync --- internal/services/imapservice/sync_update_applier.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/services/imapservice/sync_update_applier.go b/internal/services/imapservice/sync_update_applier.go index 58230ae5..4ba043b1 100644 --- a/internal/services/imapservice/sync_update_applier.go +++ b/internal/services/imapservice/sync_update_applier.go @@ -119,6 +119,10 @@ func (s *SyncUpdateApplier) SyncSystemLabelsOnly(ctx context.Context, labels map continue } + if label.Type != proton.LabelTypeSystem { + continue + } + for _, c := range connectors { update := newSystemMailboxCreatedUpdate(imap.MailboxID(label.ID), label.Name) updates = append(updates, update) From bf244e5c863671bad0c131c515cf3b1c05622f68 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Fri, 6 Oct 2023 15:00:36 +0100 Subject: [PATCH 19/58] fix(GODT-3003): Ensure IMAP State is reset after vault corruption After we detect that the user has suffered the GODT-3003 bug due the vault corruption not ensuring that a previous sync state would be erased, we patch the gluon db directly and then reset the sync state. After the account is added, the sync is automatically triggered and the account state fixes itself. --- Makefile | 1 + go.mod | 2 +- go.sum | 4 +- internal/bridge/bridge_test.go | 2 +- internal/bridge/sync_test.go | 62 ++++++ internal/services/imapservice/connector.go | 71 +++++- .../services/imapservice/connector_test.go | 205 ++++++++++++++++++ internal/services/imapservice/mocks/mocks.go | 138 ++++++++++++ internal/services/imapservice/service.go | 6 +- .../imapservice/service_address_events.go | 1 + .../imapservice/sync_state_provider.go | 4 +- .../imapservice/sync_state_provider_test.go | 4 +- internal/services/imapsmtpserver/service.go | 5 + 13 files changed, 493 insertions(+), 12 deletions(-) create mode 100644 internal/services/imapservice/connector_test.go create mode 100644 internal/services/imapservice/mocks/mocks.go diff --git a/Makefile b/Makefile index 462ce114..0ae1998a 100644 --- a/Makefile +++ b/Makefile @@ -304,6 +304,7 @@ ApplyStageInput,BuildStageInput,BuildStageOutput,DownloadStageInput,DownloadStag StateProvider,Regulator,UpdateApplier,MessageBuilder,APIClient,Reporter,DownloadRateModifier \ > tmp mv tmp internal/services/syncservice/mocks_test.go + mockgen --package mocks github.com/ProtonMail/gluon/connector IMAPStateWrite > internal/services/imapservice/mocks/mocks.go lint: gofiles lint-golang lint-license lint-dependencies lint-changelog lint-bug-report diff --git a/go.mod b/go.mod index a1a498b0..fc5a08aa 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 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.20230911134257-5eb2eeebbef5 + github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a github.com/ProtonMail/go-proton-api v0.4.1-0.20230925123025-331ad8e6d5ee github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton diff --git a/go.sum b/go.sum index 4c9c029b..cb4e1e30 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ 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/docker-credential-helpers v1.1.0 h1:+kvUIpwWcbtP3WFv5sSvkFn/XLzSqPOB5AAthuk9xPk= github.com/ProtonMail/docker-credential-helpers v1.1.0/go.mod h1:mK0aBveCxhnQ756AmaTfXMZDeULvheYVhF/MWMErN5g= -github.com/ProtonMail/gluon v0.17.1-0.20230911134257-5eb2eeebbef5 h1:O4BusNL870VgVVDSUX2Oaz8A/fNtJhakUKwx0YBIdn8= -github.com/ProtonMail/gluon v0.17.1-0.20230911134257-5eb2eeebbef5/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= +github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c h1:gUDu4pOswgbou0QczfreNiXQFrmvVlpSh8Q+vft/JvI= +github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= 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/bridge_test.go b/internal/bridge/bridge_test.go index acd0fd0c..6ce8b1bd 100644 --- a/internal/bridge/bridge_test.go +++ b/internal/bridge/bridge_test.go @@ -585,7 +585,7 @@ func TestBridge_MissingGluonStore(t *testing.T) { require.NoError(t, os.RemoveAll(gluonDir)) // Bridge starts but can't find the gluon store dir; there should be no error. - withBridge(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { + withBridgeWaitForServers(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { // ... }) }) diff --git a/internal/bridge/sync_test.go b/internal/bridge/sync_test.go index 1d613bf3..07c0988a 100644 --- a/internal/bridge/sync_test.go +++ b/internal/bridge/sync_test.go @@ -37,6 +37,7 @@ 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/ProtonMail/proton-bridge/v3/internal/services/imapservice" "github.com/bradenaw/juniper/iterator" "github.com/bradenaw/juniper/stream" "github.com/bradenaw/juniper/xslices" @@ -579,6 +580,67 @@ func TestBridge_MessageCreateDuringSync(t *testing.T) { }, server.WithTLS(false)) } +func TestBridge_CorruptedVaultClearsPreviousIMAPSyncState(t *testing.T) { + withEnv(t, func(ctx context.Context, s *server.Server, netCtl *proton.NetCtl, locator bridge.Locator, vaultKey []byte) { + userID, addrID, err := s.CreateUser("imap", password) + require.NoError(t, err) + + labelID, err := s.CreateLabel(userID, "folder", "", proton.LabelTypeFolder) + require.NoError(t, err) + + withClient(ctx, t, s, "imap", password, func(ctx context.Context, c *proton.Client) { + createNumMessages(ctx, t, c, addrID, labelID, 100) + }) + + withBridge(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { + syncCh, done := chToType[events.Event, events.SyncFinished](bridge.GetEvents(events.SyncFinished{})) + defer done() + + var err error + + userID, err = bridge.LoginFull(context.Background(), "imap", password, nil, nil) + require.NoError(t, err) + + // Wait for sync to finish + require.Equal(t, userID, (<-syncCh).UserID) + }) + + settingsPath, err := locator.ProvideSettingsPath() + require.NoError(t, err) + + syncConfigPath, err := locator.ProvideIMAPSyncConfigPath() + require.NoError(t, err) + + syncStatePath := imapservice.GetSyncConfigPath(syncConfigPath, userID) + // Check sync state is complete + { + state, err := imapservice.NewSyncState(syncStatePath) + require.NoError(t, err) + syncStatus, err := state.GetSyncStatus(context.Background()) + require.NoError(t, err) + require.True(t, syncStatus.IsComplete()) + } + + // corrupt the vault + require.NoError(t, os.WriteFile(filepath.Join(settingsPath, "vault.enc"), []byte("Trash!"), 0o600)) + + // Bridge starts but can't find the gluon database dir; there should be no error. + withBridge(ctx, t, s.GetHostURL(), netCtl, locator, vaultKey, func(bridge *bridge.Bridge, mocks *bridge.Mocks) { + _, err := bridge.LoginFull(context.Background(), "imap", password, nil, nil) + require.NoError(t, err) + }) + + // Check sync state is reset. + { + state, err := imapservice.NewSyncState(syncStatePath) + require.NoError(t, err) + syncStatus, err := state.GetSyncStatus(context.Background()) + require.NoError(t, err) + require.False(t, syncStatus.IsComplete()) + } + }) +} + func withClient(ctx context.Context, t *testing.T, s *server.Server, username string, password []byte, fn func(context.Context, *proton.Client)) { //nolint:unparam m := proton.New( proton.WithHostURL(s.GetHostURL()), diff --git a/internal/services/imapservice/connector.go b/internal/services/imapservice/connector.go index 04ff2ab9..6e9dc031 100644 --- a/internal/services/imapservice/connector.go +++ b/internal/services/imapservice/connector.go @@ -63,6 +63,7 @@ type Connector struct { log *logrus.Entry sharedCache *SharedCache + syncState *SyncState } func NewConnector( @@ -75,6 +76,7 @@ func NewConnector( panicHandler async.PanicHandler, telemetry Telemetry, showAllMail bool, + syncState *SyncState, ) *Connector { userID := identityState.UserID() @@ -106,6 +108,7 @@ func NewConnector( }), sharedCache: NewSharedCached(), + syncState: syncState, } } @@ -114,9 +117,35 @@ func (s *Connector) StateClose() { s.updateCh.CloseAndDiscardQueued() } -func (s *Connector) Init(_ context.Context, cache connector.IMAPState) error { +func (s *Connector) Init(ctx context.Context, cache connector.IMAPState) error { s.sharedCache.Set(cache) - return nil + + return cache.Write(ctx, func(ctx context.Context, write connector.IMAPStateWrite) error { + rd := s.labels.Read() + defer rd.Close() + + mboxes, err := write.GetMailboxesWithoutAttrib(ctx) + if err != nil { + return err + } + + // Attempt to fix bug when a vault got corrupted, but the sync state did not get reset leading to + // all labels being written to the root level. If we detect this happened, reset the sync state. + { + applied, err := fixGODT3003Labels(ctx, s.log, mboxes, rd, write) + if err != nil { + return err + } + + if applied { + s.log.Debug("Patched folders/labels after GODT-3003 incident, resetting sync state.") + if err := s.syncState.ClearSyncStatus(ctx); err != nil { + return err + } + } + } + return nil + }) } func (s *Connector) Authorize(ctx context.Context, username string, password []byte) bool { @@ -745,3 +774,41 @@ func (s *Connector) createDraft(ctx context.Context, literal []byte, addrKR *cry func (s *Connector) publishUpdate(_ context.Context, update imap.Update) { s.updateCh.Enqueue(update) } + +func fixGODT3003Labels( + ctx context.Context, + log *logrus.Entry, + mboxes []imap.MailboxNoAttrib, + rd labelsRead, + write connector.IMAPStateWrite, +) (bool, error) { + var applied bool + for _, mbox := range mboxes { + lbl, ok := rd.GetLabel(string(mbox.ID)) + if !ok { + continue + } + + if lbl.Type == proton.LabelTypeFolder { + if mbox.Name[0] != folderPrefix { + log.WithField("labelID", mbox.ID.ShortID()).Debug("Found folder without prefix, patching") + if err := write.PatchMailboxHierarchyWithoutTransforms(ctx, mbox.ID, xslices.Insert(mbox.Name, 0, folderPrefix)); err != nil { + return false, fmt.Errorf("failed to update mailbox name: %w", err) + } + + applied = true + } + } else if lbl.Type == proton.LabelTypeLabel { + if mbox.Name[0] != labelPrefix { + log.WithField("labelID", mbox.ID.ShortID()).Debug("Found label without prefix, patching") + if err := write.PatchMailboxHierarchyWithoutTransforms(ctx, mbox.ID, xslices.Insert(mbox.Name, 0, labelPrefix)); err != nil { + return false, fmt.Errorf("failed to update mailbox name: %w", err) + } + + applied = true + } + } + } + + return applied, nil +} diff --git a/internal/services/imapservice/connector_test.go b/internal/services/imapservice/connector_test.go new file mode 100644 index 00000000..f79b885d --- /dev/null +++ b/internal/services/imapservice/connector_test.go @@ -0,0 +1,205 @@ +// Copyright (c) 2023 Proton AG +// +// This file is part of Proton Mail Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +package imapservice + +import ( + "context" + "testing" + + "github.com/ProtonMail/gluon/imap" + "github.com/ProtonMail/go-proton-api" + "github.com/ProtonMail/proton-bridge/v3/internal/services/imapservice/mocks" + "github.com/golang/mock/gomock" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/require" +) + +func TestFixGODT3003Labels(t *testing.T) { + mockCtrl := gomock.NewController(t) + + log := logrus.WithField("test", "test") + + sharedLabels := newRWLabels() + wr := sharedLabels.Write() + wr.SetLabel("foo", proton.Label{ + ID: "foo", + ParentID: "bar", + Name: "Foo", + Path: []string{"bar", "Foo"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("0", proton.Label{ + ID: "0", + ParentID: "", + Name: "Inbox", + Path: []string{"Inbox"}, + Color: "", + Type: proton.LabelTypeSystem, + }) + + wr.SetLabel("bar", proton.Label{ + ID: "bar", + ParentID: "", + Name: "boo", + Path: []string{"bar"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("my_label", proton.Label{ + ID: "my_label", + ParentID: "", + Name: "MyLabel", + Path: []string{"MyLabel"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + + wr.SetLabel("my_label2", proton.Label{ + ID: "my_label2", + ParentID: "", + Name: "MyLabel2", + Path: []string{labelPrefix, "MyLabel2"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + wr.Close() + + mboxs := []imap.MailboxNoAttrib{ + { + ID: "0", + Name: []string{"Inbox"}, + }, + { + ID: "bar", + Name: []string{"bar"}, + }, + { + ID: "foo", + Name: []string{"bar", "Foo"}, + }, + { + ID: "my_label", + Name: []string{"MyLabel"}, + }, + { + ID: "my_label2", + Name: []string{labelPrefix, "MyLabel2"}, + }, + } + + rd := sharedLabels.Read() + defer rd.Close() + + imapState := mocks.NewMockIMAPStateWrite(mockCtrl) + + imapState.EXPECT().PatchMailboxHierarchyWithoutTransforms(gomock.Any(), gomock.Eq(imap.MailboxID("bar")), gomock.Eq([]string{folderPrefix, "bar"})) + imapState.EXPECT().PatchMailboxHierarchyWithoutTransforms(gomock.Any(), gomock.Eq(imap.MailboxID("foo")), gomock.Eq([]string{folderPrefix, "bar", "Foo"})) + imapState.EXPECT().PatchMailboxHierarchyWithoutTransforms(gomock.Any(), gomock.Eq(imap.MailboxID("my_label")), gomock.Eq([]string{labelPrefix, "MyLabel"})) + + applied, err := fixGODT3003Labels(context.Background(), log, mboxs, rd, imapState) + require.NoError(t, err) + require.True(t, applied) +} + +func TestFixGODT3003Labels_Noop(t *testing.T) { + mockCtrl := gomock.NewController(t) + + log := logrus.WithField("test", "test") + + sharedLabels := newRWLabels() + wr := sharedLabels.Write() + wr.SetLabel("foo", proton.Label{ + ID: "foo", + ParentID: "bar", + Name: "Foo", + Path: []string{folderPrefix, "bar", "Foo"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("0", proton.Label{ + ID: "0", + ParentID: "", + Name: "Inbox", + Path: []string{"Inbox"}, + Color: "", + Type: proton.LabelTypeSystem, + }) + + wr.SetLabel("bar", proton.Label{ + ID: "bar", + ParentID: "", + Name: "bar", + Path: []string{folderPrefix, "bar"}, + Color: "", + Type: proton.LabelTypeFolder, + }) + + wr.SetLabel("my_label", proton.Label{ + ID: "my_label", + ParentID: "", + Name: "MyLabel", + Path: []string{labelPrefix, "MyLabel"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + + wr.SetLabel("my_label2", proton.Label{ + ID: "my_label2", + ParentID: "", + Name: "MyLabel2", + Path: []string{labelPrefix, "MyLabel2"}, + Color: "", + Type: proton.LabelTypeLabel, + }) + wr.Close() + + mboxs := []imap.MailboxNoAttrib{ + { + ID: "0", + Name: []string{"Inbox"}, + }, + { + ID: "bar", + Name: []string{folderPrefix, "bar"}, + }, + { + ID: "foo", + Name: []string{folderPrefix, "bar", "Foo"}, + }, + { + ID: "my_label", + Name: []string{labelPrefix, "MyLabel"}, + }, + { + ID: "my_label2", + Name: []string{labelPrefix, "MyLabel2"}, + }, + } + + rd := sharedLabels.Read() + defer rd.Close() + + imapState := mocks.NewMockIMAPStateWrite(mockCtrl) + applied, err := fixGODT3003Labels(context.Background(), log, mboxs, rd, imapState) + require.NoError(t, err) + require.False(t, applied) +} diff --git a/internal/services/imapservice/mocks/mocks.go b/internal/services/imapservice/mocks/mocks.go new file mode 100644 index 00000000..17e5b7cd --- /dev/null +++ b/internal/services/imapservice/mocks/mocks.go @@ -0,0 +1,138 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/ProtonMail/gluon/connector (interfaces: IMAPStateWrite) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + imap "github.com/ProtonMail/gluon/imap" + gomock "github.com/golang/mock/gomock" +) + +// MockIMAPStateWrite is a mock of IMAPStateWrite interface. +type MockIMAPStateWrite struct { + ctrl *gomock.Controller + recorder *MockIMAPStateWriteMockRecorder +} + +// MockIMAPStateWriteMockRecorder is the mock recorder for MockIMAPStateWrite. +type MockIMAPStateWriteMockRecorder struct { + mock *MockIMAPStateWrite +} + +// NewMockIMAPStateWrite creates a new mock instance. +func NewMockIMAPStateWrite(ctrl *gomock.Controller) *MockIMAPStateWrite { + mock := &MockIMAPStateWrite{ctrl: ctrl} + mock.recorder = &MockIMAPStateWriteMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockIMAPStateWrite) EXPECT() *MockIMAPStateWriteMockRecorder { + return m.recorder +} + +// CreateMailbox mocks base method. +func (m *MockIMAPStateWrite) CreateMailbox(arg0 context.Context, arg1 imap.Mailbox) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateMailbox", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateMailbox indicates an expected call of CreateMailbox. +func (mr *MockIMAPStateWriteMockRecorder) CreateMailbox(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateMailbox", reflect.TypeOf((*MockIMAPStateWrite)(nil).CreateMailbox), arg0, arg1) +} + +// GetMailboxCount mocks base method. +func (m *MockIMAPStateWrite) GetMailboxCount(arg0 context.Context) (int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMailboxCount", arg0) + ret0, _ := ret[0].(int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMailboxCount indicates an expected call of GetMailboxCount. +func (mr *MockIMAPStateWriteMockRecorder) GetMailboxCount(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMailboxCount", reflect.TypeOf((*MockIMAPStateWrite)(nil).GetMailboxCount), arg0) +} + +// GetMailboxesWithoutAttrib mocks base method. +func (m *MockIMAPStateWrite) GetMailboxesWithoutAttrib(arg0 context.Context) ([]imap.MailboxNoAttrib, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMailboxesWithoutAttrib", arg0) + ret0, _ := ret[0].([]imap.MailboxNoAttrib) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMailboxesWithoutAttrib indicates an expected call of GetMailboxesWithoutAttrib. +func (mr *MockIMAPStateWriteMockRecorder) GetMailboxesWithoutAttrib(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMailboxesWithoutAttrib", reflect.TypeOf((*MockIMAPStateWrite)(nil).GetMailboxesWithoutAttrib), arg0) +} + +// GetSettings mocks base method. +func (m *MockIMAPStateWrite) GetSettings(arg0 context.Context) (string, bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSettings", arg0) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(bool) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetSettings indicates an expected call of GetSettings. +func (mr *MockIMAPStateWriteMockRecorder) GetSettings(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSettings", reflect.TypeOf((*MockIMAPStateWrite)(nil).GetSettings), arg0) +} + +// PatchMailboxHierarchyWithoutTransforms mocks base method. +func (m *MockIMAPStateWrite) PatchMailboxHierarchyWithoutTransforms(arg0 context.Context, arg1 imap.MailboxID, arg2 []string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PatchMailboxHierarchyWithoutTransforms", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// PatchMailboxHierarchyWithoutTransforms indicates an expected call of PatchMailboxHierarchyWithoutTransforms. +func (mr *MockIMAPStateWriteMockRecorder) PatchMailboxHierarchyWithoutTransforms(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PatchMailboxHierarchyWithoutTransforms", reflect.TypeOf((*MockIMAPStateWrite)(nil).PatchMailboxHierarchyWithoutTransforms), arg0, arg1, arg2) +} + +// StoreSettings mocks base method. +func (m *MockIMAPStateWrite) StoreSettings(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StoreSettings", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// StoreSettings indicates an expected call of StoreSettings. +func (mr *MockIMAPStateWriteMockRecorder) StoreSettings(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StoreSettings", reflect.TypeOf((*MockIMAPStateWrite)(nil).StoreSettings), arg0, arg1) +} + +// UpdateMessageFlags mocks base method. +func (m *MockIMAPStateWrite) UpdateMessageFlags(arg0 context.Context, arg1 imap.MessageID, arg2 imap.FlagSet) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateMessageFlags", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// UpdateMessageFlags indicates an expected call of UpdateMessageFlags. +func (mr *MockIMAPStateWriteMockRecorder) UpdateMessageFlags(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateMessageFlags", reflect.TypeOf((*MockIMAPStateWrite)(nil).UpdateMessageFlags), arg0, arg1, arg2) +} diff --git a/internal/services/imapservice/service.go b/internal/services/imapservice/service.go index 701a62c6..79e4b9f0 100644 --- a/internal/services/imapservice/service.go +++ b/internal/services/imapservice/service.go @@ -158,7 +158,7 @@ func NewService( syncUpdateApplier: syncUpdateApplier, syncMessageBuilder: syncMessageBuilder, syncReporter: syncReporter, - syncConfigPath: getSyncConfigPath(syncConfigDir, identityState.User.ID), + syncConfigPath: GetSyncConfigPath(syncConfigDir, identityState.User.ID), } } @@ -498,6 +498,7 @@ func (s *Service) buildConnectors() (map[string]*Connector, error) { s.panicHandler, s.telemetry, s.showAllMail, + s.syncStateProvider, ) return connectors, nil @@ -514,6 +515,7 @@ func (s *Service) buildConnectors() (map[string]*Connector, error) { s.panicHandler, s.telemetry, s.showAllMail, + s.syncStateProvider, ) } @@ -644,6 +646,6 @@ type setAddressModeReq struct { type getSyncFailedMessagesReq struct{} -func getSyncConfigPath(path string, userID string) string { +func GetSyncConfigPath(path string, userID string) string { return filepath.Join(path, fmt.Sprintf("sync-%v", userID)) } diff --git a/internal/services/imapservice/service_address_events.go b/internal/services/imapservice/service_address_events.go index 2c5aed9c..78abe4a3 100644 --- a/internal/services/imapservice/service_address_events.go +++ b/internal/services/imapservice/service_address_events.go @@ -128,6 +128,7 @@ func addNewAddressSplitMode(ctx context.Context, s *Service, addrID string) erro s.panicHandler, s.telemetry, s.showAllMail, + s.syncStateProvider, ) if err := s.serverManager.AddIMAPUser(ctx, connector, connector.addrID, s.gluonIDProvider, s.syncStateProvider); err != nil { diff --git a/internal/services/imapservice/sync_state_provider.go b/internal/services/imapservice/sync_state_provider.go index 190d67a5..9b3723d2 100644 --- a/internal/services/imapservice/sync_state_provider.go +++ b/internal/services/imapservice/sync_state_provider.go @@ -220,7 +220,7 @@ func (s *SyncState) loadUnsafe() error { } func DeleteSyncState(configDir, userID string) error { - path := getSyncConfigPath(configDir, userID) + path := GetSyncConfigPath(configDir, userID) if err := os.Remove(path); err != nil && !errors.Is(err, os.ErrNotExist) { return err @@ -234,7 +234,7 @@ func MigrateVaultSettings( hasLabels, hasMessages bool, failedMessageIDs []string, ) (bool, error) { - filePath := getSyncConfigPath(configDir, userID) + filePath := GetSyncConfigPath(configDir, userID) _, err := os.ReadFile(filePath) //nolint:gosec if err == nil { diff --git a/internal/services/imapservice/sync_state_provider_test.go b/internal/services/imapservice/sync_state_provider_test.go index 0852c53f..e4dd93b7 100644 --- a/internal/services/imapservice/sync_state_provider_test.go +++ b/internal/services/imapservice/sync_state_provider_test.go @@ -29,7 +29,7 @@ import ( func TestMigrateSyncSettings_AlreadyExists(t *testing.T) { tmpDir := t.TempDir() - testFile := getSyncConfigPath(tmpDir, "test") + testFile := GetSyncConfigPath(tmpDir, "test") expected, err := generateTestState(testFile) require.NoError(t, err) @@ -53,7 +53,7 @@ func TestMigrateSyncSettings_DoesNotExist(t *testing.T) { require.NoError(t, err) require.True(t, migrated) - state, err := NewSyncState(getSyncConfigPath(tmpDir, "test")) + state, err := NewSyncState(GetSyncConfigPath(tmpDir, "test")) require.NoError(t, err) status, err := state.GetSyncStatus(context.Background()) require.NoError(t, err) diff --git a/internal/services/imapsmtpserver/service.go b/internal/services/imapsmtpserver/service.go index de186eb9..f2e22176 100644 --- a/internal/services/imapsmtpserver/service.go +++ b/internal/services/imapsmtpserver/service.go @@ -390,6 +390,11 @@ func (sm *Service) handleAddIMAPUserImpl(ctx context.Context, } else { log.Info("Creating new IMAP user") + // GODT-3003: Ensure previous IMAP sync state is cleared if we run into code path after vault corruption. + if err := syncStateProvider.ClearSyncStatus(ctx); err != nil { + return fmt.Errorf("failed to reset sync status: %w", err) + } + gluonID, err := sm.imapServer.AddUser(ctx, connector, idProvider.GluonKey()) if err != nil { return fmt.Errorf("failed to add IMAP user: %w", err) From 275b30e51810be24c4f15a2d8a16269bfd0fa594 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 10 Oct 2023 11:29:36 +0200 Subject: [PATCH 20/58] chore: Vasco da Gama Bridge 3.6.0 changelog. --- Changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Changelog.md b/Changelog.md index e033fbb2..8a35fc7e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) + ## Vasco da Gama Bridge 3.6.0 ### Added From 94b44b383ae8a714e6391fec2ea5df13fc28ea3f Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 10 Oct 2023 15:48:30 +0200 Subject: [PATCH 21/58] feat(GODT-3004): update gopenpgp and dependencies. --- go.mod | 6 +++--- go.sum | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index af219a1a..e21f548e 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,8 @@ require ( github.com/Masterminds/semver/v3 v3.2.0 github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a - github.com/ProtonMail/go-proton-api v0.4.1-0.20230831064234-0e3a549b3f36 - github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton + github.com/ProtonMail/go-proton-api v0.4.1-0.20231011062329-f3b976b7dbca + github.com/ProtonMail/gopenpgp/v2 v2.7.3-proton github.com/PuerkitoBio/goquery v1.8.1 github.com/abiosoft/ishell v2.0.0+incompatible github.com/allan-simon/go-singleinstance v0.0.0-20210120080615-d0997106ab37 @@ -52,7 +52,7 @@ require ( require ( github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230717121622-edf196117233 // indirect github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect github.com/ProtonMail/go-srp v0.0.7 // indirect github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db // indirect diff --git a/go.sum b/go.sum index 7a1236b5..4a0bebe5 100644 --- a/go.sum +++ b/go.sum @@ -28,19 +28,18 @@ github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c/go.mod h1:Og5/ 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= -github.com/ProtonMail/go-crypto v0.0.0-20230322105811-d73448b7e800/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= -github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek= -github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= +github.com/ProtonMail/go-crypto v0.0.0-20230717121622-edf196117233 h1:bdoKdh0f66/lrgVfYlxw0aqISY/KOqXmFJyGt7rGmnc= +github.com/ProtonMail/go-crypto v0.0.0-20230717121622-edf196117233/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7 h1:+j+Kd/DyZ/qGfMT9htAT7HxqIEbZHsatsx+m8AoV6fc= github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7/go.mod h1:NBAn21zgCJ/52WLDyed18YvYFm5tEoeDauubFqLokM4= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230831064234-0e3a549b3f36 h1:JVMK2w90bCWayUCXJIb3wkQ5+j2P/NbnrX3BrDoLzsc= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230831064234-0e3a549b3f36/go.mod h1:nS8hMGjJLgC0Iej0JMYbsI388LesEkM1Hj/jCCxQeaQ= +github.com/ProtonMail/go-proton-api v0.4.1-0.20231011062329-f3b976b7dbca h1:nO/xuvyEgWWLo2cBAqfxCHh7Ri0ofV3PXnTOfk0QcyI= +github.com/ProtonMail/go-proton-api v0.4.1-0.20231011062329-f3b976b7dbca/go.mod h1:IGVXKy6NLHt4WeWiOnAFmSsXRpd6elkjDZMtr5vBLJ8= github.com/ProtonMail/go-srp v0.0.7 h1:Sos3Qk+th4tQR64vsxGIxYpN3rdnG9Wf9K4ZloC1JrI= github.com/ProtonMail/go-srp v0.0.7/go.mod h1:giCp+7qRnMIcCvI6V6U3S1lDDXDQYx2ewJ6F/9wdlJk= -github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton h1:YS6M20yvjCJPR1r4ADW5TPn6rahs4iAyZaACei86bEc= -github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton/go.mod h1:S1lYsaGHykYpxxh2SnJL6ypcAlANKj5NRSY6HxKryKQ= +github.com/ProtonMail/gopenpgp/v2 v2.7.3-proton h1:wuAxBUU9qF2wyDVJprn/2xPDx000eol5gwlKbOUYY88= +github.com/ProtonMail/gopenpgp/v2 v2.7.3-proton/go.mod h1:omVkSsfPAhmptzPF/piMXb16wKIWUvVhZbVW7sJKh0A= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/abiosoft/ishell v2.0.0+incompatible h1:zpwIuEHc37EzrsIYah3cpevrIc8Oma7oZPxr03tlmmw= @@ -64,6 +63,7 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bradenaw/juniper v0.12.0 h1:Q/7icpPQD1nH/La5DobQfNEtwyrBSiSu47jOQx7lJEM= github.com/bradenaw/juniper v0.12.0/go.mod h1:Z2B7aJlQ7xbfWsnMLROj5t/5FQ94/MkIdKC30J4WvzI= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= @@ -417,6 +417,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= @@ -464,6 +465,7 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= @@ -512,6 +514,8 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -519,6 +523,7 @@ golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -529,6 +534,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5-0.20201125200606-c27b9fd57aec/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= From 01043e033e5b2fc848dc1a4638b993a1cd040f68 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 11 Oct 2023 08:37:28 +0200 Subject: [PATCH 22/58] chore: Umshiang Bridge 3.5.3 changelog. --- Changelog.md | 6 ++++++ Makefile | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index d896445a..13df6ffa 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,12 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Umshiang Bridge 3.5.3 + +### Changed +* GODT-3004: Update gopenpgp and dependencies. + + ## Umshiang Bridge 3.5.2 ### Fixed diff --git a/Makefile b/Makefile index b99c44b9..14dd0298 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.5.2+git +BRIDGE_APP_VERSION?=3.5.3+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG From e580f89106e8efcb6aa6ea9c4cc1480edd75c6fd Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 11 Oct 2023 15:29:52 +0200 Subject: [PATCH 23/58] feat(GODT-3004): update gopenpgp and dependencies. --- go.mod | 6 +++--- go.sum | 20 +++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index fc5a08aa..b6f6097d 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,8 @@ require ( github.com/Masterminds/semver/v3 v3.2.0 github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a - github.com/ProtonMail/go-proton-api v0.4.1-0.20230925123025-331ad8e6d5ee - github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton + github.com/ProtonMail/go-proton-api v0.4.1-0.20231011132529-24b5b817ee1f + github.com/ProtonMail/gopenpgp/v2 v2.7.3-proton github.com/PuerkitoBio/goquery v1.8.1 github.com/abiosoft/ishell v2.0.0+incompatible github.com/allan-simon/go-singleinstance v0.0.0-20210120080615-d0997106ab37 @@ -53,7 +53,7 @@ require ( require ( github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230717121622-edf196117233 // indirect github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect github.com/ProtonMail/go-srp v0.0.7 // indirect github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db // indirect diff --git a/go.sum b/go.sum index cb4e1e30..157d4409 100644 --- a/go.sum +++ b/go.sum @@ -28,19 +28,18 @@ github.com/ProtonMail/gluon v0.17.1-0.20231009084701-3af0474b0b3c/go.mod h1:Og5/ 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= -github.com/ProtonMail/go-crypto v0.0.0-20230322105811-d73448b7e800/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= -github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek= -github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= +github.com/ProtonMail/go-crypto v0.0.0-20230717121622-edf196117233 h1:bdoKdh0f66/lrgVfYlxw0aqISY/KOqXmFJyGt7rGmnc= +github.com/ProtonMail/go-crypto v0.0.0-20230717121622-edf196117233/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7 h1:+j+Kd/DyZ/qGfMT9htAT7HxqIEbZHsatsx+m8AoV6fc= github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7/go.mod h1:NBAn21zgCJ/52WLDyed18YvYFm5tEoeDauubFqLokM4= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230925123025-331ad8e6d5ee h1:CzFXOiflEZZqT3HQqj2I5AkIprRbc/c6/lToPdEKzxM= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230925123025-331ad8e6d5ee/go.mod h1:Y3ea3i1UbqHz5vq43odmAAd6lmR4nx0ZIQ32tqMfxTY= +github.com/ProtonMail/go-proton-api v0.4.1-0.20231011132529-24b5b817ee1f h1:n0oBMAz2dJhn5+1WA6NrjkWqkZN+22FQMkPlRwNGhpU= +github.com/ProtonMail/go-proton-api v0.4.1-0.20231011132529-24b5b817ee1f/go.mod h1:ZmvQMA8hanLiD1tFsvu9+qGBcuxbIRfch/4z/nqBhXA= github.com/ProtonMail/go-srp v0.0.7 h1:Sos3Qk+th4tQR64vsxGIxYpN3rdnG9Wf9K4ZloC1JrI= github.com/ProtonMail/go-srp v0.0.7/go.mod h1:giCp+7qRnMIcCvI6V6U3S1lDDXDQYx2ewJ6F/9wdlJk= -github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton h1:YS6M20yvjCJPR1r4ADW5TPn6rahs4iAyZaACei86bEc= -github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton/go.mod h1:S1lYsaGHykYpxxh2SnJL6ypcAlANKj5NRSY6HxKryKQ= +github.com/ProtonMail/gopenpgp/v2 v2.7.3-proton h1:wuAxBUU9qF2wyDVJprn/2xPDx000eol5gwlKbOUYY88= +github.com/ProtonMail/gopenpgp/v2 v2.7.3-proton/go.mod h1:omVkSsfPAhmptzPF/piMXb16wKIWUvVhZbVW7sJKh0A= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/abiosoft/ishell v2.0.0+incompatible h1:zpwIuEHc37EzrsIYah3cpevrIc8Oma7oZPxr03tlmmw= @@ -64,6 +63,7 @@ github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJm github.com/bradenaw/juniper v0.12.0 h1:Q/7icpPQD1nH/La5DobQfNEtwyrBSiSu47jOQx7lJEM= github.com/bradenaw/juniper v0.12.0/go.mod h1:Z2B7aJlQ7xbfWsnMLROj5t/5FQ94/MkIdKC30J4WvzI= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= @@ -419,6 +419,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= @@ -466,6 +467,7 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= @@ -514,6 +516,8 @@ golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -521,6 +525,7 @@ golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -531,6 +536,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5-0.20201125200606-c27b9fd57aec/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= From 8be4246f7e261322651a528fcdbe8a9e8c87cb81 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 11 Oct 2023 16:09:55 +0200 Subject: [PATCH 24/58] chore: Vasco da Gama Bridge 3.6.0 changelog. --- Changelog.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Changelog.md b/Changelog.md index 8a35fc7e..e2f7059f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -33,6 +33,11 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * GODT-2929: Message dedup with different text transfer encoding. +## Umshiang Bridge 3.5.3 + +### Changed +* GODT-3004: Update gopenpgp and dependencies. + ## Umshiang Bridge 3.5.2 From 8b12a454eaa2c30638446b7c46ded4aa6654ede1 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Wed, 18 Oct 2023 14:29:27 +0200 Subject: [PATCH 25/58] fix(GODT-3033): Unable to receive new mail If the IMAP service happened to finish syncing and wanted to reset the user event service at a time the latter was publishing an event a deadlock would occur and the user would not receive any new messages. This change puts the request to revert the event id in a separate go-routine to avoid this situation from re-occurring. The operational flow remains unchanged as the event service will only process this request once the current set of events have been published. --- internal/services/imapservice/service.go | 42 ++++++++++++++---------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/internal/services/imapservice/service.go b/internal/services/imapservice/service.go index 79e4b9f0..0ccbeced 100644 --- a/internal/services/imapservice/service.go +++ b/internal/services/imapservice/service.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "path/filepath" + "sync/atomic" "time" "github.com/ProtonMail/gluon/async" @@ -94,7 +95,7 @@ type Service struct { syncConfigPath string lastHandledEventID string - isSyncing bool + isSyncing atomic.Bool } func NewService( @@ -405,23 +406,28 @@ func (s *Service) run(ctx context.Context) { //nolint gocyclo continue } + // Start a goroutine to wait on event reset as it is possible that the sync received message + // was processed during an event publish. This in turn will block the imap service, since the + // event service is unable to reply to the request until the events have been processed. s.log.Info("Sync complete, starting API event stream") - if err := s.eventProvider.RewindEventID(ctx, s.lastHandledEventID); err != nil { - if errors.Is(err, context.Canceled) { - continue + go func() { + if err := s.eventProvider.RewindEventID(ctx, s.lastHandledEventID); err != nil { + if errors.Is(err, context.Canceled) { + return + } + + s.log.WithError(err).Error("Failed to rewind event service") + s.eventPublisher.PublishEvent(ctx, events.UserBadEvent{ + UserID: s.identityState.UserID(), + OldEventID: "", + NewEventID: "", + EventInfo: "", + Error: fmt.Errorf("failed to rewind event loop: %w", err), + }) } - s.log.WithError(err).Error("Failed to rewind event service") - s.eventPublisher.PublishEvent(ctx, events.UserBadEvent{ - UserID: s.identityState.UserID(), - OldEventID: "", - NewEventID: "", - EventInfo: "", - Error: fmt.Errorf("failed to rewind event loop: %w", err), - }) - } - - s.isSyncing = false + s.isSyncing.Store(false) + }() } case request, ok := <-s.syncUpdateApplier.requestCh: @@ -443,7 +449,7 @@ func (s *Service) run(ctx context.Context) { //nolint gocyclo continue } e.Consume(func(event proton.Event) error { - if s.isSyncing { + if s.isSyncing.Load() { if err := syncEventHandler.OnEvent(ctx, event); err != nil { return err } @@ -615,13 +621,13 @@ func (s *Service) setShowAllMail(v bool) { } func (s *Service) startSyncing() { - s.isSyncing = true + s.isSyncing.Store(true) s.syncHandler.Execute(s.syncReporter, s.labels.GetLabelMap(), s.syncUpdateApplier, s.syncMessageBuilder, syncservice.DefaultRetryCoolDown) } func (s *Service) cancelSync() { s.syncHandler.CancelAndWait() - s.isSyncing = false + s.isSyncing.Store(false) } type resyncReq struct{} From 248fbf5e33edd623f4d44b319dff4927d63a8d50 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 18 Oct 2023 15:41:01 +0200 Subject: [PATCH 26/58] chore: Vasco da Gama Bridge 3.6.1 changelog. --- Changelog.md | 6 ++++++ Makefile | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index e2f7059f..855d228e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,12 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Vasco da Gama Bridge 3.6.1 + +### Fixed +* GODT-3033: Unable to receive new mail. + + ## Vasco da Gama Bridge 3.6.0 ### Added diff --git a/Makefile b/Makefile index 0ae1998a..21d1087a 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.6.0+git +BRIDGE_APP_VERSION?=3.6.1+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG From 8f5bd37aee097bbee2cf909665c2b0d5372c1420 Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Thu, 14 Dec 2023 16:41:00 +0100 Subject: [PATCH 27/58] chore: Get better logging arround keychain list initialisation. --- internal/app/app.go | 5 +++-- pkg/keychain/helper_darwin.go | 3 ++- pkg/keychain/helper_linux.go | 9 ++++++--- pkg/keychain/helper_windows.go | 3 ++- utils/vault-editor/main.go | 4 ++-- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/internal/app/app.go b/internal/app/app.go index b082d5b2..1d3cd246 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -236,7 +236,7 @@ func run(c *cli.Context) error { return withSingleInstance(settings, locations.GetLockFile(), version, func() error { // Look for available keychains - return WithKeychainList(func(keychains *keychain.List) error { + return WithKeychainList(crashHandler, func(keychains *keychain.List) error { // Unlock the encrypted vault. return WithVault(locations, keychains, crashHandler, func(v *vault.Vault, insecure, corrupt bool) error { if !v.Migrated() { @@ -482,9 +482,10 @@ func withCookieJar(vault *vault.Vault, fn func(http.CookieJar) error) error { } // WithKeychainList init the list of usable keychains. -func WithKeychainList(fn func(*keychain.List) error) error { +func WithKeychainList(panicHandler async.PanicHandler, fn func(*keychain.List) error) error { logrus.Debug("Creating keychain list") defer logrus.Debug("Keychain list stop") + defer async.HandlePanic(panicHandler) return fn(keychain.NewList()) } diff --git a/pkg/keychain/helper_darwin.go b/pkg/keychain/helper_darwin.go index ee21675d..1cba6de5 100644 --- a/pkg/keychain/helper_darwin.go +++ b/pkg/keychain/helper_darwin.go @@ -37,8 +37,9 @@ func listHelpers() (Helpers, string) { // MacOS always provides a keychain. if isUsable(newMacOSHelper("")) { helpers[MacOSKeychain] = newMacOSHelper + logrus.WithField("keychain", "MacOSKeychain").Info("Keychain is usable.") } else { - logrus.WithField("keychain", "MacOSKeychain").Warn("Keychain is not available.") + logrus.WithField("keychain", "MacOSKeychain").Debug("Keychain is not available.") } // Use MacOSKeychain by default. diff --git a/pkg/keychain/helper_linux.go b/pkg/keychain/helper_linux.go index 1ab288e9..ef21ec1d 100644 --- a/pkg/keychain/helper_linux.go +++ b/pkg/keychain/helper_linux.go @@ -36,20 +36,23 @@ func listHelpers() (Helpers, string) { if isUsable(newDBusHelper("")) { helpers[SecretServiceDBus] = newDBusHelper + logrus.WithField("keychain", "SecretServiceDBus").Info("Keychain is usable.") } else { - logrus.WithField("keychain", "SecretServiceDBus").Warn("Keychain is not available.") + logrus.WithField("keychain", "SecretServiceDBus").Debug("Keychain is not available.") } if _, err := execabs.LookPath("gnome-keyring"); err == nil && isUsable(newSecretServiceHelper("")) { helpers[SecretService] = newSecretServiceHelper + logrus.WithField("keychain", "SecretService").Info("Keychain is usable.") } else { - logrus.WithField("keychain", "SecretService").Warn("Keychain is not available.") + logrus.WithField("keychain", "SecretService").Debug("Keychain is not available.") } if _, err := execabs.LookPath("pass"); err == nil && isUsable(newPassHelper("")) { helpers[Pass] = newPassHelper + logrus.WithField("keychain", "Pass").Info("Keychain is usable.") } else { - logrus.WithField("keychain", "Pass").Warn("Keychain is not available.") + logrus.WithField("keychain", "Pass").Debug("Keychain is not available.") } defaultHelper := SecretServiceDBus diff --git a/pkg/keychain/helper_windows.go b/pkg/keychain/helper_windows.go index 718b42f1..e2658c86 100644 --- a/pkg/keychain/helper_windows.go +++ b/pkg/keychain/helper_windows.go @@ -30,8 +30,9 @@ func listHelpers() (Helpers, string) { // Windows always provides a keychain. if isUsable(newWinCredHelper("")) { helpers[WindowsCredentials] = newWinCredHelper + logrus.WithField("keychain", "WindowsCredentials").Info("Keychain is usable.") } else { - logrus.WithField("keychain", "WindowsCredentials").Warn("Keychain is not available.") + logrus.WithField("keychain", "WindowsCredentials").Debug("Keychain is not available.") } // Use WindowsCredentials by default. return helpers, WindowsCredentials diff --git a/utils/vault-editor/main.go b/utils/vault-editor/main.go index fd241461..0ac44ced 100644 --- a/utils/vault-editor/main.go +++ b/utils/vault-editor/main.go @@ -51,7 +51,7 @@ func main() { func readAction(c *cli.Context) error { return app.WithLocations(func(locations *locations.Locations) error { - return app.WithKeychainList(func(keychains *keychain.List) error { + return app.WithKeychainList(async.NoopPanicHandler{}, func(keychains *keychain.List) error { return app.WithVault(locations, keychains, async.NoopPanicHandler{}, func(vault *vault.Vault, insecure, corrupt bool) error { if _, err := os.Stdout.Write(vault.ExportJSON()); err != nil { return fmt.Errorf("failed to write vault: %w", err) @@ -65,7 +65,7 @@ func readAction(c *cli.Context) error { func writeAction(c *cli.Context) error { return app.WithLocations(func(locations *locations.Locations) error { - return app.WithKeychainList(func(keychains *keychain.List) error { + return app.WithKeychainList(async.NoopPanicHandler{}, func(keychains *keychain.List) error { return app.WithVault(locations, keychains, async.NoopPanicHandler{}, func(vault *vault.Vault, insecure, corrupt bool) error { b, err := io.ReadAll(os.Stdin) if err != nil { From 3ac59d6943eb8c07944c1592082b76f87ed15ab1 Mon Sep 17 00:00:00 2001 From: Gjorgji Slamkov Date: Fri, 15 Dec 2023 09:53:49 +0000 Subject: [PATCH 28/58] test(GODT-3162): Add step definition for checking KB article suggestions * Add a step definition that takes input from a possible problem report description, and gets the suggested knowledge base articles * Also, has input of what those knowledge base articles should be, just their title and url, and compares these two values. * A sample integration test is added --- tests/bridge_test.go | 25 +++++++++++++++++++ .../user/kb_article_suggestions.feature | 23 +++++++++++++++++ tests/steps_test.go | 1 + 3 files changed, 49 insertions(+) create mode 100644 tests/features/user/kb_article_suggestions.feature diff --git a/tests/bridge_test.go b/tests/bridge_test.go index 87e9a877..11430a4d 100644 --- a/tests/bridge_test.go +++ b/tests/bridge_test.go @@ -31,6 +31,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/events" + "github.com/ProtonMail/proton-bridge/v3/internal/kb" "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/cucumber/godog" "github.com/golang/mock/gomock" @@ -236,6 +237,30 @@ func (s *scenario) theUserReportsABugWithDetails(value *godog.DocString) error { return bugReport.report() } +func (s *scenario) theDescriptionInputProvidesKnowledgeBaseArticles(description string, value *godog.DocString) error { + var wantSuggestions kb.ArticleList + if err := json.Unmarshal([]byte(value.Content), &wantSuggestions); err != nil { + return fmt.Errorf("Cannot parse wanted suggestions: %w", err) + } + + haveSuggestions, err := s.t.bridge.GetKnowledgeBaseSuggestions(description) + if err != nil { + return err + } + + for i := 0; i < len(wantSuggestions); i++ { + if haveSuggestions[i].URL != wantSuggestions[i].URL { + return fmt.Errorf("Description \"%v\" has URL: \"%v\", want: \"%v\"", description, haveSuggestions[i].URL, wantSuggestions[i].URL) + } + + if haveSuggestions[i].Title != wantSuggestions[i].Title { + return fmt.Errorf("Description \"%v\" has Title: \"%v\", want: \"%v\"", description, haveSuggestions[i].Title, wantSuggestions[i].Title) + } + } + + return nil +} + func (s *scenario) bridgeSendsAConnectionUpEvent() error { if event := s.t.events.await(events.ConnStatusUp{}, 30*time.Second); event == nil { return errors.New("expected connection up event, got none") diff --git a/tests/features/user/kb_article_suggestions.feature b/tests/features/user/kb_article_suggestions.feature new file mode 100644 index 00000000..9b98e404 --- /dev/null +++ b/tests/features/user/kb_article_suggestions.feature @@ -0,0 +1,23 @@ +Feature: The user reports a problem + Background: + Given bridge starts + And it succeeds + + Scenario: The user wants to report a problem + Then the description "Setup Outlook Windows" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook for Windows 2019 setup guide" + } + ] + """ diff --git a/tests/steps_test.go b/tests/steps_test.go index 1ccc1b01..a02e6825 100644 --- a/tests/steps_test.go +++ b/tests/steps_test.go @@ -76,6 +76,7 @@ func (s *scenario) steps(ctx *godog.ScenarioContext) { ctx.Step(`^the user reports a bug$`, s.theUserReportsABug) ctx.Step(`^the user reports a bug with field "([^"]*)" set to "([^"]*)"$`, s.theUserReportsABugWithSingleHeaderChange) ctx.Step(`^the user reports a bug with details:$`, s.theUserReportsABugWithDetails) + ctx.Step(`^the description "([^"]*)" provides the following KB suggestions:$`, s.theDescriptionInputProvidesKnowledgeBaseArticles) ctx.Step(`^the user hides All Mail$`, s.theUserHidesAllMail) ctx.Step(`^the user shows All Mail$`, s.theUserShowsAllMail) ctx.Step(`^the user disables telemetry in bridge settings$`, s.theUserDisablesTelemetryInBridgeSettings) From 8703faf345474c257221577d5785019a24aa0051 Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Mon, 18 Dec 2023 09:42:48 +0100 Subject: [PATCH 29/58] chore: set log as artefact for all integration test. --- ci/test.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ci/test.yml b/ci/test.yml index ed5d2ecc..5b8e055b 100644 --- a/ci/test.yml +++ b/ci/test.yml @@ -55,14 +55,23 @@ test-integration: extends: - test-linux script: - - make test-integration + - make test-integration | tee -a integration-job.log + artifacts: + when: always + paths: + - integration-job.log test-integration-race: extends: - test-integration - .rules-branch-and-MR-manual script: - - make test-integration-race + - make test-integration-race | tee -a integration-race-job.log + artifacts: + when: always + paths: + - integration-race-job.log + test-integration-nightly: extends: From dc002959eb491a617ba03c67bf5b7d61dcdc2562 Mon Sep 17 00:00:00 2001 From: Gjorgji Slamkov Date: Mon, 18 Dec 2023 14:53:13 +0000 Subject: [PATCH 30/58] test: Add scenarios for checking messages sent from Web Client --- tests/features/imap/message/fetch.feature | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/features/imap/message/fetch.feature b/tests/features/imap/message/fetch.feature index f1375c91..97b46d22 100644 --- a/tests/features/imap/message/fetch.feature +++ b/tests/features/imap/message/fetch.feature @@ -1,6 +1,7 @@ Feature: IMAP Fetch Background: Given there exists an account with username "[user:user]" and password "password" + And the account "[user:user]" has additional address "[user:alias]@[domain]" And the account "[user:user]" has the following custom mailboxes: | name | type | | mbox | folder | @@ -26,3 +27,48 @@ Feature: IMAP Fetch Then IMAP client "1" eventually sees the following messages in "INBOX": | from | to | subject | date | | john.doe@mail.com | [user:user]@[domain] | foo | 13 Aug 82 00:00 +0000 | + + Scenario: Fetch messages sent from Web Client + When the address "[user:user]@[domain]" of account "[user:user]" has the following messages in "Sent": + | from | to | subject | + | [user:user]@[domain] | john.doe@mail.com | foo | + Then IMAP client "1" eventually sees the following messages in "Sent": + | from | to | subject | + | [user:user]@[domain] | john.doe@mail.com | foo | + + @regression + Scenario: Fetch multiple messages sent from Web Client + When the address "[user:user]@[domain]" of account "[user:user]" has 5 messages in "Sent" + Then IMAP client "1" eventually sees 5 messages in "Sent" + + @regression + Scenario: Fetch messages sent from Web Client in Split mode + When the user sets the address mode of user "[user:user]" to "split" + And user "[user:user]" finishes syncing + And user "[user:user]" connects and authenticates IMAP client "1" with address "[user:user]@[domain]" + And user "[user:user]" connects and authenticates IMAP client "2" with address "[user:alias]@[domain]" + Then it succeeds + When the address "[user:user]@[domain]" of account "[user:user]" has the following messages in "Sent": + | from | to | subject | + | [user:user]@[domain] | john.doe@mail.com | foo | + Then IMAP client "1" eventually sees the following messages in "Sent": + | from | to | subject | + | [user:user]@[domain] | john.doe@mail.com | foo | + When the address "[user:alias]@[domain]" of account "[user:user]" has the following messages in "Sent": + | from | to | subject | + | [user:alias]@[domain] | john.doe@mail.com | bar | + Then IMAP client "2" eventually sees the following messages in "Sent": + | from | to | subject | + | [user:alias]@[domain] | john.doe@mail.com | bar | + + @regression + Scenario: Fetch multiple messages sent from Web Client in Split mode + When the user sets the address mode of user "[user:user]" to "split" + And user "[user:user]" finishes syncing + And user "[user:user]" connects and authenticates IMAP client "1" with address "[user:user]@[domain]" + And user "[user:user]" connects and authenticates IMAP client "2" with address "[user:alias]@[domain]" + Then it succeeds + When the address "[user:user]@[domain]" of account "[user:user]" has 5 messages in "Sent" + And the address "[user:alias]@[domain]" of account "[user:user]" has 10 messages in "Sent" + Then IMAP client "1" eventually sees 5 messages in "Sent" + Then IMAP client "2" eventually sees 10 messages in "Sent" From 26a3385f4e3656fbc9223bd0c9180076f72bc38f Mon Sep 17 00:00:00 2001 From: gzafirova Date: Wed, 20 Dec 2023 17:23:24 +0100 Subject: [PATCH 31/58] test(GODT-3162): Add test scenarios for KB article suggestions -Added test scenarios to check relevant suggestion links to knowledge base articles in the in-app bug report form --- .../user/kb_article_suggestions.feature | 1002 +++++++++++++++++ 1 file changed, 1002 insertions(+) diff --git a/tests/features/user/kb_article_suggestions.feature b/tests/features/user/kb_article_suggestions.feature index 9b98e404..77429c5f 100644 --- a/tests/features/user/kb_article_suggestions.feature +++ b/tests/features/user/kb_article_suggestions.feature @@ -1,3 +1,4 @@ +@regression Feature: The user reports a problem Background: Given bridge starts @@ -21,3 +22,1004 @@ Feature: The user reports a problem } ] """ + + Scenario: The user wants to report a problem + Then the description "Manual update" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-automatic-update", + "title": "Automatic Update and Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-manual-update", + "title": "How to manually update Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "How to update" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-automatic-update", + "title": "Automatic Update and Bridge" + }, + { + "url": "https://proton.me/support/update-required", + "title": "Update required" + }, + { + "url": "https://proton.me/support/protonmail-bridge-manual-update", + "title": "How to manually update Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "automatic update" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-automatic-update", + "title": "Automatic Update and Bridge" + }, + { + "url": "https://proton.me/support/automatically-start-bridge", + "title": "Automatically start Bridge" + }, + { + "url": "https://proton.me/support/update-required", + "title": "Update required" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "login on Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/automatically-start-bridge", + "title": "Automatically start Bridge" + }, + { + "url": "https://proton.me/support/bridge-linux-login-error", + "title": "How to fix Proton Bridge login errors" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "start Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/automatically-start-bridge", + "title": "Automatically start Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "restart Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/automatically-start-bridge", + "title": "Automatically start Bridge" + }, + { + "url": "https://proton.me/support/bridge-automatic-update", + "title": "Automatic Update and Bridge" + }, + { + "url": "https://proton.me/support/update-required", + "title": "Update required" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "message encryption" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/messages-encrypted-via-bridge", + "title": "Are my messages encrypted via Proton Mail Bridge?" + }, + { + "url": "https://proton.me/support/sending-pgp-emails-bridge", + "title": "Sending PGP emails in Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "pgp encryption" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/sending-pgp-emails-bridge", + "title": "Sending PGP emails in Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/messages-encrypted-via-bridge", + "title": "Are my messages encrypted via Proton Mail Bridge?" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "gpg encryption" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/sending-pgp-emails-bridge", + "title": "Sending PGP emails in Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/messages-encrypted-via-bridge", + "title": "Are my messages encrypted via Proton Mail Bridge?" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "privacy and security in Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/messages-encrypted-via-bridge", + "title": "Are my messages encrypted via Proton Mail Bridge?" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "labels in Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/labels-in-bridge", + "title": "Labels in Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "folders in Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/labels-in-bridge", + "title": "Labels in Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "directories in Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/labels-in-bridge", + "title": "Labels in Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "connection issue with Thunderbird" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + }, + { + "url": "https://proton.me/support/thunderbird-connection-server-timed-error", + "title": "Thunderbird: 'Connection to server timed out' error" + }, + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "connection issue with Outlook" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + }, + { + "url": "https://proton.me/support/thunderbird-connection-server-timed-error", + "title": "Thunderbird: 'Connection to server timed out' error" + }, + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "connection issue with Apple Mail" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + }, + { + "url": "https://proton.me/support/thunderbird-connection-server-timed-error", + "title": "Thunderbird: 'Connection to server timed out' error" + }, + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "combined mode" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/difference-combined-addresses-mode-split-addresses-mode", + "title": "Difference between combined addresses mode and split addresses mode" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "split mode" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/difference-combined-addresses-mode-split-addresses-mode", + "title": "Difference between combined addresses mode and split addresses mode" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Connection to server timed out" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/thunderbird-connection-server-timed-error", + "title": "Thunderbird: 'Connection to server timed out' error" + }, + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + }, + { + "url": "https://proton.me/support/bridge-linux-login-error", + "title": "How to fix Proton Bridge login errors" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "update required" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/update-required", + "title": "Update required" + }, + { + "url": "https://proton.me/support/bridge-automatic-update", + "title": "Automatic Update and Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-manual-update", + "title": "How to manually update Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "port already occupied error" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + }, + { + "url": "https://proton.me/support/invalid-password-error-setting-email-client", + "title": "Invalid password error while setting up email client" + }, + { + "url": "https://proton.me/support/bridge-linux-login-error", + "title": "How to fix Proton Bridge login errors" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "1143 port" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "1025 port" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "IMAP server" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + }, + { + "url": "https://proton.me/support/imap-smtp-and-pop3-setup", + "title": "IMAP, SMTP, and POP3 setup" + }, + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "SMTP server" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + }, + { + "url": "https://proton.me/support/imap-smtp-and-pop3-setup", + "title": "IMAP, SMTP, and POP3 setup" + }, + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Canary supported by Proton Mail Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + }, + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Eudora" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "configure Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/imap-smtp-and-pop3-setup", + "title": "IMAP, SMTP, and POP3 setup" + }, + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Install Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/install-bridge-linux-rpm-file", + "title": "Installing Proton Mail Bridge for Linux using an RPM file" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Bridge on Linux" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/bridge-for-linux", + "title": "Proton Mail Bridge for Linux" + }, + { + "url": "https://proton.me/support/operating-systems-supported-bridge", + "title": "System requirements for Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "requirements for Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/operating-systems-supported-bridge", + "title": "System requirements for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Configure email client" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Bridge application" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "invalid password error" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/invalid-password-error-setting-email-client", + "title": "Invalid password error while setting up email client" + }, + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + }, + { + "url": "https://proton.me/support/bridge-linux-login-error", + "title": "How to fix Proton Bridge login errors" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Setup guide for Outlook" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook for Windows 2019 setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2016", + "title": "Proton Mail Bridge Microsoft Outlook 2016 for Windows setup guide" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Proton Mail Bridge Microsoft Outlook configuration" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook for Windows 2019 setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2016", + "title": "Proton Mail Bridge Microsoft Outlook 2016 for Windows setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-macos-new-outlook", + "title": "Proton Mail Bridge new Outlook for macOS setup guide" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Proton Mail Bridge Microsoft Outlook 2016" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + }, + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Proton Mail Bridge Apple Mail setup guide" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-apple-mail", + "title": "Proton Mail Bridge Apple Mail setup guide" + }, + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Apple Mail setup configuration" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-clients-apple-mail", + "title": "Proton Mail Bridge Apple Mail setup guide" + }, + { + "url": "https://proton.me/support/imap-smtp-and-pop3-setup", + "title": "IMAP, SMTP, and POP3 setup" + }, + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Outlook for macOS configuration" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook for Windows 2019 setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-macos-new-outlook", + "title": "Proton Mail Bridge new Outlook for macOS setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2016", + "title": "Proton Mail Bridge Microsoft Outlook 2016 for Windows setup guide" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Thunderbird configuration" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-thunderbird", + "title": "Proton Mail Bridge Thunderbird setup guide for Windows, macOS, and Linux" + }, + { + "url": "https://proton.me/support/bridge-ssl-connection-issue", + "title": "Proton Mail Bridge connection issues with Thunderbird, Outlook, and Apple Mail" + }, + { + "url": "https://proton.me/support/thunderbird-connection-server-timed-error", + "title": "Thunderbird: 'Connection to server timed out' error" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Outlook 2016 for macOS" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-macos-outlook-2016", + "title": "Proton Mail Bridge Microsoft Outlook 2016 for macOS setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2016", + "title": "Proton Mail Bridge Microsoft Outlook 2016 for Windows setup guide" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Outlook 2019 for macOS" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-clients-macos-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook 2019 for macOS setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook for Windows 2019 setup guide" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Proton Mail Bridge Microsoft Outlook for Windows 2013 setup guide" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-configure-client", + "title": "How to configure your email client for Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2019", + "title": "Proton Mail Bridge Microsoft Outlook for Windows 2019 setup guide" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "macOS and Outlook 11" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-clients-windows-outlook-2016", + "title": "Proton Mail Bridge Microsoft Outlook 2016 for Windows setup guide" + }, + { + "url": "https://proton.me/support/clients-supported-bridge", + "title": "Email clients supported by Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "use PKGBUILD file for Linux" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/install-bridge-linux-pkgbuild-file", + "title": "Installing Proton Mail Bridge for Linux using a PKGBUILD file" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/bridge-for-linux", + "title": "Proton Mail Bridge for Linux" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "use DEB file for Linux" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-for-linux", + "title": "Proton Mail Bridge for Linux" + }, + { + "url": "https://proton.me/support/installing-bridge-linux-deb-file", + "title": "Installing Proton Mail Bridge for Linux using a DEB file" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "verify Bridge package for Linux" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/verifying-bridge-package", + "title": "Verifying the Proton Mail Bridge package for Linux" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/bridge-for-linux", + "title": "Proton Mail Bridge for Linux" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Bridge CLI guide" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-cli-guide", + "title": "Bridge CLI (command line interface) guide" + }, + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Install Bridge for Linux using an RPM file" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/install-bridge-linux-rpm-file", + "title": "Installing Proton Mail Bridge for Linux using an RPM file" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/bridge-for-linux", + "title": "Proton Mail Bridge for Linux" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "login errors on Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-linux-login-error", + "title": "How to fix Proton Bridge login errors" + }, + { + "url": "https://proton.me/support/automatically-start-bridge", + "title": "Automatically start Bridge" + }, + { + "url": "https://proton.me/support/port-already-occupied-error", + "title": "Port already occupied error" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Missing system tray icon in Linux" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-linux-tray-icon", + "title": "How to fix a missing system tray icon in Linux" + }, + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/bridge-for-linux", + "title": "Proton Mail Bridge for Linux" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "how to receive notification" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-linux-tray-icon", + "title": "How to fix a missing system tray icon in Linux" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Why you need Proton Mail Bridge" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/why-you-need-bridge", + "title": "Why you need Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Bridge Manual update" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/bridge-automatic-update", + "title": "Automatic Update and Bridge" + }, + { + "url": "https://proton.me/support/protonmail-bridge-manual-update", + "title": "How to manually update Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/update-required", + "title": "Update required" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Warning when installing Bridge on macOS" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/macos-certificate-warning", + "title": "Warning when installing Proton Mail Bridge on macOS" + }, + { + "url": "https://proton.me/support/operating-systems-supported-bridge", + "title": "System requirements for Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Certificate warning" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/macos-certificate-warning", + "title": "Warning when installing Proton Mail Bridge on macOS" + }, + { + "url": "https://proton.me/support/apple-mail-certificate", + "title": "Why you need to install a certificate for Apple Mail with Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "Installing a certificate for Apple Mail on macOS" provides the following KB suggestions: + """ + [ + { + "url": "https://proton.me/support/protonmail-bridge-install", + "title": "How to install Proton Mail Bridge" + }, + { + "url": "https://proton.me/support/macos-certificate-warning", + "title": "Warning when installing Proton Mail Bridge on macOS" + }, + { + "url": "https://proton.me/support/apple-mail-certificate", + "title": "Why you need to install a certificate for Apple Mail with Proton Mail Bridge" + } + ] + """ + + Scenario: The user wants to report a problem + Then the description "xoxoxo" provides the following KB suggestions: + """ + [] + """ + From b8ae5be58cbd15ec778b54ce1adcb7502c29c8c3 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 2 Jan 2024 14:32:11 +0100 Subject: [PATCH 32/58] fix(GODT-3188): Happy new year. --- README.md | 2 +- cmd/Desktop-Bridge/main.go | 2 +- cmd/launcher/main.go | 2 +- cmd/launcher/main_test.go | 2 +- internal/app/app.go | 2 +- internal/app/bridge.go | 2 +- internal/app/frontend.go | 2 +- internal/app/migration.go | 2 +- internal/app/migration_test.go | 2 +- internal/app/singleinstance.go | 2 +- internal/app/vault.go | 2 +- internal/bridge/api.go | 2 +- internal/bridge/api_default.go | 2 +- internal/bridge/api_qa.go | 2 +- internal/bridge/bridge.go | 2 +- internal/bridge/bridge_test.go | 2 +- internal/bridge/bug_report.go | 2 +- internal/bridge/config_status.go | 2 +- internal/bridge/configure.go | 2 +- internal/bridge/debug.go | 2 +- internal/bridge/draft_test.go | 2 +- internal/bridge/errors.go | 2 +- internal/bridge/events.go | 2 +- internal/bridge/heartbeat.go | 2 +- internal/bridge/identifier.go | 2 +- internal/bridge/imap.go | 2 +- internal/bridge/imapsmtp_telemetry.go | 2 +- internal/bridge/keychain.go | 2 +- internal/bridge/locations.go | 2 +- internal/bridge/main_test.go | 2 +- internal/bridge/mocks/matcher.go | 2 +- internal/bridge/refresh_test.go | 2 +- internal/bridge/send_test.go | 2 +- internal/bridge/sentry_test.go | 2 +- internal/bridge/server_manager_test.go | 2 +- internal/bridge/settings.go | 2 +- internal/bridge/settings_test.go | 2 +- internal/bridge/smtp.go | 2 +- internal/bridge/sync_test.go | 2 +- internal/bridge/sync_unix_test.go | 2 +- internal/bridge/tls.go | 2 +- internal/bridge/types.go | 2 +- internal/bridge/updates.go | 2 +- internal/bridge/user.go | 2 +- internal/bridge/user_event_test.go | 2 +- internal/bridge/user_events.go | 2 +- internal/bridge/user_test.go | 2 +- internal/certs/cert_store_darwin.go | 2 +- internal/certs/cert_store_darwin_test.go | 2 +- internal/certs/cert_store_linux.go | 2 +- internal/certs/cert_store_windows.go | 2 +- internal/certs/installer.go | 2 +- internal/certs/tls.go | 2 +- internal/certs/tls_test.go | 2 +- internal/clientconfig/applemail.go | 2 +- internal/configstatus/config_status.go | 2 +- internal/configstatus/config_status_test.go | 2 +- internal/configstatus/configuration_abort.go | 2 +- .../configstatus/configuration_abort_test.go | 2 +- .../configstatus/configuration_progress.go | 2 +- .../configuration_progress_test.go | 2 +- .../configstatus/configuration_recovery.go | 2 +- .../configuration_recovery_test.go | 2 +- .../configstatus/configuration_success.go | 2 +- .../configuration_success_test.go | 2 +- internal/configstatus/types_config_status.go | 2 +- internal/constants/constants.go | 2 +- internal/constants/host_default.go | 2 +- internal/constants/host_qa.go | 2 +- internal/constants/update_default.go | 2 +- internal/constants/update_qa.go | 2 +- internal/constants/version_default.go | 2 +- internal/constants/version_qa.go | 2 +- internal/constants/version_test.go | 2 +- internal/cookies/jar.go | 2 +- internal/cookies/jar_test.go | 2 +- internal/crash/actions.go | 2 +- internal/crash/handler.go | 2 +- internal/crash/handler_test.go | 2 +- internal/dialer/dialer_basic.go | 2 +- internal/dialer/dialer_pinning.go | 2 +- internal/dialer/dialer_pinning_checker.go | 2 +- .../dialer/dialer_pinning_checker_default.go | 2 +- internal/dialer/dialer_pinning_checker_qa.go | 2 +- internal/dialer/dialer_pinning_report.go | 2 +- internal/dialer/dialer_pinning_reporter.go | 2 +- .../dialer/dialer_pinning_reporter_test.go | 2 +- internal/dialer/dialer_pinning_test.go | 2 +- internal/dialer/dialer_proxy.go | 2 +- internal/dialer/dialer_proxy_provider.go | 2 +- internal/dialer/dialer_proxy_provider_test.go | 2 +- internal/dialer/dialer_proxy_test.go | 2 +- internal/dialer/dialer_test.go | 2 +- internal/errors.go | 2 +- internal/events/address.go | 2 +- internal/events/connection.go | 2 +- internal/events/error.go | 2 +- internal/events/events.go | 2 +- internal/events/label.go | 2 +- internal/events/raise.go | 2 +- internal/events/serve.go | 2 +- internal/events/sync.go | 2 +- internal/events/update.go | 2 +- internal/events/user.go | 2 +- internal/files/files.go | 2 +- internal/files/files_test.go | 2 +- internal/focus/client.go | 2 +- internal/focus/focus_test.go | 2 +- internal/focus/proto/focus.go | 2 +- internal/focus/service.go | 2 +- .../bridge-gui-tester/AppController.cpp | 2 +- .../bridge-gui-tester/AppController.h | 2 +- .../bridge-gui/bridge-gui-tester/Cert.cpp | 2 +- .../bridge-gui/bridge-gui-tester/Cert.h | 2 +- .../GRPCMetaDataProcessor.cpp | 2 +- .../bridge-gui-tester/GRPCMetaDataProcessor.h | 2 +- .../bridge-gui-tester/GRPCQtProxy.cpp | 2 +- .../bridge-gui-tester/GRPCQtProxy.h | 2 +- .../bridge-gui-tester/GRPCServerWorker.cpp | 2 +- .../bridge-gui-tester/GRPCServerWorker.h | 2 +- .../bridge-gui-tester/GRPCService.cpp | 2 +- .../bridge-gui-tester/GRPCService.h | 2 +- .../bridge-gui-tester/MainWindow.cpp | 2 +- .../bridge-gui/bridge-gui-tester/MainWindow.h | 2 +- .../bridge-gui/bridge-gui-tester/Pch.h | 2 +- .../bridge-gui-tester/Tabs/EventsTab.cpp | 2 +- .../bridge-gui-tester/Tabs/EventsTab.h | 2 +- .../Tabs/KnowledgeBaseTab.cpp | 2 +- .../bridge-gui-tester/Tabs/KnowledgeBaseTab.h | 2 +- .../bridge-gui-tester/Tabs/SettingsTab.cpp | 2 +- .../bridge-gui-tester/Tabs/SettingsTab.h | 2 +- .../bridge-gui-tester/Tabs/UsersTab.cpp | 2 +- .../bridge-gui-tester/Tabs/UsersTab.h | 2 +- .../bridge-gui-tester/UserDialog.cpp | 2 +- .../bridge-gui/bridge-gui-tester/UserDialog.h | 2 +- .../bridge-gui-tester/UserTable.cpp | 2 +- .../bridge-gui/bridge-gui-tester/UserTable.h | 2 +- .../bridge-gui/bridge-gui-tester/main.cpp | 2 +- .../bridge-gui/bridge-gui/AppController.cpp | 2 +- .../bridge-gui/bridge-gui/AppController.h | 2 +- .../bridge-gui/bridge-gui/BridgeApp.cpp | 2 +- .../bridge-gui/bridge-gui/BridgeApp.h | 2 +- .../bridge-gui/bridge-gui/BuildConfig.h.in | 2 +- .../bridge-gui/bridge-gui/CommandLine.cpp | 2 +- .../bridge-gui/bridge-gui/CommandLine.h | 2 +- .../bridge-gui/EventStreamWorker.cpp | 2 +- .../bridge-gui/bridge-gui/EventStreamWorker.h | 2 +- .../bridge-gui/bridge-gui/LogUtils.cpp | 2 +- .../frontend/bridge-gui/bridge-gui/LogUtils.h | 2 +- .../bridge-gui/bridge-gui/MacOS/DockIcon.cpp | 2 +- .../bridge-gui/bridge-gui/MacOS/DockIcon.h | 2 +- .../bridge-gui/bridge-gui/MacOS/DockIcon.mm | 2 +- .../bridge-gui/MacOS/SecondInstance.h | 2 +- .../bridge-gui/MacOS/SecondInstance.mm | 2 +- internal/frontend/bridge-gui/bridge-gui/Pch.h | 2 +- .../bridge-gui/bridge-gui/QMLBackend.cpp | 2 +- .../bridge-gui/bridge-gui/QMLBackend.h | 2 +- .../bridge-gui/bridge-gui/SentryUtils.cpp | 2 +- .../bridge-gui/bridge-gui/SentryUtils.h | 2 +- .../bridge-gui/bridge-gui/Settings.cpp | 2 +- .../frontend/bridge-gui/bridge-gui/Settings.h | 2 +- .../bridge-gui/bridge-gui/TrayIcon.cpp | 2 +- .../frontend/bridge-gui/bridge-gui/TrayIcon.h | 2 +- .../bridge-gui/bridge-gui/UserList.cpp | 2 +- .../frontend/bridge-gui/bridge-gui/UserList.h | 2 +- .../frontend/bridge-gui/bridge-gui/build.sh | 2 +- .../frontend/bridge-gui/bridge-gui/main.cpp | 2 +- .../bridge-gui/qml/AccountDelegate.qml | 2 +- .../bridge-gui/bridge-gui/qml/AccountView.qml | 2 +- .../bridge-gui/bridge-gui/qml/Banner.qml | 2 +- .../bridge-gui/bridge-gui/qml/Bridge.qml | 2 +- .../qml/BugReport/BugCategoryView.qml | 2 +- .../qml/BugReport/BugQuestionView.qml | 2 +- .../qml/BugReport/BugReportFlow.qml | 2 +- .../qml/BugReport/BugReportView.qml | 2 +- .../bridge-gui/qml/BugReport/CategoryItem.qml | 2 +- .../bridge-gui/qml/BugReport/QuestionItem.qml | 2 +- .../bridge-gui/qml/Configuration.qml | 2 +- .../bridge-gui/qml/ConfigurationItem.qml | 2 +- .../bridge-gui/qml/ConnectionModeSettings.qml | 2 +- .../bridge-gui/qml/ContentWrapper.qml | 2 +- .../bridge-gui/qml/DebugWrapper.qml | 2 +- .../bridge-gui/qml/GeneralSettings.qml | 2 +- .../bridge-gui/bridge-gui/qml/HelpView.qml | 2 +- .../bridge-gui/qml/KeychainSettings.qml | 2 +- .../bridge-gui/qml/LocalCacheSettings.qml | 2 +- .../bridge-gui/bridge-gui/qml/MainWindow.qml | 2 +- .../bridge-gui/qml/NoAccountView.qml | 2 +- .../bridge-gui/qml/NotificationDialog.qml | 2 +- .../bridge-gui/qml/NotificationPopups.qml | 2 +- .../qml/Notifications/Notification.qml | 2 +- .../qml/Notifications/NotificationFilter.qml | 2 +- .../qml/Notifications/Notifications.qml | 2 +- .../bridge-gui/qml/PortSettings.qml | 2 +- .../bridge-gui/qml/Proton/Action.qml | 2 +- .../qml/Proton/ApplicationWindow.qml | 2 +- .../bridge-gui/qml/Proton/Button.qml | 2 +- .../bridge-gui/qml/Proton/CheckBox.qml | 2 +- .../bridge-gui/qml/Proton/ColorScheme.qml | 2 +- .../bridge-gui/qml/Proton/ComboBox.qml | 2 +- .../bridge-gui/qml/Proton/Dialog.qml | 2 +- .../bridge-gui/qml/Proton/InfoTooltip.qml | 2 +- .../bridge-gui/qml/Proton/Label.qml | 2 +- .../bridge-gui/qml/Proton/LinkLabel.qml | 2 +- .../bridge-gui/bridge-gui/qml/Proton/Menu.qml | 2 +- .../bridge-gui/qml/Proton/MenuItem.qml | 2 +- .../bridge-gui/qml/Proton/Popup.qml | 2 +- .../bridge-gui/qml/Proton/RadioButton.qml | 2 +- .../bridge-gui/qml/Proton/Style.qml | 2 +- .../bridge-gui/qml/Proton/Switch.qml | 2 +- .../bridge-gui/qml/Proton/TextArea.qml | 2 +- .../bridge-gui/qml/Proton/TextField.qml | 2 +- .../bridge-gui/qml/Proton/Toggle.qml | 2 +- .../bridge-gui/qml/SettingsItem.qml | 2 +- .../bridge-gui/qml/SettingsView.qml | 2 +- .../qml/SetupWizard/ClientConfigAppleMail.qml | 2 +- .../qml/SetupWizard/ClientConfigEnd.qml | 2 +- .../SetupWizard/ClientConfigParameters.qml | 2 +- .../qml/SetupWizard/ClientConfigSelector.qml | 2 +- .../qml/SetupWizard/ClientListItem.qml | 2 +- .../bridge-gui/qml/SetupWizard/HelpButton.qml | 2 +- .../bridge-gui/qml/SetupWizard/LeftPane.qml | 2 +- .../bridge-gui/qml/SetupWizard/Login.qml | 2 +- .../bridge-gui/qml/SetupWizard/Onboarding.qml | 2 +- .../qml/SetupWizard/SetupWizard.qml | 2 +- .../qml/SetupWizard/StepDescriptionBox.qml | 2 +- .../bridge-gui/qml/SplashScreen.qml | 2 +- .../bridge-gui/bridge-gui/qml/Status.qml | 2 +- internal/frontend/bridge-gui/bridgepp/Pch.h | 2 +- .../bridgepp/Test/TestBridgeUtils.cpp | 2 +- .../bridgepp/Test/TestBugReportFlow.cpp | 2 +- .../bridgepp/Test/TestBugReportFlow.h | 2 +- .../bridge-gui/bridgepp/Test/TestCLI.cpp | 2 +- .../bridgepp/Test/TestException.cpp | 2 +- .../bridgepp/Test/TestSessionID.cpp | 2 +- .../bridge-gui/bridgepp/Test/TestWorker.cpp | 2 +- .../bridge-gui/bridgepp/Test/TestWorker.h | 2 +- .../bridgepp/bridgepp/BridgeUtils.cpp | 2 +- .../bridgepp/bridgepp/BridgeUtils.h | 2 +- .../bridgepp/BugReportFlow/BugReportFlow.cpp | 2 +- .../bridgepp/BugReportFlow/BugReportFlow.h | 2 +- .../bridgepp/bridgepp/CLI/CLIUtils.cpp | 2 +- .../bridgepp/bridgepp/CLI/CLIUtils.h | 2 +- .../bridgepp/bridgepp/Exception/Exception.cpp | 2 +- .../bridgepp/bridgepp/Exception/Exception.h | 2 +- .../bridgepp/FocusGRPC/FocusGRPCClient.cpp | 2 +- .../bridgepp/FocusGRPC/FocusGRPCClient.h | 2 +- .../bridgepp/bridgepp/GRPC/EventFactory.cpp | 2 +- .../bridgepp/bridgepp/GRPC/EventFactory.h | 2 +- .../bridgepp/bridgepp/GRPC/GRPCClient.cpp | 2 +- .../bridgepp/bridgepp/GRPC/GRPCClient.h | 2 +- .../bridgepp/bridgepp/GRPC/GRPCConfig.cpp | 2 +- .../bridgepp/bridgepp/GRPC/GRPCConfig.h | 2 +- .../bridgepp/bridgepp/GRPC/GRPCErrors.cpp | 2 +- .../bridgepp/bridgepp/GRPC/GRPCErrors.h | 2 +- .../bridgepp/bridgepp/GRPC/GRPCUtils.cpp | 2 +- .../bridgepp/bridgepp/GRPC/GRPCUtils.h | 2 +- .../bridge-gui/bridgepp/bridgepp/Log/Log.cpp | 2 +- .../bridge-gui/bridgepp/bridgepp/Log/Log.h | 2 +- .../bridgepp/bridgepp/Log/LogUtils.cpp | 2 +- .../bridgepp/bridgepp/Log/LogUtils.h | 2 +- .../bridgepp/bridgepp/ProcessMonitor.cpp | 2 +- .../bridgepp/bridgepp/ProcessMonitor.h | 2 +- .../bridgepp/bridgepp/SessionID/SessionID.cpp | 2 +- .../bridgepp/bridgepp/SessionID/SessionID.h | 2 +- .../bridgepp/bridgepp/User/User.cpp | 2 +- .../bridge-gui/bridgepp/bridgepp/User/User.h | 2 +- .../bridgepp/bridgepp/Worker/Overseer.cpp | 2 +- .../bridgepp/bridgepp/Worker/Overseer.h | 2 +- .../bridgepp/bridgepp/Worker/Worker.h | 2 +- internal/frontend/cli/account_utils.go | 2 +- internal/frontend/cli/accounts.go | 2 +- internal/frontend/cli/debug.go | 2 +- internal/frontend/cli/frontend.go | 2 +- internal/frontend/cli/system.go | 2 +- internal/frontend/cli/updates.go | 2 +- internal/frontend/cli/utils.go | 2 +- internal/frontend/grpc/event_factory.go | 2 +- internal/frontend/grpc/event_utils.go | 2 +- internal/frontend/grpc/service.go | 2 +- internal/frontend/grpc/service_cert.go | 2 +- internal/frontend/grpc/service_methods.go | 2 +- internal/frontend/grpc/service_stream.go | 2 +- internal/frontend/grpc/service_telemetry.go | 2 +- internal/frontend/grpc/service_user.go | 2 +- internal/frontend/grpc/types.go | 2 +- internal/frontend/grpc/utils.go | 2 +- internal/frontend/theme/detect_darwin.go | 2 +- internal/frontend/theme/detect_default.go | 2 +- internal/frontend/theme/detect_windows.go | 2 +- internal/frontend/theme/theme.go | 2 +- internal/frontend/theme/theme_test.go | 2 +- internal/identifier/identifier.go | 2 +- internal/kb/suggester.go | 2 +- internal/kb/suggester_test.go | 2 +- internal/legacy/credentials/credentials.go | 2 +- .../legacy/credentials/credentials_test.go | 2 +- internal/legacy/credentials/store.go | 2 +- internal/legacy/credentials/store_test.go | 2 +- internal/locations/locations.go | 2 +- internal/locations/locations_test.go | 2 +- internal/locations/provider.go | 2 +- internal/logging/compression.go | 2 +- internal/logging/compression_test.go | 2 +- internal/logging/crash.go | 2 +- internal/logging/crash_test.go | 2 +- internal/logging/imap_logger.go | 2 +- internal/logging/logging.go | 2 +- internal/logging/logging_test.go | 2 +- internal/logging/pruning.go | 2 +- internal/logging/pruning_test.go | 2 +- internal/logging/rotator.go | 2 +- internal/logging/rotator_test.go | 2 +- internal/logging/sensitive_default.go | 2 +- internal/logging/sensitive_sensitive.go | 2 +- internal/logging/session_id.go | 2 +- internal/logging/session_id_test.go | 2 +- internal/logging/smtp_logger.go | 2 +- internal/network/proton.go | 2 +- internal/safe/mutex.go | 2 +- internal/sentry/hostarch_darwin.go | 2 +- internal/sentry/hostarch_default.go | 2 +- internal/sentry/lang_default.go | 2 +- internal/sentry/reporter.go | 2 +- internal/sentry/reporter_test.go | 2 +- internal/service/config.go | 2 +- internal/service/config_test.go | 2 +- internal/service/types.go | 2 +- internal/services/imapservice/api_client.go | 2 +- internal/services/imapservice/connector.go | 2 +- .../services/imapservice/connector_test.go | 2 +- internal/services/imapservice/helpers.go | 2 +- internal/services/imapservice/imap_updates.go | 2 +- .../services/imapservice/server_manager.go | 2 +- internal/services/imapservice/service.go | 2 +- .../imapservice/service_address_events.go | 2 +- .../imapservice/service_label_events.go | 2 +- .../imapservice/service_message_events.go | 2 +- .../imapservice/service_sync_events.go | 2 +- internal/services/imapservice/shared_cache.go | 2 +- .../services/imapservice/shared_identity.go | 2 +- .../services/imapservice/shared_labels.go | 2 +- internal/services/imapservice/sync_build.go | 2 +- .../services/imapservice/sync_build_test.go | 2 +- .../imapservice/sync_message_builder.go | 2 +- .../services/imapservice/sync_reporter.go | 2 +- .../imapservice/sync_state_provider.go | 2 +- .../imapservice/sync_state_provider_test.go | 2 +- .../imapservice/sync_update_applier.go | 2 +- internal/services/imapsmtpserver/imap.go | 2 +- internal/services/imapsmtpserver/listener.go | 2 +- internal/services/imapsmtpserver/service.go | 2 +- internal/services/imapsmtpserver/smtp.go | 2 +- internal/services/imapsmtpserver/telemetry.go | 2 +- .../services/orderedtasks/ordered_cancel.go | 2 +- internal/services/sendrecorder/recorder.go | 2 +- .../services/sendrecorder/recorder_test.go | 2 +- internal/services/smtp/accounts.go | 2 +- internal/services/smtp/accounts_test.go | 2 +- internal/services/smtp/errors.go | 2 +- internal/services/smtp/server_manager.go | 2 +- internal/services/smtp/service.go | 2 +- internal/services/smtp/smtp.go | 2 +- internal/services/smtp/smtp_backend.go | 2 +- internal/services/smtp/smtp_debug.go | 2 +- internal/services/smtp/smtp_default.go | 2 +- internal/services/smtp/smtp_packages.go | 2 +- internal/services/smtp/smtp_packages_test.go | 2 +- internal/services/smtp/smtp_prefs.go | 2 +- internal/services/smtp/smtp_prefs_test.go | 2 +- internal/services/syncservice/api_client.go | 2 +- .../services/syncservice/download_cache.go | 2 +- internal/services/syncservice/handler.go | 2 +- internal/services/syncservice/handler_test.go | 2 +- internal/services/syncservice/interfaces.go | 2 +- internal/services/syncservice/job.go | 2 +- internal/services/syncservice/job_test.go | 2 +- internal/services/syncservice/limits.go | 2 +- internal/services/syncservice/service.go | 2 +- internal/services/syncservice/stage_apply.go | 2 +- .../services/syncservice/stage_apply_test.go | 2 +- internal/services/syncservice/stage_build.go | 2 +- .../services/syncservice/stage_build_test.go | 2 +- .../services/syncservice/stage_download.go | 2 +- .../syncservice/stage_download_test.go | 2 +- .../services/syncservice/stage_metadata.go | 2 +- .../syncservice/stage_metadata_test.go | 2 +- internal/services/syncservice/stage_output.go | 2 +- internal/services/syncservice/utils.go | 2 +- internal/services/telemetry/service.go | 2 +- internal/services/telemetry/service_test.go | 2 +- .../services/userevents/event_controller.go | 2 +- .../services/userevents/event_poll_waiter.go | 2 +- internal/services/userevents/event_source.go | 2 +- internal/services/userevents/eventid_store.go | 2 +- internal/services/userevents/service.go | 2 +- .../service_handle_event_error_test.go | 2 +- .../userevents/service_handle_event_test.go | 2 +- internal/services/userevents/service_test.go | 2 +- internal/services/userevents/subscribable.go | 2 +- internal/services/userevents/subscriber.go | 2 +- .../services/userevents/subscriber_test.go | 2 +- internal/services/userevents/subscription.go | 2 +- internal/services/useridentity/auth.go | 2 +- internal/services/useridentity/service.go | 2 +- .../services/useridentity/service_test.go | 2 +- internal/services/useridentity/state.go | 2 +- internal/services/useridentity/telemetry.go | 2 +- internal/telemetry/heartbeat.go | 2 +- internal/telemetry/heartbeat_test.go | 2 +- internal/telemetry/types_heartbeat.go | 2 +- internal/try/try.go | 2 +- internal/try/try_test.go | 2 +- internal/updater/channel.go | 2 +- internal/updater/host_default.go | 2 +- internal/updater/host_qa.go | 2 +- internal/updater/install_darwin.go | 2 +- internal/updater/install_default.go | 2 +- internal/updater/key_default.go | 2 +- internal/updater/keyring.go | 2 +- internal/updater/sync.go | 2 +- internal/updater/sync_test.go | 2 +- internal/updater/updater.go | 2 +- internal/updater/version.go | 2 +- internal/user/config_status.go | 2 +- internal/user/debug.go | 2 +- internal/user/errors.go | 2 +- internal/user/keys_test.go | 2 +- internal/user/migration.go | 2 +- internal/user/user.go | 2 +- internal/user/user_check.go | 2 +- internal/user/user_check_test.go | 2 +- internal/user/user_test.go | 2 +- internal/useragent/platform.go | 2 +- internal/useragent/platform_darwin.go | 2 +- internal/useragent/platform_default.go | 2 +- internal/useragent/platform_test.go | 2 +- internal/useragent/useragent.go | 2 +- internal/useragent/useragent_test.go | 2 +- internal/usertypes/addressmode.go | 2 +- internal/usertypes/keys.go | 2 +- internal/usertypes/types.go | 2 +- internal/usertypes/types_test.go | 2 +- internal/vault/certs.go | 2 +- internal/vault/certs_test.go | 2 +- internal/vault/cookies.go | 2 +- internal/vault/cookies_test.go | 2 +- internal/vault/helper.go | 2 +- internal/vault/migrate.go | 2 +- internal/vault/migrate_test.go | 2 +- internal/vault/migrate_v2.3.x.go | 2 +- internal/vault/migrate_v2.4.x.go | 2 +- internal/vault/password_archive.go | 2 +- internal/vault/settings.go | 2 +- internal/vault/settings_test.go | 2 +- internal/vault/token.go | 2 +- internal/vault/types_certs.go | 2 +- internal/vault/types_data.go | 2 +- internal/vault/types_file.go | 2 +- internal/vault/types_password_archive.go | 2 +- internal/vault/types_settings.go | 2 +- internal/vault/types_user.go | 2 +- internal/vault/user.go | 2 +- internal/vault/user_test.go | 2 +- internal/vault/vault.go | 2 +- internal/vault/vault_bench_test.go | 2 +- internal/vault/vault_debug.go | 2 +- internal/vault/vault_test.go | 2 +- internal/versioner/install.go | 2 +- internal/versioner/name_default.go | 2 +- internal/versioner/name_windows.go | 2 +- internal/versioner/remove.go | 2 +- internal/versioner/remove_darwin.go | 2 +- internal/versioner/remove_linux.go | 2 +- internal/versioner/remove_windows.go | 2 +- internal/versioner/util.go | 2 +- internal/versioner/version.go | 2 +- internal/versioner/version_test.go | 2 +- internal/versioner/versioner.go | 2 +- internal/versioner/versioner_remove_test.go | 2 +- internal/versioner/versioner_test.go | 2 +- pkg/algo/algo.go | 2 +- pkg/algo/encode.go | 2 +- pkg/algo/hash.go | 2 +- pkg/algo/sets.go | 2 +- pkg/algo/sets_test.go | 2 +- pkg/cpc/cpc.go | 2 +- pkg/cpc/cpc_test.go | 2 +- pkg/dialer/dial_client.go | 2 +- pkg/files/removal.go | 2 +- pkg/files/removal_test.go | 2 +- pkg/keychain/helper_darwin.go | 2 +- pkg/keychain/helper_dbus_linux.go | 2 +- pkg/keychain/helper_linux.go | 2 +- pkg/keychain/helper_windows.go | 2 +- pkg/keychain/keychain.go | 2 +- pkg/keychain/keychain_darwin.go | 2 +- pkg/keychain/keychain_default.go | 2 +- pkg/keychain/keychain_missing.go | 2 +- pkg/keychain/keychain_test.go | 2 +- pkg/keychain/test_helper.go | 2 +- pkg/message/build.go | 2 +- pkg/message/build_custom.go | 2 +- pkg/message/build_framework_test.go | 2 +- pkg/message/build_test.go | 2 +- pkg/message/decrypt.go | 2 +- pkg/message/decrypt_and_build.go | 2 +- pkg/message/header.go | 2 +- pkg/message/header_test.go | 2 +- pkg/message/message.go | 2 +- pkg/message/options.go | 2 +- pkg/message/parser.go | 2 +- pkg/message/parser/handler.go | 2 +- pkg/message/parser/parser.go | 2 +- pkg/message/parser/parser_test.go | 2 +- pkg/message/parser/part.go | 2 +- pkg/message/parser/part_test.go | 2 +- pkg/message/parser/trimmer.go | 2 +- pkg/message/parser/trimmer_test.go | 2 +- pkg/message/parser/visitor.go | 2 +- pkg/message/parser/walker.go | 2 +- pkg/message/parser/walker_test.go | 2 +- pkg/message/parser/writer.go | 2 +- pkg/message/parser/writer_test.go | 2 +- pkg/message/parser_test.go | 2 +- pkg/mime/encoding.go | 2 +- pkg/mime/encoding_test.go | 2 +- pkg/mime/mediaType.go | 2 +- pkg/mime/utf7Decoder.go | 2 +- pkg/mobileconfig/config.go | 2 +- pkg/mobileconfig/template.go | 2 +- pkg/ports/ports.go | 2 +- pkg/ports/ports_test.go | 2 +- pkg/restarter/restarter.go | 2 +- pkg/restarter/restarter_test.go | 2 +- pkg/restarter/start_default.go | 2 +- pkg/restarter/start_windows.go | 2 +- pkg/sum/sum.go | 2 +- pkg/sum/sum_test.go | 2 +- pkg/tar/tar.go | 2 +- tests/api_test.go | 2 +- tests/bdd_test.go | 2 +- tests/bridge_test.go | 2 +- tests/collector_test.go | 2 +- tests/config_status_test.go | 2 +- tests/contact_test.go | 2 +- tests/ctx_bridge_test.go | 2 +- tests/ctx_heartbeat_test.go | 2 +- tests/ctx_helper_test.go | 2 +- tests/ctx_imap_test.go | 2 +- tests/ctx_reporter_test.go | 2 +- tests/ctx_smtp_test.go | 2 +- tests/ctx_test.go | 2 +- tests/diff.go | 2 +- tests/diff_test.go | 2 +- tests/environment_test.go | 2 +- tests/fast.go | 2 +- tests/frontend_test.go | 2 +- tests/heartbeat_test.go | 2 +- tests/imap_test.go | 2 +- tests/init_test.go | 2 +- tests/main_test.go | 2 +- tests/smtp_test.go | 2 +- tests/steps_test.go | 2 +- tests/types_test.go | 2 +- tests/user_test.go | 2 +- utils/bridge_app_version.sh | 2 +- utils/changelog_linter.sh | 2 +- utils/coverage.sh | 2 +- utils/credits.sh | 2 +- utils/debug/debug_assemble.go | 2 +- utils/dependency_license.sh | 2 +- utils/dxtn/main.cpp | 2 +- utils/dxtn/main.h | 2 +- utils/export_icons.sh | 2 +- utils/get_revision.sh | 2 +- utils/govulncheck.sh | 2 +- utils/hasher/main.go | 2 +- utils/kb-suggester/kb-suggester.go | 2 +- utils/keyring.go | 2 +- utils/license_header.txt | 2 +- utils/missing_license.sh | 36 +++++++++++++++---- utils/port-blocker/port-blocker.go | 2 +- utils/rebranding.sh | 12 +++---- utils/release_notes.sh | 2 +- utils/remove_non_relative_links_darwin.sh | 2 +- utils/smtp-send/main.go | 2 +- utils/sync_bench.py | 2 +- utils/update_test_keys.sh | 2 +- utils/validate_bug_report_file.py | 2 +- utils/vault-editor/main.go | 2 +- utils/versioner/main.go | 2 +- 592 files changed, 625 insertions(+), 603 deletions(-) diff --git a/README.md b/README.md index 0fd5c853..e053bfa7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Proton Mail Bridge and Import Export app -Copyright (c) 2023 Proton AG +Copyright (c) 2024 Proton AG This repository holds the Proton Mail Bridge and the Proton Mail Import-Export applications. For a detailed build information see [BUILDS](./BUILDS.md). diff --git a/cmd/Desktop-Bridge/main.go b/cmd/Desktop-Bridge/main.go index 14889e7a..b7f697d7 100644 --- a/cmd/Desktop-Bridge/main.go +++ b/cmd/Desktop-Bridge/main.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/cmd/launcher/main.go b/cmd/launcher/main.go index 887cf3ba..fa379fb9 100644 --- a/cmd/launcher/main.go +++ b/cmd/launcher/main.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/cmd/launcher/main_test.go b/cmd/launcher/main_test.go index 42e80595..c055c82b 100644 --- a/cmd/launcher/main_test.go +++ b/cmd/launcher/main_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/app.go b/internal/app/app.go index 1d3cd246..8d3a3f9c 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/bridge.go b/internal/app/bridge.go index 421feba6..9e7afe0e 100644 --- a/internal/app/bridge.go +++ b/internal/app/bridge.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/frontend.go b/internal/app/frontend.go index 3bf570d2..50b25577 100644 --- a/internal/app/frontend.go +++ b/internal/app/frontend.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/migration.go b/internal/app/migration.go index b2ed8610..0f7b9f6b 100644 --- a/internal/app/migration.go +++ b/internal/app/migration.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/migration_test.go b/internal/app/migration_test.go index d6afb95a..7703e57b 100644 --- a/internal/app/migration_test.go +++ b/internal/app/migration_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/singleinstance.go b/internal/app/singleinstance.go index 3a11eda1..29610dd6 100644 --- a/internal/app/singleinstance.go +++ b/internal/app/singleinstance.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/app/vault.go b/internal/app/vault.go index aa93237b..4d98ad4b 100644 --- a/internal/app/vault.go +++ b/internal/app/vault.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/api.go b/internal/bridge/api.go index dd397992..c48a0759 100644 --- a/internal/bridge/api.go +++ b/internal/bridge/api.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/api_default.go b/internal/bridge/api_default.go index 78b882f2..8a2d51e6 100644 --- a/internal/bridge/api_default.go +++ b/internal/bridge/api_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/api_qa.go b/internal/bridge/api_qa.go index 049e0a49..20dd65c5 100644 --- a/internal/bridge/api_qa.go +++ b/internal/bridge/api_qa.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/bridge.go b/internal/bridge/bridge.go index 590ca02e..def83447 100644 --- a/internal/bridge/bridge.go +++ b/internal/bridge/bridge.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/bridge_test.go b/internal/bridge/bridge_test.go index bb20e464..8b3b956c 100644 --- a/internal/bridge/bridge_test.go +++ b/internal/bridge/bridge_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/bug_report.go b/internal/bridge/bug_report.go index 0a96cb91..e43c89be 100644 --- a/internal/bridge/bug_report.go +++ b/internal/bridge/bug_report.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/config_status.go b/internal/bridge/config_status.go index faf63f49..5b17bc85 100644 --- a/internal/bridge/config_status.go +++ b/internal/bridge/config_status.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/configure.go b/internal/bridge/configure.go index 98946b69..4d6c8f5a 100644 --- a/internal/bridge/configure.go +++ b/internal/bridge/configure.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/debug.go b/internal/bridge/debug.go index f2e9a115..e6d68cd1 100644 --- a/internal/bridge/debug.go +++ b/internal/bridge/debug.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/draft_test.go b/internal/bridge/draft_test.go index 85ccf3c3..dc609782 100644 --- a/internal/bridge/draft_test.go +++ b/internal/bridge/draft_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/errors.go b/internal/bridge/errors.go index ecb897f4..2691147a 100644 --- a/internal/bridge/errors.go +++ b/internal/bridge/errors.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/events.go b/internal/bridge/events.go index bfc2c4b3..eef2917e 100644 --- a/internal/bridge/events.go +++ b/internal/bridge/events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/heartbeat.go b/internal/bridge/heartbeat.go index 241bfd88..70cab80f 100644 --- a/internal/bridge/heartbeat.go +++ b/internal/bridge/heartbeat.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/identifier.go b/internal/bridge/identifier.go index f325cd18..3ba22b47 100644 --- a/internal/bridge/identifier.go +++ b/internal/bridge/identifier.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/imap.go b/internal/bridge/imap.go index 4dc07805..c0734190 100644 --- a/internal/bridge/imap.go +++ b/internal/bridge/imap.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/imapsmtp_telemetry.go b/internal/bridge/imapsmtp_telemetry.go index 0d597227..468417ba 100644 --- a/internal/bridge/imapsmtp_telemetry.go +++ b/internal/bridge/imapsmtp_telemetry.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/keychain.go b/internal/bridge/keychain.go index 94783f53..b8f8d659 100644 --- a/internal/bridge/keychain.go +++ b/internal/bridge/keychain.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/locations.go b/internal/bridge/locations.go index 8c78b612..9c55e667 100644 --- a/internal/bridge/locations.go +++ b/internal/bridge/locations.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/main_test.go b/internal/bridge/main_test.go index 7f9fd91b..c3b9df38 100644 --- a/internal/bridge/main_test.go +++ b/internal/bridge/main_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/mocks/matcher.go b/internal/bridge/mocks/matcher.go index 4a7aab8f..e97bfceb 100644 --- a/internal/bridge/mocks/matcher.go +++ b/internal/bridge/mocks/matcher.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/refresh_test.go b/internal/bridge/refresh_test.go index 61761db7..d411db3f 100644 --- a/internal/bridge/refresh_test.go +++ b/internal/bridge/refresh_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/send_test.go b/internal/bridge/send_test.go index b17be0af..fc1c4904 100644 --- a/internal/bridge/send_test.go +++ b/internal/bridge/send_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/sentry_test.go b/internal/bridge/sentry_test.go index 291493f8..54fa0d35 100644 --- a/internal/bridge/sentry_test.go +++ b/internal/bridge/sentry_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/server_manager_test.go b/internal/bridge/server_manager_test.go index 47f799e9..e597c2aa 100644 --- a/internal/bridge/server_manager_test.go +++ b/internal/bridge/server_manager_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/settings.go b/internal/bridge/settings.go index 47a2f49d..0ac22fcb 100644 --- a/internal/bridge/settings.go +++ b/internal/bridge/settings.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/settings_test.go b/internal/bridge/settings_test.go index 1655e80c..072ffd0e 100644 --- a/internal/bridge/settings_test.go +++ b/internal/bridge/settings_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/smtp.go b/internal/bridge/smtp.go index 7d9eeaf2..be97c403 100644 --- a/internal/bridge/smtp.go +++ b/internal/bridge/smtp.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/sync_test.go b/internal/bridge/sync_test.go index 6f0604bb..e91d5323 100644 --- a/internal/bridge/sync_test.go +++ b/internal/bridge/sync_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/sync_unix_test.go b/internal/bridge/sync_unix_test.go index 93e6b3c2..2d11ac50 100644 --- a/internal/bridge/sync_unix_test.go +++ b/internal/bridge/sync_unix_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/tls.go b/internal/bridge/tls.go index c5e50fce..bd9f9672 100644 --- a/internal/bridge/tls.go +++ b/internal/bridge/tls.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/types.go b/internal/bridge/types.go index 4ef68efa..ed232803 100644 --- a/internal/bridge/types.go +++ b/internal/bridge/types.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/updates.go b/internal/bridge/updates.go index 5e0f60e9..edd17a42 100644 --- a/internal/bridge/updates.go +++ b/internal/bridge/updates.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/user.go b/internal/bridge/user.go index 9fa60c60..9d4413ec 100644 --- a/internal/bridge/user.go +++ b/internal/bridge/user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/user_event_test.go b/internal/bridge/user_event_test.go index 48c559c2..95b413ba 100644 --- a/internal/bridge/user_event_test.go +++ b/internal/bridge/user_event_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/user_events.go b/internal/bridge/user_events.go index 0dda3c34..c0527f6e 100644 --- a/internal/bridge/user_events.go +++ b/internal/bridge/user_events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/bridge/user_test.go b/internal/bridge/user_test.go index 832609f3..8faba2eb 100644 --- a/internal/bridge/user_test.go +++ b/internal/bridge/user_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/cert_store_darwin.go b/internal/certs/cert_store_darwin.go index 4d89c344..4ca8d8e1 100644 --- a/internal/certs/cert_store_darwin.go +++ b/internal/certs/cert_store_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/cert_store_darwin_test.go b/internal/certs/cert_store_darwin_test.go index aa50e18d..f639ba36 100644 --- a/internal/certs/cert_store_darwin_test.go +++ b/internal/certs/cert_store_darwin_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/cert_store_linux.go b/internal/certs/cert_store_linux.go index 950be35a..0a612704 100644 --- a/internal/certs/cert_store_linux.go +++ b/internal/certs/cert_store_linux.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/cert_store_windows.go b/internal/certs/cert_store_windows.go index bf43f65c..d7d8ea54 100644 --- a/internal/certs/cert_store_windows.go +++ b/internal/certs/cert_store_windows.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/installer.go b/internal/certs/installer.go index 14709116..6cf86e76 100644 --- a/internal/certs/installer.go +++ b/internal/certs/installer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/tls.go b/internal/certs/tls.go index d393d6c9..544be52e 100644 --- a/internal/certs/tls.go +++ b/internal/certs/tls.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/certs/tls_test.go b/internal/certs/tls_test.go index 16316753..a4f869e2 100644 --- a/internal/certs/tls_test.go +++ b/internal/certs/tls_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/clientconfig/applemail.go b/internal/clientconfig/applemail.go index 45795a8c..eba6f0f7 100644 --- a/internal/clientconfig/applemail.go +++ b/internal/clientconfig/applemail.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/config_status.go b/internal/configstatus/config_status.go index 2746a893..e4b9067a 100644 --- a/internal/configstatus/config_status.go +++ b/internal/configstatus/config_status.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/config_status_test.go b/internal/configstatus/config_status_test.go index 8466c5f2..746b22f3 100644 --- a/internal/configstatus/config_status_test.go +++ b/internal/configstatus/config_status_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_abort.go b/internal/configstatus/configuration_abort.go index ba2e6b4c..d3cba23c 100644 --- a/internal/configstatus/configuration_abort.go +++ b/internal/configstatus/configuration_abort.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_abort_test.go b/internal/configstatus/configuration_abort_test.go index c902e0ae..688f68a1 100644 --- a/internal/configstatus/configuration_abort_test.go +++ b/internal/configstatus/configuration_abort_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_progress.go b/internal/configstatus/configuration_progress.go index 45ae4028..1e61fdd6 100644 --- a/internal/configstatus/configuration_progress.go +++ b/internal/configstatus/configuration_progress.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_progress_test.go b/internal/configstatus/configuration_progress_test.go index e34004c3..23658b35 100644 --- a/internal/configstatus/configuration_progress_test.go +++ b/internal/configstatus/configuration_progress_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_recovery.go b/internal/configstatus/configuration_recovery.go index d8087a87..f0907821 100644 --- a/internal/configstatus/configuration_recovery.go +++ b/internal/configstatus/configuration_recovery.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_recovery_test.go b/internal/configstatus/configuration_recovery_test.go index ab09ccb1..16266667 100644 --- a/internal/configstatus/configuration_recovery_test.go +++ b/internal/configstatus/configuration_recovery_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_success.go b/internal/configstatus/configuration_success.go index 4c5b1aac..86b3de34 100644 --- a/internal/configstatus/configuration_success.go +++ b/internal/configstatus/configuration_success.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/configuration_success_test.go b/internal/configstatus/configuration_success_test.go index 9d12ac58..332d8f45 100644 --- a/internal/configstatus/configuration_success_test.go +++ b/internal/configstatus/configuration_success_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/configstatus/types_config_status.go b/internal/configstatus/types_config_status.go index 0e9ea9f0..a5474574 100644 --- a/internal/configstatus/types_config_status.go +++ b/internal/configstatus/types_config_status.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/constants/constants.go b/internal/constants/constants.go index 35bf0cee..0b266b71 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/constants/host_default.go b/internal/constants/host_default.go index 864651c4..f3703760 100644 --- a/internal/constants/host_default.go +++ b/internal/constants/host_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/constants/host_qa.go b/internal/constants/host_qa.go index 5a8e2819..9a725a81 100644 --- a/internal/constants/host_qa.go +++ b/internal/constants/host_qa.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/constants/update_default.go b/internal/constants/update_default.go index eb176b82..909767dc 100644 --- a/internal/constants/update_default.go +++ b/internal/constants/update_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/constants/update_qa.go b/internal/constants/update_qa.go index 76385ddc..3824cf02 100644 --- a/internal/constants/update_qa.go +++ b/internal/constants/update_qa.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/constants/version_default.go b/internal/constants/version_default.go index 356a6538..c94418c4 100644 --- a/internal/constants/version_default.go +++ b/internal/constants/version_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/constants/version_qa.go b/internal/constants/version_qa.go index 614d5cb9..b67ba499 100644 --- a/internal/constants/version_qa.go +++ b/internal/constants/version_qa.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/constants/version_test.go b/internal/constants/version_test.go index cce7b81f..21e19a19 100644 --- a/internal/constants/version_test.go +++ b/internal/constants/version_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/cookies/jar.go b/internal/cookies/jar.go index 4e1f965a..32f9c849 100644 --- a/internal/cookies/jar.go +++ b/internal/cookies/jar.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/cookies/jar_test.go b/internal/cookies/jar_test.go index dcebbc76..78329980 100644 --- a/internal/cookies/jar_test.go +++ b/internal/cookies/jar_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/crash/actions.go b/internal/crash/actions.go index da8b2833..e5aa9106 100644 --- a/internal/crash/actions.go +++ b/internal/crash/actions.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/crash/handler.go b/internal/crash/handler.go index 1542797c..345be71a 100644 --- a/internal/crash/handler.go +++ b/internal/crash/handler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/crash/handler_test.go b/internal/crash/handler_test.go index a71f9884..09dfecd6 100644 --- a/internal/crash/handler_test.go +++ b/internal/crash/handler_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/dialer/dialer_basic.go b/internal/dialer/dialer_basic.go index d1698b84..2f35b185 100644 --- a/internal/dialer/dialer_basic.go +++ b/internal/dialer/dialer_basic.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning.go b/internal/dialer/dialer_pinning.go index d89e087d..aa8a0206 100644 --- a/internal/dialer/dialer_pinning.go +++ b/internal/dialer/dialer_pinning.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/dialer/dialer_pinning_checker.go b/internal/dialer/dialer_pinning_checker.go index 37b8568c..af2b1563 100644 --- a/internal/dialer/dialer_pinning_checker.go +++ b/internal/dialer/dialer_pinning_checker.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning_checker_default.go b/internal/dialer/dialer_pinning_checker_default.go index e34aacfc..9e56cc26 100644 --- a/internal/dialer/dialer_pinning_checker_default.go +++ b/internal/dialer/dialer_pinning_checker_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning_checker_qa.go b/internal/dialer/dialer_pinning_checker_qa.go index 1c671de8..bb80299c 100644 --- a/internal/dialer/dialer_pinning_checker_qa.go +++ b/internal/dialer/dialer_pinning_checker_qa.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning_report.go b/internal/dialer/dialer_pinning_report.go index 4ff7460f..e7edf6a2 100644 --- a/internal/dialer/dialer_pinning_report.go +++ b/internal/dialer/dialer_pinning_report.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning_reporter.go b/internal/dialer/dialer_pinning_reporter.go index 65a86bde..e017743d 100644 --- a/internal/dialer/dialer_pinning_reporter.go +++ b/internal/dialer/dialer_pinning_reporter.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning_reporter_test.go b/internal/dialer/dialer_pinning_reporter_test.go index d77f6e75..efab4f1c 100644 --- a/internal/dialer/dialer_pinning_reporter_test.go +++ b/internal/dialer/dialer_pinning_reporter_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_pinning_test.go b/internal/dialer/dialer_pinning_test.go index b9964a6f..0b3ff489 100644 --- a/internal/dialer/dialer_pinning_test.go +++ b/internal/dialer/dialer_pinning_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/dialer/dialer_proxy.go b/internal/dialer/dialer_proxy.go index 453c9d05..8087af1a 100644 --- a/internal/dialer/dialer_proxy.go +++ b/internal/dialer/dialer_proxy.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/dialer/dialer_proxy_provider.go b/internal/dialer/dialer_proxy_provider.go index 2fba057d..0048b47e 100644 --- a/internal/dialer/dialer_proxy_provider.go +++ b/internal/dialer/dialer_proxy_provider.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/dialer/dialer_proxy_provider_test.go b/internal/dialer/dialer_proxy_provider_test.go index 5c25c4bb..71359371 100644 --- a/internal/dialer/dialer_proxy_provider_test.go +++ b/internal/dialer/dialer_proxy_provider_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/dialer/dialer_proxy_test.go b/internal/dialer/dialer_proxy_test.go index 3fe72b12..b092b3f6 100644 --- a/internal/dialer/dialer_proxy_test.go +++ b/internal/dialer/dialer_proxy_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/dialer/dialer_test.go b/internal/dialer/dialer_test.go index 0e3dbd6e..32cc43d4 100644 --- a/internal/dialer/dialer_test.go +++ b/internal/dialer/dialer_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/errors.go b/internal/errors.go index 714fcfdd..d6266fcc 100644 --- a/internal/errors.go +++ b/internal/errors.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/address.go b/internal/events/address.go index 96695e26..7bde7845 100644 --- a/internal/events/address.go +++ b/internal/events/address.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/connection.go b/internal/events/connection.go index 7af8264c..990c28ac 100644 --- a/internal/events/connection.go +++ b/internal/events/connection.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/error.go b/internal/events/error.go index 1396a002..3ec882d5 100644 --- a/internal/events/error.go +++ b/internal/events/error.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/events.go b/internal/events/events.go index 12921e4f..911321e6 100644 --- a/internal/events/events.go +++ b/internal/events/events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/label.go b/internal/events/label.go index f679776d..33b1f3eb 100644 --- a/internal/events/label.go +++ b/internal/events/label.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/raise.go b/internal/events/raise.go index cfdbd69a..5a7e34e1 100644 --- a/internal/events/raise.go +++ b/internal/events/raise.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/serve.go b/internal/events/serve.go index edde975e..8515942e 100644 --- a/internal/events/serve.go +++ b/internal/events/serve.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/sync.go b/internal/events/sync.go index c200cf56..b7cbc92d 100644 --- a/internal/events/sync.go +++ b/internal/events/sync.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/update.go b/internal/events/update.go index f9aec2fb..7889f0c3 100644 --- a/internal/events/update.go +++ b/internal/events/update.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/events/user.go b/internal/events/user.go index eae864a6..be411584 100644 --- a/internal/events/user.go +++ b/internal/events/user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/files/files.go b/internal/files/files.go index 2d094305..bfce0153 100644 --- a/internal/files/files.go +++ b/internal/files/files.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/files/files_test.go b/internal/files/files_test.go index 8562fc2c..c52813e0 100644 --- a/internal/files/files_test.go +++ b/internal/files/files_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/focus/client.go b/internal/focus/client.go index bcac8dc2..3fe8e3a8 100644 --- a/internal/focus/client.go +++ b/internal/focus/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/focus/focus_test.go b/internal/focus/focus_test.go index 101ed389..61c16e75 100644 --- a/internal/focus/focus_test.go +++ b/internal/focus/focus_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/focus/proto/focus.go b/internal/focus/proto/focus.go index b80bc65b..97d8803c 100644 --- a/internal/focus/proto/focus.go +++ b/internal/focus/proto/focus.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/focus/service.go b/internal/focus/service.go index a75f79c3..50c760b2 100644 --- a/internal/focus/service.go +++ b/internal/focus/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/AppController.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/AppController.cpp index 3fc99e2d..7c953151 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/AppController.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/AppController.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/AppController.h b/internal/frontend/bridge-gui/bridge-gui-tester/AppController.h index b2e62353..bfdde823 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/AppController.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/AppController.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Cert.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/Cert.cpp index a7cb3e7a..0a3258d5 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Cert.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Cert.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Cert.h b/internal/frontend/bridge-gui/bridge-gui-tester/Cert.h index 31f8825c..ee7311b1 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Cert.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Cert.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.cpp index d8813a92..a962def0 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.h b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.h index ef7aecd2..19f9303a 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCMetaDataProcessor.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.cpp index 31939d90..b0393aaf 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.h b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.h index d1a04e16..f3db9cbe 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCQtProxy.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.cpp index 2f9530b9..0db5a0fb 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.h b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.h index 9092fca7..c4e111da 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCServerWorker.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp index 2aea2530..4c72200b 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h index 511e911b..98b3e447 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.cpp index bf197be4..017296c5 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.h b/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.h index 44ce322c..749721a8 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/MainWindow.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Pch.h b/internal/frontend/bridge-gui/bridge-gui-tester/Pch.h index 27e11220..9584afa9 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Pch.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Pch.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.cpp index dafb5d6a..f7f78abb 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.h b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.h index 9e69b071..f67ef9c0 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/EventsTab.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.cpp index 13d400ca..237bceda 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.h b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.h index d849e163..9becba11 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/KnowledgeBaseTab.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.cpp index 428cf242..9ef12b6e 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.h b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.h index bb4a143c..3316f404 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp index 2f098a10..458e398d 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h index d7a0e69c..977534b1 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/UsersTab.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp index fe51aaad..1c0b9982 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.h b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.h index 2d8d6f64..9797ecfe 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserDialog.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp index 9a39cf62..4a119cf7 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h index ab593e9d..51a2b120 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h +++ b/internal/frontend/bridge-gui/bridge-gui-tester/UserTable.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/main.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/main.cpp index 170adeb7..c50905df 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/main.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/main.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/AppController.cpp b/internal/frontend/bridge-gui/bridge-gui/AppController.cpp index 0f1a639b..b2bc6b4e 100644 --- a/internal/frontend/bridge-gui/bridge-gui/AppController.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/AppController.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/AppController.h b/internal/frontend/bridge-gui/bridge-gui/AppController.h index be9f9cfe..88c8fe34 100644 --- a/internal/frontend/bridge-gui/bridge-gui/AppController.h +++ b/internal/frontend/bridge-gui/bridge-gui/AppController.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/BridgeApp.cpp b/internal/frontend/bridge-gui/bridge-gui/BridgeApp.cpp index 9c49bb72..188c61a3 100644 --- a/internal/frontend/bridge-gui/bridge-gui/BridgeApp.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/BridgeApp.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/BridgeApp.h b/internal/frontend/bridge-gui/bridge-gui/BridgeApp.h index 0526ed8c..cf153a42 100644 --- a/internal/frontend/bridge-gui/bridge-gui/BridgeApp.h +++ b/internal/frontend/bridge-gui/bridge-gui/BridgeApp.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/BuildConfig.h.in b/internal/frontend/bridge-gui/bridge-gui/BuildConfig.h.in index be6335b4..b21ed7e4 100644 --- a/internal/frontend/bridge-gui/bridge-gui/BuildConfig.h.in +++ b/internal/frontend/bridge-gui/bridge-gui/BuildConfig.h.in @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/CommandLine.cpp b/internal/frontend/bridge-gui/bridge-gui/CommandLine.cpp index 1daf3a2b..040be37f 100644 --- a/internal/frontend/bridge-gui/bridge-gui/CommandLine.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/CommandLine.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/CommandLine.h b/internal/frontend/bridge-gui/bridge-gui/CommandLine.h index 9accfee8..4db97abc 100644 --- a/internal/frontend/bridge-gui/bridge-gui/CommandLine.h +++ b/internal/frontend/bridge-gui/bridge-gui/CommandLine.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.cpp b/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.cpp index ef341692..c3142ac2 100644 --- a/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.h b/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.h index 667f5b27..a78d16f5 100644 --- a/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.h +++ b/internal/frontend/bridge-gui/bridge-gui/EventStreamWorker.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/LogUtils.cpp b/internal/frontend/bridge-gui/bridge-gui/LogUtils.cpp index ceba82d8..77074a32 100644 --- a/internal/frontend/bridge-gui/bridge-gui/LogUtils.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/LogUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/LogUtils.h b/internal/frontend/bridge-gui/bridge-gui/LogUtils.h index b324301e..147ec8af 100644 --- a/internal/frontend/bridge-gui/bridge-gui/LogUtils.h +++ b/internal/frontend/bridge-gui/bridge-gui/LogUtils.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.cpp b/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.cpp index d0f4adaa..c518d89c 100644 --- a/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.h b/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.h index 370fe53d..a66c2cac 100644 --- a/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.h +++ b/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.mm b/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.mm index 0b5876cd..b6a54217 100644 --- a/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.mm +++ b/internal/frontend/bridge-gui/bridge-gui/MacOS/DockIcon.mm @@ -1,4 +1,4 @@ -// Copyright (c) 2022 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.h b/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.h index 1fc4708a..e4eaf0a0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.h +++ b/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.mm b/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.mm index 39f57329..4519fcd1 100644 --- a/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.mm +++ b/internal/frontend/bridge-gui/bridge-gui/MacOS/SecondInstance.mm @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/Pch.h b/internal/frontend/bridge-gui/bridge-gui/Pch.h index cb7bcb99..58b4d7ea 100644 --- a/internal/frontend/bridge-gui/bridge-gui/Pch.h +++ b/internal/frontend/bridge-gui/bridge-gui/Pch.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp index 38902bec..33ebad27 100644 --- a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h index 42a86108..7584b0dd 100644 --- a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h +++ b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/SentryUtils.cpp b/internal/frontend/bridge-gui/bridge-gui/SentryUtils.cpp index 685b1ffb..ee061cea 100644 --- a/internal/frontend/bridge-gui/bridge-gui/SentryUtils.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/SentryUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/SentryUtils.h b/internal/frontend/bridge-gui/bridge-gui/SentryUtils.h index 7e918235..e157b089 100644 --- a/internal/frontend/bridge-gui/bridge-gui/SentryUtils.h +++ b/internal/frontend/bridge-gui/bridge-gui/SentryUtils.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/Settings.cpp b/internal/frontend/bridge-gui/bridge-gui/Settings.cpp index 270ac1dd..cd021c88 100644 --- a/internal/frontend/bridge-gui/bridge-gui/Settings.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/Settings.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/Settings.h b/internal/frontend/bridge-gui/bridge-gui/Settings.h index 977fc6ba..b2b92304 100644 --- a/internal/frontend/bridge-gui/bridge-gui/Settings.h +++ b/internal/frontend/bridge-gui/bridge-gui/Settings.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/TrayIcon.cpp b/internal/frontend/bridge-gui/bridge-gui/TrayIcon.cpp index d204f72e..33174930 100644 --- a/internal/frontend/bridge-gui/bridge-gui/TrayIcon.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/TrayIcon.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/TrayIcon.h b/internal/frontend/bridge-gui/bridge-gui/TrayIcon.h index 058ca1c2..bc26ea83 100644 --- a/internal/frontend/bridge-gui/bridge-gui/TrayIcon.h +++ b/internal/frontend/bridge-gui/bridge-gui/TrayIcon.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/UserList.cpp b/internal/frontend/bridge-gui/bridge-gui/UserList.cpp index b8a9946b..bf2e3e00 100644 --- a/internal/frontend/bridge-gui/bridge-gui/UserList.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/UserList.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/UserList.h b/internal/frontend/bridge-gui/bridge-gui/UserList.h index 170b5c04..837c2611 100644 --- a/internal/frontend/bridge-gui/bridge-gui/UserList.h +++ b/internal/frontend/bridge-gui/bridge-gui/UserList.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/build.sh b/internal/frontend/bridge-gui/bridge-gui/build.sh index a2f5ad61..c299d5ce 100755 --- a/internal/frontend/bridge-gui/bridge-gui/build.sh +++ b/internal/frontend/bridge-gui/bridge-gui/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/internal/frontend/bridge-gui/bridge-gui/main.cpp b/internal/frontend/bridge-gui/bridge-gui/main.cpp index 4de4b027..f1789478 100644 --- a/internal/frontend/bridge-gui/bridge-gui/main.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/main.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/AccountDelegate.qml b/internal/frontend/bridge-gui/bridge-gui/qml/AccountDelegate.qml index 3b14bca6..18530899 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/AccountDelegate.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/AccountDelegate.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/AccountView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/AccountView.qml index d5469435..50dbe9b1 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/AccountView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/AccountView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Banner.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Banner.qml index dfc35c1f..f3affdc9 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Banner.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Banner.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Bridge.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Bridge.qml index 149b702d..1a1ea6e2 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Bridge.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Bridge.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugCategoryView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugCategoryView.qml index 1632c2cd..934ac57d 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugCategoryView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugCategoryView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugQuestionView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugQuestionView.qml index d36eddec..be8f5f24 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugQuestionView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugQuestionView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportFlow.qml b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportFlow.qml index 5bac66cb..7a0bc0e4 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportFlow.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportFlow.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportView.qml index 8edadd76..9b7b1934 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/BugReportView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/CategoryItem.qml b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/CategoryItem.qml index e268ca10..c2eaaea0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/CategoryItem.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/CategoryItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/QuestionItem.qml b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/QuestionItem.qml index 9889f11d..9cf37cc1 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/QuestionItem.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/BugReport/QuestionItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Configuration.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Configuration.qml index 5d63ef9e..b98b2816 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Configuration.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Configuration.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/ConfigurationItem.qml b/internal/frontend/bridge-gui/bridge-gui/qml/ConfigurationItem.qml index dc52cf20..83be34c2 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/ConfigurationItem.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/ConfigurationItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/ConnectionModeSettings.qml b/internal/frontend/bridge-gui/bridge-gui/qml/ConnectionModeSettings.qml index 40daf623..397810c0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/ConnectionModeSettings.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/ConnectionModeSettings.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/ContentWrapper.qml b/internal/frontend/bridge-gui/bridge-gui/qml/ContentWrapper.qml index 75f9f7c7..c62ad1a9 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/ContentWrapper.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/ContentWrapper.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/DebugWrapper.qml b/internal/frontend/bridge-gui/bridge-gui/qml/DebugWrapper.qml index eb8bd15c..a429791e 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/DebugWrapper.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/DebugWrapper.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/GeneralSettings.qml b/internal/frontend/bridge-gui/bridge-gui/qml/GeneralSettings.qml index c29bc896..81ee15a1 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/GeneralSettings.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/GeneralSettings.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/HelpView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/HelpView.qml index 66d0f0fc..ac2704f0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/HelpView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/HelpView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/KeychainSettings.qml b/internal/frontend/bridge-gui/bridge-gui/qml/KeychainSettings.qml index fec873cc..02569778 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/KeychainSettings.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/KeychainSettings.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/LocalCacheSettings.qml b/internal/frontend/bridge-gui/bridge-gui/qml/LocalCacheSettings.qml index a319fd4d..43bae8f3 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/LocalCacheSettings.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/LocalCacheSettings.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/MainWindow.qml b/internal/frontend/bridge-gui/bridge-gui/qml/MainWindow.qml index a65ecfba..079e7449 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/MainWindow.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/MainWindow.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/NoAccountView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/NoAccountView.qml index 53cef32b..6bab1629 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/NoAccountView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/NoAccountView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml index f7387bf4..ec89e0fd 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml index 0f81fd35..04f2983a 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml index fb41783e..d13d366d 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/NotificationFilter.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/NotificationFilter.qml index d74abc8c..b450421c 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/NotificationFilter.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/NotificationFilter.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml index 86676f1d..b36c5d68 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/PortSettings.qml b/internal/frontend/bridge-gui/bridge-gui/qml/PortSettings.qml index cd524ecf..2132ccfd 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/PortSettings.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/PortSettings.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Action.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Action.qml index 9f982d18..7750d837 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Action.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Action.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ApplicationWindow.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ApplicationWindow.qml index 788aaf89..f41ce0b3 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ApplicationWindow.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ApplicationWindow.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Button.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Button.qml index 82817c76..adaa0d9f 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Button.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Button.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/CheckBox.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/CheckBox.qml index 2dc7551d..89f68258 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/CheckBox.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/CheckBox.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ColorScheme.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ColorScheme.qml index b9f27354..35b5e009 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ColorScheme.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ColorScheme.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ComboBox.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ComboBox.qml index 0d904f86..5d0b031f 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ComboBox.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/ComboBox.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Dialog.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Dialog.qml index 368bcb30..f1ab61a0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Dialog.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Dialog.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/InfoTooltip.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/InfoTooltip.qml index d0d1c863..281e93e8 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/InfoTooltip.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/InfoTooltip.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Label.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Label.qml index da4de95a..209871e3 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Label.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Label.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/LinkLabel.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/LinkLabel.qml index 04a334db..30871f21 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/LinkLabel.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/LinkLabel.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Menu.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Menu.qml index 0655f1de..d8929392 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Menu.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Menu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/MenuItem.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/MenuItem.qml index 3d19cbf8..f7c57168 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/MenuItem.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/MenuItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Popup.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Popup.qml index b2be86c0..68c3af7c 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Popup.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Popup.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/RadioButton.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/RadioButton.qml index 833d409b..457c71a0 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/RadioButton.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/RadioButton.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Style.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Style.qml index 95c6d431..ef84cb4d 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Style.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Style.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Switch.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Switch.qml index 4d633b8d..816734c6 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Switch.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Switch.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextArea.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextArea.qml index d0551c57..161dee1a 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextArea.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextArea.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextField.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextField.qml index b9295f25..c3b3685d 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextField.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/TextField.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Toggle.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Toggle.qml index a9d3207b..0c431138 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Toggle.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Toggle.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SettingsItem.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SettingsItem.qml index ecfa7621..4028ca6f 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SettingsItem.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SettingsItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SettingsView.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SettingsView.qml index ddecc203..b81d5628 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SettingsView.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SettingsView.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigAppleMail.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigAppleMail.qml index b2487d7a..e17fb6af 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigAppleMail.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigAppleMail.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigEnd.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigEnd.qml index 7302fb6f..b5be8887 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigEnd.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigEnd.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigParameters.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigParameters.qml index b8a0e7f6..52e3fec2 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigParameters.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigParameters.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigSelector.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigSelector.qml index de062f35..2a309624 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigSelector.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientConfigSelector.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientListItem.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientListItem.qml index 1ffe6157..3e781d16 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientListItem.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/ClientListItem.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/HelpButton.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/HelpButton.qml index 59fb5eae..4f4d1a67 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/HelpButton.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/HelpButton.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml index 69dabef0..640e5622 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/LeftPane.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml index abd405bc..4d2045fd 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Onboarding.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Onboarding.qml index e3ea88ae..ab5aa1db 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Onboarding.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Onboarding.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml index ae384e0e..bde35906 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/SetupWizard.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/StepDescriptionBox.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/StepDescriptionBox.qml index 375a279f..e049b041 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/StepDescriptionBox.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/StepDescriptionBox.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SplashScreen.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SplashScreen.qml index 58321487..8a3665a1 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SplashScreen.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SplashScreen.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Status.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Status.qml index b64c8027..8df066bf 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Status.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Status.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // This file is part of Proton Mail Bridge. // Proton Mail Bridge is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by diff --git a/internal/frontend/bridge-gui/bridgepp/Pch.h b/internal/frontend/bridge-gui/bridgepp/Pch.h index 2399d76c..d6d3862f 100644 --- a/internal/frontend/bridge-gui/bridgepp/Pch.h +++ b/internal/frontend/bridge-gui/bridgepp/Pch.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestBridgeUtils.cpp b/internal/frontend/bridge-gui/bridgepp/Test/TestBridgeUtils.cpp index a990eb66..37e058dd 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestBridgeUtils.cpp +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestBridgeUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.cpp b/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.cpp index 466b271d..9b1706a2 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.cpp +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.h b/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.h index 95ffe198..a129ee6f 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.h +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestBugReportFlow.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestCLI.cpp b/internal/frontend/bridge-gui/bridgepp/Test/TestCLI.cpp index 5bd24c54..9c5266dc 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestCLI.cpp +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestCLI.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestException.cpp b/internal/frontend/bridge-gui/bridgepp/Test/TestException.cpp index 9c006f56..78d8b16a 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestException.cpp +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestException.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestSessionID.cpp b/internal/frontend/bridge-gui/bridgepp/Test/TestSessionID.cpp index d1b95ae6..c3dfbf81 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestSessionID.cpp +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestSessionID.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.cpp b/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.cpp index 6f6eb5bb..9914f2e0 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.cpp +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.h b/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.h index abfde90c..0ad0bbe5 100644 --- a/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.h +++ b/internal/frontend/bridge-gui/bridgepp/Test/TestWorker.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.cpp index 5529b828..5ad4bfb4 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.h index 7720deca..c5f503df 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/BridgeUtils.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.cpp index f4f59cfa..337115e5 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.h index c02a076c..5eb9b07f 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/BugReportFlow/BugReportFlow.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.cpp index c118c660..9c6a9daf 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.h index c05ccd8d..ecb45e66 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/CLI/CLIUtils.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.cpp index 54cf3d1d..6f19285b 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.h index 78b9c351..e1a878d6 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Exception/Exception.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.cpp index 794a76ca..dcc1ba2c 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.h index 2ab306df..7941af16 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/FocusGRPC/FocusGRPCClient.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp index a27167e9..de09a53b 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h index bb6e6d1e..4a034a32 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp index c1b68794..94bd21b4 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h index 18c0e699..7adf4665 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.cpp index 17414112..6eb9c097 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.h index 2366ee1f..b7a2ed8e 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCConfig.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.cpp index ee610c27..2ae6d67f 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.h index 2dc7a7a7..774e952e 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCErrors.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.cpp index f04cb63a..4482002f 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.h index e749df3b..92e00c30 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCUtils.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.cpp index 88a35ec2..a0dbd69c 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.h index 4ad9c98f..80beb06b 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/Log.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.cpp index 6920ec57..b1be2b6a 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.h index ab4f81d0..02abe4d8 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Log/LogUtils.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.cpp index 3408514c..0edf88b8 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.h index d1ebb4e3..c35d183f 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/ProcessMonitor.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.cpp index 9af45e65..cb708d9e 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.h index 7c223959..4c134a9b 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/SessionID/SessionID.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.cpp index ed4609e5..9c1fa3f0 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.h index b63e51d6..6a08115d 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/User/User.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.cpp index 8a5da3b4..3c7c06be 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.h index e4bdd47a..68f15f53 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Overseer.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Worker.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Worker.h index 55aacb07..c6205bb7 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Worker.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/Worker/Worker.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/account_utils.go b/internal/frontend/cli/account_utils.go index 283eb933..6d219c36 100644 --- a/internal/frontend/cli/account_utils.go +++ b/internal/frontend/cli/account_utils.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/accounts.go b/internal/frontend/cli/accounts.go index bd2a1fa8..b1e4c1f0 100644 --- a/internal/frontend/cli/accounts.go +++ b/internal/frontend/cli/accounts.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/debug.go b/internal/frontend/cli/debug.go index 24b1af3b..971ed580 100644 --- a/internal/frontend/cli/debug.go +++ b/internal/frontend/cli/debug.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/frontend.go b/internal/frontend/cli/frontend.go index a3ff74b7..96b28dca 100644 --- a/internal/frontend/cli/frontend.go +++ b/internal/frontend/cli/frontend.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/system.go b/internal/frontend/cli/system.go index be6d03e4..737ae1ec 100644 --- a/internal/frontend/cli/system.go +++ b/internal/frontend/cli/system.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/updates.go b/internal/frontend/cli/updates.go index 2952b56e..9584c525 100644 --- a/internal/frontend/cli/updates.go +++ b/internal/frontend/cli/updates.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/cli/utils.go b/internal/frontend/cli/utils.go index 4848aefa..9cb2b3cf 100644 --- a/internal/frontend/cli/utils.go +++ b/internal/frontend/cli/utils.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/grpc/event_factory.go b/internal/frontend/grpc/event_factory.go index 09fde1ef..05327181 100644 --- a/internal/frontend/grpc/event_factory.go +++ b/internal/frontend/grpc/event_factory.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/frontend/grpc/event_utils.go b/internal/frontend/grpc/event_utils.go index 65e93756..b85caef4 100644 --- a/internal/frontend/grpc/event_utils.go +++ b/internal/frontend/grpc/event_utils.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index f197d08c..9988d85e 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/frontend/grpc/service_cert.go b/internal/frontend/grpc/service_cert.go index 399f3dc7..c900d06a 100644 --- a/internal/frontend/grpc/service_cert.go +++ b/internal/frontend/grpc/service_cert.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/grpc/service_methods.go b/internal/frontend/grpc/service_methods.go index 47bbe8cf..0d62b356 100644 --- a/internal/frontend/grpc/service_methods.go +++ b/internal/frontend/grpc/service_methods.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/frontend/grpc/service_stream.go b/internal/frontend/grpc/service_stream.go index 50c4ac6a..990d5733 100644 --- a/internal/frontend/grpc/service_stream.go +++ b/internal/frontend/grpc/service_stream.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/frontend/grpc/service_telemetry.go b/internal/frontend/grpc/service_telemetry.go index d65848ce..c4bfa9d2 100644 --- a/internal/frontend/grpc/service_telemetry.go +++ b/internal/frontend/grpc/service_telemetry.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/grpc/service_user.go b/internal/frontend/grpc/service_user.go index 248acc4e..d09c2e85 100644 --- a/internal/frontend/grpc/service_user.go +++ b/internal/frontend/grpc/service_user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/grpc/types.go b/internal/frontend/grpc/types.go index 95c51959..865214d1 100644 --- a/internal/frontend/grpc/types.go +++ b/internal/frontend/grpc/types.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/frontend/grpc/utils.go b/internal/frontend/grpc/utils.go index 02a9ad8e..127a66a2 100644 --- a/internal/frontend/grpc/utils.go +++ b/internal/frontend/grpc/utils.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/theme/detect_darwin.go b/internal/frontend/theme/detect_darwin.go index 5b07b683..a3e75abb 100644 --- a/internal/frontend/theme/detect_darwin.go +++ b/internal/frontend/theme/detect_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/theme/detect_default.go b/internal/frontend/theme/detect_default.go index 645ff47d..2fbdaeee 100644 --- a/internal/frontend/theme/detect_default.go +++ b/internal/frontend/theme/detect_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/theme/detect_windows.go b/internal/frontend/theme/detect_windows.go index 850ddb30..af2ddb72 100644 --- a/internal/frontend/theme/detect_windows.go +++ b/internal/frontend/theme/detect_windows.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/theme/theme.go b/internal/frontend/theme/theme.go index 2b08db8a..ac6ed2c5 100644 --- a/internal/frontend/theme/theme.go +++ b/internal/frontend/theme/theme.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/frontend/theme/theme_test.go b/internal/frontend/theme/theme_test.go index 0bf2a316..719885c0 100644 --- a/internal/frontend/theme/theme_test.go +++ b/internal/frontend/theme/theme_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/identifier/identifier.go b/internal/identifier/identifier.go index 837aed58..71707add 100644 --- a/internal/identifier/identifier.go +++ b/internal/identifier/identifier.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/kb/suggester.go b/internal/kb/suggester.go index 0fa31dfb..687a152f 100644 --- a/internal/kb/suggester.go +++ b/internal/kb/suggester.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/kb/suggester_test.go b/internal/kb/suggester_test.go index 97debcd9..fb65b5f8 100644 --- a/internal/kb/suggester_test.go +++ b/internal/kb/suggester_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/legacy/credentials/credentials.go b/internal/legacy/credentials/credentials.go index 2b8e7e25..ddf98b51 100644 --- a/internal/legacy/credentials/credentials.go +++ b/internal/legacy/credentials/credentials.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/legacy/credentials/credentials_test.go b/internal/legacy/credentials/credentials_test.go index 8260562e..99843461 100644 --- a/internal/legacy/credentials/credentials_test.go +++ b/internal/legacy/credentials/credentials_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/legacy/credentials/store.go b/internal/legacy/credentials/store.go index 630f0ba5..a433d3e2 100644 --- a/internal/legacy/credentials/store.go +++ b/internal/legacy/credentials/store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/legacy/credentials/store_test.go b/internal/legacy/credentials/store_test.go index 75cf2d05..5d4ef902 100644 --- a/internal/legacy/credentials/store_test.go +++ b/internal/legacy/credentials/store_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/locations/locations.go b/internal/locations/locations.go index c22e5b6a..eeaa245d 100644 --- a/internal/locations/locations.go +++ b/internal/locations/locations.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/locations/locations_test.go b/internal/locations/locations_test.go index 5172acfd..44901614 100644 --- a/internal/locations/locations_test.go +++ b/internal/locations/locations_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/locations/provider.go b/internal/locations/provider.go index f0eca49a..42142631 100644 --- a/internal/locations/provider.go +++ b/internal/locations/provider.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/compression.go b/internal/logging/compression.go index 97b602e1..5b207996 100644 --- a/internal/logging/compression.go +++ b/internal/logging/compression.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/compression_test.go b/internal/logging/compression_test.go index 76507436..c26b7390 100644 --- a/internal/logging/compression_test.go +++ b/internal/logging/compression_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/crash.go b/internal/logging/crash.go index 7e1a0e5c..15f3ea3f 100644 --- a/internal/logging/crash.go +++ b/internal/logging/crash.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/crash_test.go b/internal/logging/crash_test.go index 401a6068..819ee57a 100644 --- a/internal/logging/crash_test.go +++ b/internal/logging/crash_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/imap_logger.go b/internal/logging/imap_logger.go index 396552b2..d906f0b6 100644 --- a/internal/logging/imap_logger.go +++ b/internal/logging/imap_logger.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/logging.go b/internal/logging/logging.go index f50a5fe1..2ba6f7ea 100644 --- a/internal/logging/logging.go +++ b/internal/logging/logging.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/logging_test.go b/internal/logging/logging_test.go index 1253070b..a3547861 100644 --- a/internal/logging/logging_test.go +++ b/internal/logging/logging_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/pruning.go b/internal/logging/pruning.go index f65e78e1..cd2d27db 100644 --- a/internal/logging/pruning.go +++ b/internal/logging/pruning.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/pruning_test.go b/internal/logging/pruning_test.go index 4910f09d..e8015e40 100644 --- a/internal/logging/pruning_test.go +++ b/internal/logging/pruning_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/rotator.go b/internal/logging/rotator.go index 0319be1f..202a0f9e 100644 --- a/internal/logging/rotator.go +++ b/internal/logging/rotator.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/rotator_test.go b/internal/logging/rotator_test.go index 626d2b28..4642c6ca 100644 --- a/internal/logging/rotator_test.go +++ b/internal/logging/rotator_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/sensitive_default.go b/internal/logging/sensitive_default.go index b16ae852..5e623113 100644 --- a/internal/logging/sensitive_default.go +++ b/internal/logging/sensitive_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/sensitive_sensitive.go b/internal/logging/sensitive_sensitive.go index 993fbbf0..8371b955 100644 --- a/internal/logging/sensitive_sensitive.go +++ b/internal/logging/sensitive_sensitive.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/session_id.go b/internal/logging/session_id.go index 21ab3f2d..ea78ad10 100644 --- a/internal/logging/session_id.go +++ b/internal/logging/session_id.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/session_id_test.go b/internal/logging/session_id_test.go index 6ed39169..120ca29e 100644 --- a/internal/logging/session_id_test.go +++ b/internal/logging/session_id_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/logging/smtp_logger.go b/internal/logging/smtp_logger.go index 3439fac9..86073689 100644 --- a/internal/logging/smtp_logger.go +++ b/internal/logging/smtp_logger.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/network/proton.go b/internal/network/proton.go index 29969472..3775b7c1 100644 --- a/internal/network/proton.go +++ b/internal/network/proton.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/safe/mutex.go b/internal/safe/mutex.go index 0863391f..eee89f7f 100644 --- a/internal/safe/mutex.go +++ b/internal/safe/mutex.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/sentry/hostarch_darwin.go b/internal/sentry/hostarch_darwin.go index f9e36766..bb7e5033 100644 --- a/internal/sentry/hostarch_darwin.go +++ b/internal/sentry/hostarch_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/sentry/hostarch_default.go b/internal/sentry/hostarch_default.go index 5eebd4c8..5648e986 100644 --- a/internal/sentry/hostarch_default.go +++ b/internal/sentry/hostarch_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/sentry/lang_default.go b/internal/sentry/lang_default.go index a5b61a9a..2420d83c 100644 --- a/internal/sentry/lang_default.go +++ b/internal/sentry/lang_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/sentry/reporter.go b/internal/sentry/reporter.go index 2b69b4ad..af5afaaf 100644 --- a/internal/sentry/reporter.go +++ b/internal/sentry/reporter.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/sentry/reporter_test.go b/internal/sentry/reporter_test.go index cbaf0661..f960a6ea 100644 --- a/internal/sentry/reporter_test.go +++ b/internal/sentry/reporter_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/service/config.go b/internal/service/config.go index 7392b1ba..31f9332a 100644 --- a/internal/service/config.go +++ b/internal/service/config.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/service/config_test.go b/internal/service/config_test.go index ecc3a4e4..748be4bd 100644 --- a/internal/service/config_test.go +++ b/internal/service/config_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/service/types.go b/internal/service/types.go index faa77624..898e6498 100644 --- a/internal/service/types.go +++ b/internal/service/types.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/internal/services/imapservice/api_client.go b/internal/services/imapservice/api_client.go index 45fd3cf2..834b5ffd 100644 --- a/internal/services/imapservice/api_client.go +++ b/internal/services/imapservice/api_client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/connector.go b/internal/services/imapservice/connector.go index fb3b9625..4c7c1e74 100644 --- a/internal/services/imapservice/connector.go +++ b/internal/services/imapservice/connector.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/connector_test.go b/internal/services/imapservice/connector_test.go index f79b885d..6cecd473 100644 --- a/internal/services/imapservice/connector_test.go +++ b/internal/services/imapservice/connector_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/helpers.go b/internal/services/imapservice/helpers.go index fddce51e..943d5142 100644 --- a/internal/services/imapservice/helpers.go +++ b/internal/services/imapservice/helpers.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/imap_updates.go b/internal/services/imapservice/imap_updates.go index 9f8b8299..9a94bdbd 100644 --- a/internal/services/imapservice/imap_updates.go +++ b/internal/services/imapservice/imap_updates.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/server_manager.go b/internal/services/imapservice/server_manager.go index e25f31b9..941651bb 100644 --- a/internal/services/imapservice/server_manager.go +++ b/internal/services/imapservice/server_manager.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/service.go b/internal/services/imapservice/service.go index e3a5ab7d..7be496e7 100644 --- a/internal/services/imapservice/service.go +++ b/internal/services/imapservice/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/service_address_events.go b/internal/services/imapservice/service_address_events.go index 44211920..898f16dc 100644 --- a/internal/services/imapservice/service_address_events.go +++ b/internal/services/imapservice/service_address_events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/service_label_events.go b/internal/services/imapservice/service_label_events.go index 9821c266..98e863ee 100644 --- a/internal/services/imapservice/service_label_events.go +++ b/internal/services/imapservice/service_label_events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/service_message_events.go b/internal/services/imapservice/service_message_events.go index 6a6cd0af..5438faed 100644 --- a/internal/services/imapservice/service_message_events.go +++ b/internal/services/imapservice/service_message_events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/service_sync_events.go b/internal/services/imapservice/service_sync_events.go index fa376f1f..9dbbe1da 100644 --- a/internal/services/imapservice/service_sync_events.go +++ b/internal/services/imapservice/service_sync_events.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/shared_cache.go b/internal/services/imapservice/shared_cache.go index 654af8c1..0a6b4511 100644 --- a/internal/services/imapservice/shared_cache.go +++ b/internal/services/imapservice/shared_cache.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/shared_identity.go b/internal/services/imapservice/shared_identity.go index 4117faf4..ecddf680 100644 --- a/internal/services/imapservice/shared_identity.go +++ b/internal/services/imapservice/shared_identity.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/shared_labels.go b/internal/services/imapservice/shared_labels.go index 99982a8a..2d84c7f0 100644 --- a/internal/services/imapservice/shared_labels.go +++ b/internal/services/imapservice/shared_labels.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_build.go b/internal/services/imapservice/sync_build.go index fe7348cb..80f1336f 100644 --- a/internal/services/imapservice/sync_build.go +++ b/internal/services/imapservice/sync_build.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_build_test.go b/internal/services/imapservice/sync_build_test.go index c6e077e0..82ef38ff 100644 --- a/internal/services/imapservice/sync_build_test.go +++ b/internal/services/imapservice/sync_build_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_message_builder.go b/internal/services/imapservice/sync_message_builder.go index a0a006e2..8399c678 100644 --- a/internal/services/imapservice/sync_message_builder.go +++ b/internal/services/imapservice/sync_message_builder.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_reporter.go b/internal/services/imapservice/sync_reporter.go index bc7684f1..8948a558 100644 --- a/internal/services/imapservice/sync_reporter.go +++ b/internal/services/imapservice/sync_reporter.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_state_provider.go b/internal/services/imapservice/sync_state_provider.go index 9b3723d2..7304b931 100644 --- a/internal/services/imapservice/sync_state_provider.go +++ b/internal/services/imapservice/sync_state_provider.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_state_provider_test.go b/internal/services/imapservice/sync_state_provider_test.go index e4dd93b7..d47411e5 100644 --- a/internal/services/imapservice/sync_state_provider_test.go +++ b/internal/services/imapservice/sync_state_provider_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapservice/sync_update_applier.go b/internal/services/imapservice/sync_update_applier.go index 4ba043b1..d0e248f1 100644 --- a/internal/services/imapservice/sync_update_applier.go +++ b/internal/services/imapservice/sync_update_applier.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapsmtpserver/imap.go b/internal/services/imapsmtpserver/imap.go index 63888b51..07d7e779 100644 --- a/internal/services/imapsmtpserver/imap.go +++ b/internal/services/imapsmtpserver/imap.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapsmtpserver/listener.go b/internal/services/imapsmtpserver/listener.go index dc64c3df..a10d5d58 100644 --- a/internal/services/imapsmtpserver/listener.go +++ b/internal/services/imapsmtpserver/listener.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapsmtpserver/service.go b/internal/services/imapsmtpserver/service.go index f2e22176..ce71ef7d 100644 --- a/internal/services/imapsmtpserver/service.go +++ b/internal/services/imapsmtpserver/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapsmtpserver/smtp.go b/internal/services/imapsmtpserver/smtp.go index 6e8bb1fa..20824386 100644 --- a/internal/services/imapsmtpserver/smtp.go +++ b/internal/services/imapsmtpserver/smtp.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/imapsmtpserver/telemetry.go b/internal/services/imapsmtpserver/telemetry.go index 62706904..e86dffcb 100644 --- a/internal/services/imapsmtpserver/telemetry.go +++ b/internal/services/imapsmtpserver/telemetry.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/orderedtasks/ordered_cancel.go b/internal/services/orderedtasks/ordered_cancel.go index 81121eea..0fdd2429 100644 --- a/internal/services/orderedtasks/ordered_cancel.go +++ b/internal/services/orderedtasks/ordered_cancel.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/sendrecorder/recorder.go b/internal/services/sendrecorder/recorder.go index 5b8df1b0..e26a2746 100644 --- a/internal/services/sendrecorder/recorder.go +++ b/internal/services/sendrecorder/recorder.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/sendrecorder/recorder_test.go b/internal/services/sendrecorder/recorder_test.go index 215a3bd5..782c359d 100644 --- a/internal/services/sendrecorder/recorder_test.go +++ b/internal/services/sendrecorder/recorder_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/accounts.go b/internal/services/smtp/accounts.go index d31f93f7..f98d1d01 100644 --- a/internal/services/smtp/accounts.go +++ b/internal/services/smtp/accounts.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/accounts_test.go b/internal/services/smtp/accounts_test.go index 0593331c..27f9c199 100644 --- a/internal/services/smtp/accounts_test.go +++ b/internal/services/smtp/accounts_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/errors.go b/internal/services/smtp/errors.go index a206b73e..b60b6fe4 100644 --- a/internal/services/smtp/errors.go +++ b/internal/services/smtp/errors.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/server_manager.go b/internal/services/smtp/server_manager.go index 8bdcc4cc..1efa3423 100644 --- a/internal/services/smtp/server_manager.go +++ b/internal/services/smtp/server_manager.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/service.go b/internal/services/smtp/service.go index 0be2f6c6..e52406b4 100644 --- a/internal/services/smtp/service.go +++ b/internal/services/smtp/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp.go b/internal/services/smtp/smtp.go index 9b0c1d65..4610e238 100644 --- a/internal/services/smtp/smtp.go +++ b/internal/services/smtp/smtp.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_backend.go b/internal/services/smtp/smtp_backend.go index 1db137f7..8af9b807 100644 --- a/internal/services/smtp/smtp_backend.go +++ b/internal/services/smtp/smtp_backend.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_debug.go b/internal/services/smtp/smtp_debug.go index b9ce856b..33155b7f 100644 --- a/internal/services/smtp/smtp_debug.go +++ b/internal/services/smtp/smtp_debug.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_default.go b/internal/services/smtp/smtp_default.go index be14bd91..9b73ddd4 100644 --- a/internal/services/smtp/smtp_default.go +++ b/internal/services/smtp/smtp_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_packages.go b/internal/services/smtp/smtp_packages.go index 068e29e9..7fe34560 100644 --- a/internal/services/smtp/smtp_packages.go +++ b/internal/services/smtp/smtp_packages.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_packages_test.go b/internal/services/smtp/smtp_packages_test.go index 4932fa9b..c0c02a3c 100644 --- a/internal/services/smtp/smtp_packages_test.go +++ b/internal/services/smtp/smtp_packages_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_prefs.go b/internal/services/smtp/smtp_prefs.go index 4466e493..cd0ba8f7 100644 --- a/internal/services/smtp/smtp_prefs.go +++ b/internal/services/smtp/smtp_prefs.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/smtp/smtp_prefs_test.go b/internal/services/smtp/smtp_prefs_test.go index 1fdb6955..50271c74 100644 --- a/internal/services/smtp/smtp_prefs_test.go +++ b/internal/services/smtp/smtp_prefs_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/api_client.go b/internal/services/syncservice/api_client.go index b6c0e867..b7b177cc 100644 --- a/internal/services/syncservice/api_client.go +++ b/internal/services/syncservice/api_client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/download_cache.go b/internal/services/syncservice/download_cache.go index b801634c..da838530 100644 --- a/internal/services/syncservice/download_cache.go +++ b/internal/services/syncservice/download_cache.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/handler.go b/internal/services/syncservice/handler.go index f5e7d22f..50dd31de 100644 --- a/internal/services/syncservice/handler.go +++ b/internal/services/syncservice/handler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/handler_test.go b/internal/services/syncservice/handler_test.go index 2cf71c9a..038df12a 100644 --- a/internal/services/syncservice/handler_test.go +++ b/internal/services/syncservice/handler_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/interfaces.go b/internal/services/syncservice/interfaces.go index 9a8c236c..e2b63dae 100644 --- a/internal/services/syncservice/interfaces.go +++ b/internal/services/syncservice/interfaces.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/job.go b/internal/services/syncservice/job.go index 6615dd21..a87a42c8 100644 --- a/internal/services/syncservice/job.go +++ b/internal/services/syncservice/job.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/job_test.go b/internal/services/syncservice/job_test.go index d39b27e3..2b918e26 100644 --- a/internal/services/syncservice/job_test.go +++ b/internal/services/syncservice/job_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/limits.go b/internal/services/syncservice/limits.go index 51b0192c..17fad931 100644 --- a/internal/services/syncservice/limits.go +++ b/internal/services/syncservice/limits.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/service.go b/internal/services/syncservice/service.go index 158c8d7a..cbc16d30 100644 --- a/internal/services/syncservice/service.go +++ b/internal/services/syncservice/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_apply.go b/internal/services/syncservice/stage_apply.go index 85fe3efd..f70efede 100644 --- a/internal/services/syncservice/stage_apply.go +++ b/internal/services/syncservice/stage_apply.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_apply_test.go b/internal/services/syncservice/stage_apply_test.go index 10afdf22..376dd9e0 100644 --- a/internal/services/syncservice/stage_apply_test.go +++ b/internal/services/syncservice/stage_apply_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_build.go b/internal/services/syncservice/stage_build.go index b2a6a6d1..16cd4e97 100644 --- a/internal/services/syncservice/stage_build.go +++ b/internal/services/syncservice/stage_build.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_build_test.go b/internal/services/syncservice/stage_build_test.go index ce06724c..6b51f949 100644 --- a/internal/services/syncservice/stage_build_test.go +++ b/internal/services/syncservice/stage_build_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_download.go b/internal/services/syncservice/stage_download.go index d26e5266..e8914e1b 100644 --- a/internal/services/syncservice/stage_download.go +++ b/internal/services/syncservice/stage_download.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_download_test.go b/internal/services/syncservice/stage_download_test.go index 2cd08bc8..27fda594 100644 --- a/internal/services/syncservice/stage_download_test.go +++ b/internal/services/syncservice/stage_download_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_metadata.go b/internal/services/syncservice/stage_metadata.go index 0525af19..1cd6a205 100644 --- a/internal/services/syncservice/stage_metadata.go +++ b/internal/services/syncservice/stage_metadata.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_metadata_test.go b/internal/services/syncservice/stage_metadata_test.go index b7643396..d38d1bea 100644 --- a/internal/services/syncservice/stage_metadata_test.go +++ b/internal/services/syncservice/stage_metadata_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/stage_output.go b/internal/services/syncservice/stage_output.go index 4e01bd11..e7d03120 100644 --- a/internal/services/syncservice/stage_output.go +++ b/internal/services/syncservice/stage_output.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/syncservice/utils.go b/internal/services/syncservice/utils.go index 54b31485..9e85057f 100644 --- a/internal/services/syncservice/utils.go +++ b/internal/services/syncservice/utils.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/telemetry/service.go b/internal/services/telemetry/service.go index 6969c24d..60170043 100644 --- a/internal/services/telemetry/service.go +++ b/internal/services/telemetry/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/telemetry/service_test.go b/internal/services/telemetry/service_test.go index f296096b..2730aa92 100644 --- a/internal/services/telemetry/service_test.go +++ b/internal/services/telemetry/service_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/event_controller.go b/internal/services/userevents/event_controller.go index b7fc01f2..3c18345c 100644 --- a/internal/services/userevents/event_controller.go +++ b/internal/services/userevents/event_controller.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/event_poll_waiter.go b/internal/services/userevents/event_poll_waiter.go index f63d4331..b32e9722 100644 --- a/internal/services/userevents/event_poll_waiter.go +++ b/internal/services/userevents/event_poll_waiter.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/event_source.go b/internal/services/userevents/event_source.go index 098c7605..c846d27c 100644 --- a/internal/services/userevents/event_source.go +++ b/internal/services/userevents/event_source.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/eventid_store.go b/internal/services/userevents/eventid_store.go index 387ef736..906a20f0 100644 --- a/internal/services/userevents/eventid_store.go +++ b/internal/services/userevents/eventid_store.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/service.go b/internal/services/userevents/service.go index bd81f7d0..8511e15e 100644 --- a/internal/services/userevents/service.go +++ b/internal/services/userevents/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/service_handle_event_error_test.go b/internal/services/userevents/service_handle_event_error_test.go index 209f48ad..ddb8222d 100644 --- a/internal/services/userevents/service_handle_event_error_test.go +++ b/internal/services/userevents/service_handle_event_error_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/service_handle_event_test.go b/internal/services/userevents/service_handle_event_test.go index 35b2be68..8eef3907 100644 --- a/internal/services/userevents/service_handle_event_test.go +++ b/internal/services/userevents/service_handle_event_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/service_test.go b/internal/services/userevents/service_test.go index e7a2cbcf..078ab23e 100644 --- a/internal/services/userevents/service_test.go +++ b/internal/services/userevents/service_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/subscribable.go b/internal/services/userevents/subscribable.go index aecf8265..6db12162 100644 --- a/internal/services/userevents/subscribable.go +++ b/internal/services/userevents/subscribable.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/subscriber.go b/internal/services/userevents/subscriber.go index 3e66573d..44d489be 100644 --- a/internal/services/userevents/subscriber.go +++ b/internal/services/userevents/subscriber.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/subscriber_test.go b/internal/services/userevents/subscriber_test.go index 97b4be1e..841c1319 100644 --- a/internal/services/userevents/subscriber_test.go +++ b/internal/services/userevents/subscriber_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/userevents/subscription.go b/internal/services/userevents/subscription.go index 606510f9..8fc478e9 100644 --- a/internal/services/userevents/subscription.go +++ b/internal/services/userevents/subscription.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/useridentity/auth.go b/internal/services/useridentity/auth.go index 52b0e0aa..e43d2029 100644 --- a/internal/services/useridentity/auth.go +++ b/internal/services/useridentity/auth.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/useridentity/service.go b/internal/services/useridentity/service.go index 18be3fd4..e81a6c94 100644 --- a/internal/services/useridentity/service.go +++ b/internal/services/useridentity/service.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/useridentity/service_test.go b/internal/services/useridentity/service_test.go index 62f31518..c2b43df3 100644 --- a/internal/services/useridentity/service_test.go +++ b/internal/services/useridentity/service_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/useridentity/state.go b/internal/services/useridentity/state.go index 6c024e8a..4cd6058e 100644 --- a/internal/services/useridentity/state.go +++ b/internal/services/useridentity/state.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/services/useridentity/telemetry.go b/internal/services/useridentity/telemetry.go index 0400e1f2..06f1fcc8 100644 --- a/internal/services/useridentity/telemetry.go +++ b/internal/services/useridentity/telemetry.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/telemetry/heartbeat.go b/internal/telemetry/heartbeat.go index e7d52acb..0c9649c1 100644 --- a/internal/telemetry/heartbeat.go +++ b/internal/telemetry/heartbeat.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/telemetry/heartbeat_test.go b/internal/telemetry/heartbeat_test.go index 43f2cb33..b2a47aa3 100644 --- a/internal/telemetry/heartbeat_test.go +++ b/internal/telemetry/heartbeat_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/telemetry/types_heartbeat.go b/internal/telemetry/types_heartbeat.go index cad1e78c..3df472c6 100644 --- a/internal/telemetry/types_heartbeat.go +++ b/internal/telemetry/types_heartbeat.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/try/try.go b/internal/try/try.go index 7cdccc48..0def4d28 100644 --- a/internal/try/try.go +++ b/internal/try/try.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/try/try_test.go b/internal/try/try_test.go index 0c2de931..d0430f3a 100644 --- a/internal/try/try_test.go +++ b/internal/try/try_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/channel.go b/internal/updater/channel.go index 93fe0cbb..3dc49275 100644 --- a/internal/updater/channel.go +++ b/internal/updater/channel.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/host_default.go b/internal/updater/host_default.go index 38081640..7de62c5b 100644 --- a/internal/updater/host_default.go +++ b/internal/updater/host_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/host_qa.go b/internal/updater/host_qa.go index 1d63d5f0..22b8943e 100644 --- a/internal/updater/host_qa.go +++ b/internal/updater/host_qa.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/install_darwin.go b/internal/updater/install_darwin.go index c55420ca..812dcc8e 100644 --- a/internal/updater/install_darwin.go +++ b/internal/updater/install_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/install_default.go b/internal/updater/install_default.go index 45162ab0..80dddaa8 100644 --- a/internal/updater/install_default.go +++ b/internal/updater/install_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/key_default.go b/internal/updater/key_default.go index 81baef8a..9ef2d197 100644 --- a/internal/updater/key_default.go +++ b/internal/updater/key_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/keyring.go b/internal/updater/keyring.go index 30740b1e..c8392c5e 100644 --- a/internal/updater/keyring.go +++ b/internal/updater/keyring.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/sync.go b/internal/updater/sync.go index a35ad971..8ca613ae 100644 --- a/internal/updater/sync.go +++ b/internal/updater/sync.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/sync_test.go b/internal/updater/sync_test.go index 8ecb7699..d7781545 100644 --- a/internal/updater/sync_test.go +++ b/internal/updater/sync_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/updater.go b/internal/updater/updater.go index 10f7cf66..521ee8e4 100644 --- a/internal/updater/updater.go +++ b/internal/updater/updater.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/updater/version.go b/internal/updater/version.go index 9d688d6b..570705d3 100644 --- a/internal/updater/version.go +++ b/internal/updater/version.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/config_status.go b/internal/user/config_status.go index f40e4d08..b5b7164c 100644 --- a/internal/user/config_status.go +++ b/internal/user/config_status.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/debug.go b/internal/user/debug.go index 0b298c0e..1fd5abe6 100644 --- a/internal/user/debug.go +++ b/internal/user/debug.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/errors.go b/internal/user/errors.go index 9435388b..927d1f90 100644 --- a/internal/user/errors.go +++ b/internal/user/errors.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/keys_test.go b/internal/user/keys_test.go index 2867eee2..376799b6 100644 --- a/internal/user/keys_test.go +++ b/internal/user/keys_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/migration.go b/internal/user/migration.go index e548252c..cfbe5bd5 100644 --- a/internal/user/migration.go +++ b/internal/user/migration.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/user.go b/internal/user/user.go index 3566877c..171d6dd3 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/user_check.go b/internal/user/user_check.go index c5b8d9fe..dd308c6b 100644 --- a/internal/user/user_check.go +++ b/internal/user/user_check.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/user_check_test.go b/internal/user/user_check_test.go index da22b357..51f8e3a6 100644 --- a/internal/user/user_check_test.go +++ b/internal/user/user_check_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/user/user_test.go b/internal/user/user_test.go index c3fe490f..1b27ea72 100644 --- a/internal/user/user_test.go +++ b/internal/user/user_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/useragent/platform.go b/internal/useragent/platform.go index 09f3a2aa..acdc6665 100644 --- a/internal/useragent/platform.go +++ b/internal/useragent/platform.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/useragent/platform_darwin.go b/internal/useragent/platform_darwin.go index 8ea76453..88250036 100644 --- a/internal/useragent/platform_darwin.go +++ b/internal/useragent/platform_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/useragent/platform_default.go b/internal/useragent/platform_default.go index 8d222542..7be5c9f8 100644 --- a/internal/useragent/platform_default.go +++ b/internal/useragent/platform_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/useragent/platform_test.go b/internal/useragent/platform_test.go index 1be5b934..ca347a12 100644 --- a/internal/useragent/platform_test.go +++ b/internal/useragent/platform_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/useragent/useragent.go b/internal/useragent/useragent.go index 244ea66a..23d21074 100644 --- a/internal/useragent/useragent.go +++ b/internal/useragent/useragent.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/useragent/useragent_test.go b/internal/useragent/useragent_test.go index c3043119..cb915a33 100644 --- a/internal/useragent/useragent_test.go +++ b/internal/useragent/useragent_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/usertypes/addressmode.go b/internal/usertypes/addressmode.go index 9c969f41..bbfbda62 100644 --- a/internal/usertypes/addressmode.go +++ b/internal/usertypes/addressmode.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/usertypes/keys.go b/internal/usertypes/keys.go index d2ea1b87..4e89915d 100644 --- a/internal/usertypes/keys.go +++ b/internal/usertypes/keys.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/usertypes/types.go b/internal/usertypes/types.go index b30df75b..6a52456d 100644 --- a/internal/usertypes/types.go +++ b/internal/usertypes/types.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/usertypes/types_test.go b/internal/usertypes/types_test.go index 2c974898..9e0fc90c 100644 --- a/internal/usertypes/types_test.go +++ b/internal/usertypes/types_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/certs.go b/internal/vault/certs.go index 1434eef6..7bbbd104 100644 --- a/internal/vault/certs.go +++ b/internal/vault/certs.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/certs_test.go b/internal/vault/certs_test.go index 8f5b6187..8dfd1877 100644 --- a/internal/vault/certs_test.go +++ b/internal/vault/certs_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/cookies.go b/internal/vault/cookies.go index 96ccda66..fc8b5f59 100644 --- a/internal/vault/cookies.go +++ b/internal/vault/cookies.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/cookies_test.go b/internal/vault/cookies_test.go index 41b6552c..607c0d69 100644 --- a/internal/vault/cookies_test.go +++ b/internal/vault/cookies_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/helper.go b/internal/vault/helper.go index dfc64878..a784ec2e 100644 --- a/internal/vault/helper.go +++ b/internal/vault/helper.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/migrate.go b/internal/vault/migrate.go index 4cab2c96..8e89f272 100644 --- a/internal/vault/migrate.go +++ b/internal/vault/migrate.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/migrate_test.go b/internal/vault/migrate_test.go index 2cd8fbe9..6f872c49 100644 --- a/internal/vault/migrate_test.go +++ b/internal/vault/migrate_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/migrate_v2.3.x.go b/internal/vault/migrate_v2.3.x.go index d6c90570..36b36e42 100644 --- a/internal/vault/migrate_v2.3.x.go +++ b/internal/vault/migrate_v2.3.x.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/migrate_v2.4.x.go b/internal/vault/migrate_v2.4.x.go index 0ef408b5..d79c2f10 100644 --- a/internal/vault/migrate_v2.4.x.go +++ b/internal/vault/migrate_v2.4.x.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/password_archive.go b/internal/vault/password_archive.go index cf471adb..ad0e5e4f 100644 --- a/internal/vault/password_archive.go +++ b/internal/vault/password_archive.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/settings.go b/internal/vault/settings.go index f566fe10..25f47c0b 100644 --- a/internal/vault/settings.go +++ b/internal/vault/settings.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/settings_test.go b/internal/vault/settings_test.go index 6a319987..2cac28b9 100644 --- a/internal/vault/settings_test.go +++ b/internal/vault/settings_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/token.go b/internal/vault/token.go index 3438669e..e488f181 100644 --- a/internal/vault/token.go +++ b/internal/vault/token.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/types_certs.go b/internal/vault/types_certs.go index 190cb975..3957f69b 100644 --- a/internal/vault/types_certs.go +++ b/internal/vault/types_certs.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/types_data.go b/internal/vault/types_data.go index ec8a08d8..2f34ba9f 100644 --- a/internal/vault/types_data.go +++ b/internal/vault/types_data.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/types_file.go b/internal/vault/types_file.go index bd8febb7..0a0cb43c 100644 --- a/internal/vault/types_file.go +++ b/internal/vault/types_file.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/types_password_archive.go b/internal/vault/types_password_archive.go index 715727f4..bcd8d78a 100644 --- a/internal/vault/types_password_archive.go +++ b/internal/vault/types_password_archive.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/types_settings.go b/internal/vault/types_settings.go index 5582b2e3..c8ee7642 100644 --- a/internal/vault/types_settings.go +++ b/internal/vault/types_settings.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/types_user.go b/internal/vault/types_user.go index 9da47835..e2615829 100644 --- a/internal/vault/types_user.go +++ b/internal/vault/types_user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/user.go b/internal/vault/user.go index 4839a560..2f717a6f 100644 --- a/internal/vault/user.go +++ b/internal/vault/user.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/user_test.go b/internal/vault/user_test.go index ff0fd887..95178e34 100644 --- a/internal/vault/user_test.go +++ b/internal/vault/user_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/vault.go b/internal/vault/vault.go index 55bbd2ca..a5d0bebd 100644 --- a/internal/vault/vault.go +++ b/internal/vault/vault.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/vault_bench_test.go b/internal/vault/vault_bench_test.go index 6bde9633..eef9de96 100644 --- a/internal/vault/vault_bench_test.go +++ b/internal/vault/vault_bench_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/vault_debug.go b/internal/vault/vault_debug.go index aef5f5cf..2f3b3d08 100644 --- a/internal/vault/vault_debug.go +++ b/internal/vault/vault_debug.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/vault/vault_test.go b/internal/vault/vault_test.go index cba4e6ea..b84559b4 100644 --- a/internal/vault/vault_test.go +++ b/internal/vault/vault_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/install.go b/internal/versioner/install.go index 65d28657..fd0e1bf7 100644 --- a/internal/versioner/install.go +++ b/internal/versioner/install.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/name_default.go b/internal/versioner/name_default.go index fe8051f9..8c460e04 100644 --- a/internal/versioner/name_default.go +++ b/internal/versioner/name_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/name_windows.go b/internal/versioner/name_windows.go index 28276dd2..1fbc462b 100644 --- a/internal/versioner/name_windows.go +++ b/internal/versioner/name_windows.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/remove.go b/internal/versioner/remove.go index 01e540d1..e31f40b0 100644 --- a/internal/versioner/remove.go +++ b/internal/versioner/remove.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/remove_darwin.go b/internal/versioner/remove_darwin.go index 6bcc20e6..1d3111fb 100644 --- a/internal/versioner/remove_darwin.go +++ b/internal/versioner/remove_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/remove_linux.go b/internal/versioner/remove_linux.go index b5f94e54..a81ffb1c 100644 --- a/internal/versioner/remove_linux.go +++ b/internal/versioner/remove_linux.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/remove_windows.go b/internal/versioner/remove_windows.go index 38182966..eeb76754 100644 --- a/internal/versioner/remove_windows.go +++ b/internal/versioner/remove_windows.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/util.go b/internal/versioner/util.go index 1145f904..ed9bbd73 100644 --- a/internal/versioner/util.go +++ b/internal/versioner/util.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/version.go b/internal/versioner/version.go index 9f206e84..bfd3b149 100644 --- a/internal/versioner/version.go +++ b/internal/versioner/version.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/version_test.go b/internal/versioner/version_test.go index 710c3f09..cf839852 100644 --- a/internal/versioner/version_test.go +++ b/internal/versioner/version_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/versioner.go b/internal/versioner/versioner.go index 58804ed5..9369a27d 100644 --- a/internal/versioner/versioner.go +++ b/internal/versioner/versioner.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/versioner_remove_test.go b/internal/versioner/versioner_remove_test.go index 69a23851..69082545 100644 --- a/internal/versioner/versioner_remove_test.go +++ b/internal/versioner/versioner_remove_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/internal/versioner/versioner_test.go b/internal/versioner/versioner_test.go index f9c6a3fa..f5ae301e 100644 --- a/internal/versioner/versioner_test.go +++ b/internal/versioner/versioner_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/algo/algo.go b/pkg/algo/algo.go index 7229aec2..561c458f 100644 --- a/pkg/algo/algo.go +++ b/pkg/algo/algo.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/algo/encode.go b/pkg/algo/encode.go index 271ca991..f8403738 100644 --- a/pkg/algo/encode.go +++ b/pkg/algo/encode.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/algo/hash.go b/pkg/algo/hash.go index 172aa7b9..bbeb500b 100644 --- a/pkg/algo/hash.go +++ b/pkg/algo/hash.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/algo/sets.go b/pkg/algo/sets.go index 9c1d8631..7823209b 100644 --- a/pkg/algo/sets.go +++ b/pkg/algo/sets.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/algo/sets_test.go b/pkg/algo/sets_test.go index b012ac46..2890746e 100644 --- a/pkg/algo/sets_test.go +++ b/pkg/algo/sets_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/cpc/cpc.go b/pkg/cpc/cpc.go index 231f8b9a..450917be 100644 --- a/pkg/cpc/cpc.go +++ b/pkg/cpc/cpc.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/cpc/cpc_test.go b/pkg/cpc/cpc_test.go index 102970e5..a418afd4 100644 --- a/pkg/cpc/cpc_test.go +++ b/pkg/cpc/cpc_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/dialer/dial_client.go b/pkg/dialer/dial_client.go index ee4e1e78..fdf81a10 100644 --- a/pkg/dialer/dial_client.go +++ b/pkg/dialer/dial_client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/files/removal.go b/pkg/files/removal.go index 594f3010..8e5f2ab0 100644 --- a/pkg/files/removal.go +++ b/pkg/files/removal.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/files/removal_test.go b/pkg/files/removal_test.go index f964eba6..8e87d7c5 100644 --- a/pkg/files/removal_test.go +++ b/pkg/files/removal_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/helper_darwin.go b/pkg/keychain/helper_darwin.go index 1cba6de5..2ae834a7 100644 --- a/pkg/keychain/helper_darwin.go +++ b/pkg/keychain/helper_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/helper_dbus_linux.go b/pkg/keychain/helper_dbus_linux.go index bdd1f53e..cf85c91a 100644 --- a/pkg/keychain/helper_dbus_linux.go +++ b/pkg/keychain/helper_dbus_linux.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/helper_linux.go b/pkg/keychain/helper_linux.go index ef21ec1d..ce531faa 100644 --- a/pkg/keychain/helper_linux.go +++ b/pkg/keychain/helper_linux.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/helper_windows.go b/pkg/keychain/helper_windows.go index e2658c86..6ac141ff 100644 --- a/pkg/keychain/helper_windows.go +++ b/pkg/keychain/helper_windows.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/keychain.go b/pkg/keychain/keychain.go index 7110fa39..c8656294 100644 --- a/pkg/keychain/keychain.go +++ b/pkg/keychain/keychain.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/keychain_darwin.go b/pkg/keychain/keychain_darwin.go index a811749a..984e6f43 100644 --- a/pkg/keychain/keychain_darwin.go +++ b/pkg/keychain/keychain_darwin.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/keychain_default.go b/pkg/keychain/keychain_default.go index 22db6f54..73af1a7c 100644 --- a/pkg/keychain/keychain_default.go +++ b/pkg/keychain/keychain_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/keychain_missing.go b/pkg/keychain/keychain_missing.go index d0ce6c2e..5919ae1e 100644 --- a/pkg/keychain/keychain_missing.go +++ b/pkg/keychain/keychain_missing.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/keychain_test.go b/pkg/keychain/keychain_test.go index 7acdec20..22855bdd 100644 --- a/pkg/keychain/keychain_test.go +++ b/pkg/keychain/keychain_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/keychain/test_helper.go b/pkg/keychain/test_helper.go index 7a1fa6c7..b87cb40b 100644 --- a/pkg/keychain/test_helper.go +++ b/pkg/keychain/test_helper.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/build.go b/pkg/message/build.go index 87fd73c2..a75b5ebb 100644 --- a/pkg/message/build.go +++ b/pkg/message/build.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/build_custom.go b/pkg/message/build_custom.go index dbbb7fc4..0ea60c2e 100644 --- a/pkg/message/build_custom.go +++ b/pkg/message/build_custom.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/build_framework_test.go b/pkg/message/build_framework_test.go index 9f232945..e878260f 100644 --- a/pkg/message/build_framework_test.go +++ b/pkg/message/build_framework_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/build_test.go b/pkg/message/build_test.go index 580d495c..d80aef7e 100644 --- a/pkg/message/build_test.go +++ b/pkg/message/build_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/decrypt.go b/pkg/message/decrypt.go index ee6a7dd2..85920483 100644 --- a/pkg/message/decrypt.go +++ b/pkg/message/decrypt.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/decrypt_and_build.go b/pkg/message/decrypt_and_build.go index 9c35678c..308964f4 100644 --- a/pkg/message/decrypt_and_build.go +++ b/pkg/message/decrypt_and_build.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/header.go b/pkg/message/header.go index 361b8272..5c452c7d 100644 --- a/pkg/message/header.go +++ b/pkg/message/header.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/header_test.go b/pkg/message/header_test.go index 4e6eaf17..340aec2c 100644 --- a/pkg/message/header_test.go +++ b/pkg/message/header_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/message.go b/pkg/message/message.go index 85492d62..4354e847 100644 --- a/pkg/message/message.go +++ b/pkg/message/message.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/options.go b/pkg/message/options.go index dcc0caa5..1950bafb 100644 --- a/pkg/message/options.go +++ b/pkg/message/options.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser.go b/pkg/message/parser.go index 7f15f442..ecb85679 100644 --- a/pkg/message/parser.go +++ b/pkg/message/parser.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/handler.go b/pkg/message/parser/handler.go index 57873589..df30553c 100644 --- a/pkg/message/parser/handler.go +++ b/pkg/message/parser/handler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/parser.go b/pkg/message/parser/parser.go index 7923c6fa..e6c5903e 100644 --- a/pkg/message/parser/parser.go +++ b/pkg/message/parser/parser.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/parser_test.go b/pkg/message/parser/parser_test.go index 1263ba50..c9c71dec 100644 --- a/pkg/message/parser/parser_test.go +++ b/pkg/message/parser/parser_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/part.go b/pkg/message/parser/part.go index 61f5ea49..02604d53 100644 --- a/pkg/message/parser/part.go +++ b/pkg/message/parser/part.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/part_test.go b/pkg/message/parser/part_test.go index a16bf76c..07444be7 100644 --- a/pkg/message/parser/part_test.go +++ b/pkg/message/parser/part_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/trimmer.go b/pkg/message/parser/trimmer.go index 58f00b0b..95fccab9 100644 --- a/pkg/message/parser/trimmer.go +++ b/pkg/message/parser/trimmer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/trimmer_test.go b/pkg/message/parser/trimmer_test.go index d2f13c0d..738c3a0f 100644 --- a/pkg/message/parser/trimmer_test.go +++ b/pkg/message/parser/trimmer_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/visitor.go b/pkg/message/parser/visitor.go index f6dd31cc..d45e5c71 100644 --- a/pkg/message/parser/visitor.go +++ b/pkg/message/parser/visitor.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/walker.go b/pkg/message/parser/walker.go index 3d489dd8..2afd26c0 100644 --- a/pkg/message/parser/walker.go +++ b/pkg/message/parser/walker.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/walker_test.go b/pkg/message/parser/walker_test.go index 692339b9..b295ae5a 100644 --- a/pkg/message/parser/walker_test.go +++ b/pkg/message/parser/walker_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/writer.go b/pkg/message/parser/writer.go index e77e6db7..fb3c2813 100644 --- a/pkg/message/parser/writer.go +++ b/pkg/message/parser/writer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser/writer_test.go b/pkg/message/parser/writer_test.go index 18fa4d69..ae6bdcc5 100644 --- a/pkg/message/parser/writer_test.go +++ b/pkg/message/parser/writer_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/message/parser_test.go b/pkg/message/parser_test.go index 7750af33..ca9fbdc8 100644 --- a/pkg/message/parser_test.go +++ b/pkg/message/parser_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/mime/encoding.go b/pkg/mime/encoding.go index c590d581..41e71063 100644 --- a/pkg/mime/encoding.go +++ b/pkg/mime/encoding.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/mime/encoding_test.go b/pkg/mime/encoding_test.go index 2635dacc..87bd192c 100644 --- a/pkg/mime/encoding_test.go +++ b/pkg/mime/encoding_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/mime/mediaType.go b/pkg/mime/mediaType.go index 18031a11..c626527b 100644 --- a/pkg/mime/mediaType.go +++ b/pkg/mime/mediaType.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/mime/utf7Decoder.go b/pkg/mime/utf7Decoder.go index 7c14f410..2216538e 100644 --- a/pkg/mime/utf7Decoder.go +++ b/pkg/mime/utf7Decoder.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/mobileconfig/config.go b/pkg/mobileconfig/config.go index bf21d9f9..4b2f6f3b 100644 --- a/pkg/mobileconfig/config.go +++ b/pkg/mobileconfig/config.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/mobileconfig/template.go b/pkg/mobileconfig/template.go index be80f555..53478eb4 100644 --- a/pkg/mobileconfig/template.go +++ b/pkg/mobileconfig/template.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/ports/ports.go b/pkg/ports/ports.go index 212a3d42..961d77f1 100644 --- a/pkg/ports/ports.go +++ b/pkg/ports/ports.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/ports/ports_test.go b/pkg/ports/ports_test.go index 53276be7..a8bb8b65 100644 --- a/pkg/ports/ports_test.go +++ b/pkg/ports/ports_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/restarter/restarter.go b/pkg/restarter/restarter.go index 5bd3db1e..49f16a3d 100644 --- a/pkg/restarter/restarter.go +++ b/pkg/restarter/restarter.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/restarter/restarter_test.go b/pkg/restarter/restarter_test.go index 62be7f25..e427d318 100644 --- a/pkg/restarter/restarter_test.go +++ b/pkg/restarter/restarter_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/restarter/start_default.go b/pkg/restarter/start_default.go index 0995c740..d6451751 100644 --- a/pkg/restarter/start_default.go +++ b/pkg/restarter/start_default.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/restarter/start_windows.go b/pkg/restarter/start_windows.go index b78072bf..d944ba30 100644 --- a/pkg/restarter/start_windows.go +++ b/pkg/restarter/start_windows.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/sum/sum.go b/pkg/sum/sum.go index 96892b06..eac769f6 100644 --- a/pkg/sum/sum.go +++ b/pkg/sum/sum.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/sum/sum_test.go b/pkg/sum/sum_test.go index 79aeb6b4..6d8acde0 100644 --- a/pkg/sum/sum_test.go +++ b/pkg/sum/sum_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/pkg/tar/tar.go b/pkg/tar/tar.go index e1115d22..fcf28ab7 100644 --- a/pkg/tar/tar.go +++ b/pkg/tar/tar.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/api_test.go b/tests/api_test.go index 0f9b0bca..926afc77 100644 --- a/tests/api_test.go +++ b/tests/api_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/bdd_test.go b/tests/bdd_test.go index 9402c9f0..8dce023d 100644 --- a/tests/bdd_test.go +++ b/tests/bdd_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/tests/bridge_test.go b/tests/bridge_test.go index 11430a4d..78b3f2cf 100644 --- a/tests/bridge_test.go +++ b/tests/bridge_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/collector_test.go b/tests/collector_test.go index a8ebef8f..c1a56395 100644 --- a/tests/collector_test.go +++ b/tests/collector_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/config_status_test.go b/tests/config_status_test.go index e6fff35c..fef673e9 100644 --- a/tests/config_status_test.go +++ b/tests/config_status_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/contact_test.go b/tests/contact_test.go index c7aaedc2..6b960b60 100644 --- a/tests/contact_test.go +++ b/tests/contact_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_bridge_test.go b/tests/ctx_bridge_test.go index 7e848f6d..5aaa7ddb 100644 --- a/tests/ctx_bridge_test.go +++ b/tests/ctx_bridge_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_heartbeat_test.go b/tests/ctx_heartbeat_test.go index 99ac9351..0184d390 100644 --- a/tests/ctx_heartbeat_test.go +++ b/tests/ctx_heartbeat_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_helper_test.go b/tests/ctx_helper_test.go index 38641c39..81ce7c6c 100644 --- a/tests/ctx_helper_test.go +++ b/tests/ctx_helper_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_imap_test.go b/tests/ctx_imap_test.go index 13b590ad..d2f688ee 100644 --- a/tests/ctx_imap_test.go +++ b/tests/ctx_imap_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_reporter_test.go b/tests/ctx_reporter_test.go index 2a80b60d..74e26778 100644 --- a/tests/ctx_reporter_test.go +++ b/tests/ctx_reporter_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_smtp_test.go b/tests/ctx_smtp_test.go index eb95c9d6..ccce0b07 100644 --- a/tests/ctx_smtp_test.go +++ b/tests/ctx_smtp_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/ctx_test.go b/tests/ctx_test.go index 7020ebd9..9b2b342b 100644 --- a/tests/ctx_test.go +++ b/tests/ctx_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/diff.go b/tests/diff.go index 86234895..2cab7b32 100644 --- a/tests/diff.go +++ b/tests/diff.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/diff_test.go b/tests/diff_test.go index ed6da66c..cf7a5b61 100644 --- a/tests/diff_test.go +++ b/tests/diff_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/environment_test.go b/tests/environment_test.go index 75267909..d8e21032 100644 --- a/tests/environment_test.go +++ b/tests/environment_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/fast.go b/tests/fast.go index e08283a6..b04f04bb 100644 --- a/tests/fast.go +++ b/tests/fast.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/frontend_test.go b/tests/frontend_test.go index 99c72759..4165f135 100644 --- a/tests/frontend_test.go +++ b/tests/frontend_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/heartbeat_test.go b/tests/heartbeat_test.go index 5b58044d..086c72ad 100644 --- a/tests/heartbeat_test.go +++ b/tests/heartbeat_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/imap_test.go b/tests/imap_test.go index c77d9d68..d32e246a 100644 --- a/tests/imap_test.go +++ b/tests/imap_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/init_test.go b/tests/init_test.go index ef50cb7d..1253ace8 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/tests/main_test.go b/tests/main_test.go index 4bf3e1e6..c7a1f6f3 100644 --- a/tests/main_test.go +++ b/tests/main_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/smtp_test.go b/tests/smtp_test.go index 4a986837..2daa8a41 100644 --- a/tests/smtp_test.go +++ b/tests/smtp_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/steps_test.go b/tests/steps_test.go index a02e6825..e066aaee 100644 --- a/tests/steps_test.go +++ b/tests/steps_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/tests/types_test.go b/tests/types_test.go index 8a643017..2c3447ef 100644 --- a/tests/types_test.go +++ b/tests/types_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/tests/user_test.go b/tests/user_test.go index 569dc05c..ffbcd2e3 100644 --- a/tests/user_test.go +++ b/tests/user_test.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/bridge_app_version.sh b/utils/bridge_app_version.sh index 8c8c605a..bc3381fe 100755 --- a/utils/bridge_app_version.sh +++ b/utils/bridge_app_version.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/changelog_linter.sh b/utils/changelog_linter.sh index 1f1c76b9..3a4adaab 100755 --- a/utils/changelog_linter.sh +++ b/utils/changelog_linter.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/coverage.sh b/utils/coverage.sh index c0512914..14a791e0 100755 --- a/utils/coverage.sh +++ b/utils/coverage.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/credits.sh b/utils/credits.sh index a0b4c24f..6fd64ae1 100755 --- a/utils/credits.sh +++ b/utils/credits.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/debug/debug_assemble.go b/utils/debug/debug_assemble.go index 0adb053f..6d443f91 100644 --- a/utils/debug/debug_assemble.go +++ b/utils/debug/debug_assemble.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/utils/dependency_license.sh b/utils/dependency_license.sh index b19aa8e8..ae93b953 100755 --- a/utils/dependency_license.sh +++ b/utils/dependency_license.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/dxtn/main.cpp b/utils/dxtn/main.cpp index e6becf53..6fa6a7c9 100644 --- a/utils/dxtn/main.cpp +++ b/utils/dxtn/main.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/utils/dxtn/main.h b/utils/dxtn/main.h index 36af1b66..ad6e2ea6 100644 --- a/utils/dxtn/main.h +++ b/utils/dxtn/main.h @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge.Bridge. // diff --git a/utils/export_icons.sh b/utils/export_icons.sh index 3b013d58..05d8ad89 100755 --- a/utils/export_icons.sh +++ b/utils/export_icons.sh @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/get_revision.sh b/utils/get_revision.sh index 18f18f57..fc8b58b3 100755 --- a/utils/get_revision.sh +++ b/utils/get_revision.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/govulncheck.sh b/utils/govulncheck.sh index 0735f3c6..fa465a4e 100755 --- a/utils/govulncheck.sh +++ b/utils/govulncheck.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/hasher/main.go b/utils/hasher/main.go index 342af40e..4ccdd176 100644 --- a/utils/hasher/main.go +++ b/utils/hasher/main.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/kb-suggester/kb-suggester.go b/utils/kb-suggester/kb-suggester.go index 6a6b1787..1e2e1b01 100644 --- a/utils/kb-suggester/kb-suggester.go +++ b/utils/kb-suggester/kb-suggester.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/keyring.go b/utils/keyring.go index 17df2af8..0319025b 100644 --- a/utils/keyring.go +++ b/utils/keyring.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/license_header.txt b/utils/license_header.txt index e1f421f0..ec7fd39a 100644 --- a/utils/license_header.txt +++ b/utils/license_header.txt @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/missing_license.sh b/utils/missing_license.sh index 563f7216..23ef66f1 100755 --- a/utils/missing_license.sh +++ b/utils/missing_license.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # @@ -17,7 +17,21 @@ # You should have received a copy of the GNU General Public License # along with Proton Mail Bridge. If not, see . +case $1 in + check|add|change-year) + ;; + *) + echo "Please select one of the actions:" + echo " check" + echo " add" + echo " change-year" + exit 1 +esac +[[ "$1" == "check" ]] && [[ -n "${MISSING_FILES}" ]] && exit 1 + YEAR=`date +%Y` +GREP_COPYRIGHT="Copyright (c) ${YEAR} Proton AG" + MISSING_FILES=$(find . \ -not -path "./extern/*" \ -not -path "./*deploy/*" \ @@ -30,25 +44,33 @@ MISSING_FILES=$(find . \ -not -name "*.pb.h" \ -not -name "*.pb.cc" \ -not -name "*_moc.h" \ - -regextype posix-egrep -regex ".*\.go|.*\.qml|.*\.sh|.*\.py|.*\.cpp|.*\.cc|.*\.h|.*\.hpp|.*\.m|.*\.h\.in" \ - -exec grep -L "Copyright (c) ${YEAR} Proton AG" {} \;) + -regextype posix-egrep -regex ".*\.go|.*\.qml|.*\.sh|.*\.py|.*\.cpp|.*\.cc|.*\.h|.*\.hpp|.*\.m|.*\.mm|.*\.h\.in" \ + -exec grep -L "$GREP_COPYRIGHT" {} \;) + +MANUAL_CHECK=$(grep -L "$GREP_COPYRIGHT" \ + ./utils/license_header.txt \ + README.md) + +if [ -n "${MANUAL_CHECK}" ]; then + MISSING_FILES="$MISSING_FILES $MANUAL_CHECK" +fi; for f in ${MISSING_FILES} do echo -n "MISSING LICENSE or WRONG YEAR in $f" if [[ $1 == "add" ]] then - cat ./utils/license_header.txt $f > tmp - mv tmp $f + cat ./utils/license_header.txt "$f" > tmp + mv tmp "$f" echo -n "... license added" fi if [[ $1 == "change-year" ]] then - sed -i "s/Copyright (c) [0-9]\\{4\\} Proton AG/Copyright (c) ${YEAR} Proton AG/" $f || exit 3 + sed -i "s/Copyright (c) [0-9]\\{4\\} Proton AG/Copyright (c) ${YEAR} Proton AG/" "$f" || exit 3 echo -n "... replaced copyright year" fi echo done -[[ "$1" == "check" ]] && [[ -n ${MISSING_FILES} ]] && exit 1 +[[ "$1" == "check" ]] && [[ -n "${MISSING_FILES}" ]] && exit 1 exit 0 diff --git a/utils/port-blocker/port-blocker.go b/utils/port-blocker/port-blocker.go index 9a358f44..928c1801 100644 --- a/utils/port-blocker/port-blocker.go +++ b/utils/port-blocker/port-blocker.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/rebranding.sh b/utils/rebranding.sh index d5ab70c8..8fa71b1e 100755 --- a/utils/rebranding.sh +++ b/utils/rebranding.sh @@ -1,6 +1,6 @@ ##!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # @@ -24,7 +24,7 @@ REPLACE_FILES=$(find . -not -path "./vendor/*" \ -not -name "*mock*.go" \ -regextype posix-egrep \ -regex ".*\.go|.*\.qml|qmldir|.*\.qmlproject|.*\.txt|.*\.md|.*\.h|.*\.cpp|.*\.m|.*\.sh|.*\.py" \ - -exec grep -L "Copyright (c) 2023 Proton AG" {} \;) + -exec grep -L "Copyright (c) 2024 Proton AG" {} \;) for f in ${REPLACE_FILES} do @@ -35,16 +35,16 @@ do # Proton Mail Bridge is free software: you can redistribute it and/or modify # Proton Mail Bridge is distributed in the hope that it will be useful, # along with Proton Mail Bridge. If not, see . - # Copyright (c) 2023 Proton AG + # Copyright (c) 2024 Proton AG for repl in \ "s/This file is part of ProtonMail Bridge./This file is part of Proton Mail Bridge./" \ "s/ProtonMail Bridge is free software:/Proton Mail Bridge is free software:/" \ "s/ProtonMail Bridge is distributed in the hope that it will be useful/Proton Mail Bridge is distributed in the hope that it will be useful/" \ "s/along with ProtonMail Bridge. If not, see/along with Proton Mail Bridge. If not, see/" \ "s/along with ProtonMail Bridge. If not, see/along with Proton Mail Bridge. If not, see/" \ - "s/Copyright (c) 2022 Proton Technologies AG/Copyright (c) 2023 Proton AG/" \ - "s/Copyright (c) 2021 Proton Technologies AG/Copyright (c) 2023 Proton AG/" \ - "s/Copyright (c) 2020 Proton Technologies AG/Copyright (c) 2023 Proton AG/" + "s/Copyright (c) 2022 Proton Technologies AG/Copyright (c) 2024 Proton AG/" \ + "s/Copyright (c) 2021 Proton Technologies AG/Copyright (c) 2024 Proton AG/" \ + "s/Copyright (c) 2020 Proton Technologies AG/Copyright (c) 2024 Proton AG/" do sed -i "$repl" "$f" || exit 3 done diff --git a/utils/release_notes.sh b/utils/release_notes.sh index cd1912bd..8c3bb5e0 100755 --- a/utils/release_notes.sh +++ b/utils/release_notes.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/remove_non_relative_links_darwin.sh b/utils/remove_non_relative_links_darwin.sh index 12f9ded1..7723571e 100755 --- a/utils/remove_non_relative_links_darwin.sh +++ b/utils/remove_non_relative_links_darwin.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/smtp-send/main.go b/utils/smtp-send/main.go index fffdbda1..369449c1 100644 --- a/utils/smtp-send/main.go +++ b/utils/smtp-send/main.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/sync_bench.py b/utils/sync_bench.py index 4b08ae85..eae6f548 100644 --- a/utils/sync_bench.py +++ b/utils/sync_bench.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/update_test_keys.sh b/utils/update_test_keys.sh index 8438090b..9f255719 100755 --- a/utils/update_test_keys.sh +++ b/utils/update_test_keys.sh @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/validate_bug_report_file.py b/utils/validate_bug_report_file.py index f5dd3088..3303e31d 100755 --- a/utils/validate_bug_report_file.py +++ b/utils/validate_bug_report_file.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright (c) 2023 Proton AG +# Copyright (c) 2024 Proton AG # # This file is part of Proton Mail Bridge. # diff --git a/utils/vault-editor/main.go b/utils/vault-editor/main.go index 0ac44ced..20c63ba0 100644 --- a/utils/vault-editor/main.go +++ b/utils/vault-editor/main.go @@ -1,6 +1,6 @@ //go:build debug -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // diff --git a/utils/versioner/main.go b/utils/versioner/main.go index 0ff57d62..74b84014 100644 --- a/utils/versioner/main.go +++ b/utils/versioner/main.go @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Proton AG +// Copyright (c) 2024 Proton AG // // This file is part of Proton Mail Bridge. // From 25ebcffde38b482816c661500e9284585b586960 Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Tue, 2 Jan 2024 14:48:21 +0100 Subject: [PATCH 33/58] fix(GODT-3187): Fix numberOfDay computation when changing year. --- .../configstatus/configuration_progress.go | 4 +- .../configuration_progress_test.go | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/internal/configstatus/configuration_progress.go b/internal/configstatus/configuration_progress.go index 1e61fdd6..5599e2e5 100644 --- a/internal/configstatus/configuration_progress.go +++ b/internal/configstatus/configuration_progress.go @@ -53,9 +53,9 @@ func numberOfDay(now, prev time.Time) int { } if now.Year() > prev.Year() { if now.YearDay() > prev.YearDay() { - return 365 + (now.YearDay() - prev.YearDay()) + return 365 + (now.YearDay() - prev.YearDay()) + (365 * (now.Year() - prev.Year() - 1)) } - return (prev.YearDay() + now.YearDay()) - 365 + return (365 - prev.YearDay()) + now.YearDay() + (365 * (now.Year() - prev.Year() - 1)) } else if now.YearDay() > prev.YearDay() { return now.YearDay() - prev.YearDay() } diff --git a/internal/configstatus/configuration_progress_test.go b/internal/configstatus/configuration_progress_test.go index 23658b35..496a5e48 100644 --- a/internal/configstatus/configuration_progress_test.go +++ b/internal/configstatus/configuration_progress_test.go @@ -69,3 +69,61 @@ func TestConfigurationProgress_fed(t *testing.T) { require.Equal(t, 5, req.Values.NbDay) require.Equal(t, 2, req.Values.NbDaySinceLast) } + +func TestConfigurationProgress_fed_year_change(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "dummy.json") + var data = configstatus.ConfigurationStatusData{ + Metadata: configstatus.Metadata{Version: "1.0.0"}, + DataV1: configstatus.DataV1{ + PendingSince: time.Now().AddDate(-1, 0, -5), + LastProgress: time.Now().AddDate(0, 0, -2), + Autoconf: "Mr TBird", + ClickedLink: 42, + ReportSent: false, + ReportClick: true, + FailureDetails: "Not an error", + }, + } + require.NoError(t, dumpConfigStatusInFile(&data, file)) + + config, err := configstatus.LoadConfigurationStatus(file) + require.NoError(t, err) + + var builder = configstatus.ConfigProgressBuilder{} + req := builder.New(config) + + require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) + require.Equal(t, "bridge_config_progress", req.Event) + require.Equal(t, 370, req.Values.NbDay) + require.Equal(t, 2, req.Values.NbDaySinceLast) +} + +func TestConfigurationProgress_fed_day_higher(t *testing.T) { + dir := t.TempDir() + file := filepath.Join(dir, "dummy.json") + var data = configstatus.ConfigurationStatusData{ + Metadata: configstatus.Metadata{Version: "1.0.0"}, + DataV1: configstatus.DataV1{ + PendingSince: time.Now().AddDate(-1, 0, -5), + LastProgress: time.Now().AddDate(0, 0, -2), + Autoconf: "Mr TBird", + ClickedLink: 42, + ReportSent: false, + ReportClick: true, + FailureDetails: "Not an error", + }, + } + require.NoError(t, dumpConfigStatusInFile(&data, file)) + + config, err := configstatus.LoadConfigurationStatus(file) + require.NoError(t, err) + + var builder = configstatus.ConfigProgressBuilder{} + req := builder.New(config) + + require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) + require.Equal(t, "bridge_config_progress", req.Event) + require.Equal(t, 370, req.Values.NbDay) + require.Equal(t, 2, req.Values.NbDaySinceLast) +} From 43df20c25dc9cd1ab2b15a15531b2b77210a243a Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Tue, 2 Jan 2024 15:24:01 +0100 Subject: [PATCH 34/58] fix(GODT-3187): Fix numberOfDay computation when changing date. --- .../configstatus/configuration_progress.go | 5 +--- .../configuration_progress_test.go | 29 ------------------- 2 files changed, 1 insertion(+), 33 deletions(-) diff --git a/internal/configstatus/configuration_progress.go b/internal/configstatus/configuration_progress.go index 5599e2e5..e8d15bf0 100644 --- a/internal/configstatus/configuration_progress.go +++ b/internal/configstatus/configuration_progress.go @@ -52,10 +52,7 @@ func numberOfDay(now, prev time.Time) int { return 1 } if now.Year() > prev.Year() { - if now.YearDay() > prev.YearDay() { - return 365 + (now.YearDay() - prev.YearDay()) + (365 * (now.Year() - prev.Year() - 1)) - } - return (365 - prev.YearDay()) + now.YearDay() + (365 * (now.Year() - prev.Year() - 1)) + return (365 * (now.Year() - prev.Year())) + now.YearDay() - prev.YearDay() } else if now.YearDay() > prev.YearDay() { return now.YearDay() - prev.YearDay() } diff --git a/internal/configstatus/configuration_progress_test.go b/internal/configstatus/configuration_progress_test.go index 496a5e48..540232cc 100644 --- a/internal/configstatus/configuration_progress_test.go +++ b/internal/configstatus/configuration_progress_test.go @@ -98,32 +98,3 @@ func TestConfigurationProgress_fed_year_change(t *testing.T) { require.Equal(t, 370, req.Values.NbDay) require.Equal(t, 2, req.Values.NbDaySinceLast) } - -func TestConfigurationProgress_fed_day_higher(t *testing.T) { - dir := t.TempDir() - file := filepath.Join(dir, "dummy.json") - var data = configstatus.ConfigurationStatusData{ - Metadata: configstatus.Metadata{Version: "1.0.0"}, - DataV1: configstatus.DataV1{ - PendingSince: time.Now().AddDate(-1, 0, -5), - LastProgress: time.Now().AddDate(0, 0, -2), - Autoconf: "Mr TBird", - ClickedLink: 42, - ReportSent: false, - ReportClick: true, - FailureDetails: "Not an error", - }, - } - require.NoError(t, dumpConfigStatusInFile(&data, file)) - - config, err := configstatus.LoadConfigurationStatus(file) - require.NoError(t, err) - - var builder = configstatus.ConfigProgressBuilder{} - req := builder.New(config) - - require.Equal(t, "bridge.any.configuration", req.MeasurementGroup) - require.Equal(t, "bridge_config_progress", req.Event) - require.Equal(t, 370, req.Values.NbDay) - require.Equal(t, 2, req.Values.NbDaySinceLast) -} From 346988e60495779e7511d070f3c23f42f3ff34ba Mon Sep 17 00:00:00 2001 From: Romain LE JEUNE Date: Tue, 19 Dec 2023 11:12:46 +0100 Subject: [PATCH 35/58] chore: Also log the message received time when handling message creation event. --- internal/services/imapservice/service_message_events.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/services/imapservice/service_message_events.go b/internal/services/imapservice/service_message_events.go index 5438faed..76e8d65b 100644 --- a/internal/services/imapservice/service_message_events.go +++ b/internal/services/imapservice/service_message_events.go @@ -130,6 +130,7 @@ func onMessageCreated( s.log.WithFields(logrus.Fields{ "messageID": message.ID, "subject": logging.Sensitive(message.Subject), + "date": message.Time, }).Info("Handling message created event") full, err := s.client.GetFullMessage(ctx, message.ID, usertypes.NewProtonAPIScheduler(s.panicHandler), proton.NewDefaultAttachmentAllocator()) From fb32d652bcbb06fa64aa87ddf0a675332426e591 Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Tue, 2 Jan 2024 14:42:29 +0100 Subject: [PATCH 36/58] fix(GODT-3183): Fix database indices https://github.com/ProtonMail/gluon/pull/402 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index a294234e..cdbbdca8 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 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.20231206152152-caaf10897f9e + github.com/ProtonMail/gluon v0.17.1-0.20240102132144-89b40fb6fe7e github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a github.com/ProtonMail/go-proton-api v0.4.1-0.20231130083229-e8aa47d7a366 github.com/ProtonMail/gopenpgp/v2 v2.7.4-proton diff --git a/go.sum b/go.sum index 32181d10..a92efc52 100644 --- a/go.sum +++ b/go.sum @@ -28,8 +28,8 @@ 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/docker-credential-helpers v1.1.0 h1:+kvUIpwWcbtP3WFv5sSvkFn/XLzSqPOB5AAthuk9xPk= github.com/ProtonMail/docker-credential-helpers v1.1.0/go.mod h1:mK0aBveCxhnQ756AmaTfXMZDeULvheYVhF/MWMErN5g= -github.com/ProtonMail/gluon v0.17.1-0.20231206152152-caaf10897f9e h1:kHmSOTxynSip1WJvwZTFOGJPVfI42e/I8bDzDjLK7aM= -github.com/ProtonMail/gluon v0.17.1-0.20231206152152-caaf10897f9e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= +github.com/ProtonMail/gluon v0.17.1-0.20240102132144-89b40fb6fe7e h1:DR97ydcuS4/EjTTCkp7F9IRCi+ykD1UoAP7UBFtEcRA= +github.com/ProtonMail/gluon v0.17.1-0.20240102132144-89b40fb6fe7e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= 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= From 31670ad9ebd20fb500f25876523e37fab578b89e Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Thu, 4 Jan 2024 09:27:27 +0100 Subject: [PATCH 37/58] chore: fix for SMTP connection mode toggle in bridge-gui-tester. --- .../bridge-gui/bridge-gui-tester/GRPCService.cpp | 2 +- .../bridge-gui/bridge-gui-tester/Tabs/SettingsTab.ui | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp index 4c72200b..3f6b7c6c 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp +++ b/internal/frontend/bridge-gui/bridge-gui-tester/GRPCService.cpp @@ -623,7 +623,7 @@ Status GRPCService::MailServerSettings(ServerContext *, Empty const *, ImapSmtpS outSettings->set_imapport(tab.imapPort()); outSettings->set_smtpport(tab.smtpPort()); outSettings->set_usesslforimap(tab.useSSLForIMAP()); - outSettings->set_usesslforimap(tab.useSSLForSMTP()); + outSettings->set_usesslforsmtp(tab.useSSLForSMTP()); return Status::OK; } diff --git a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.ui b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.ui index da8d6c1f..22d04cca 100644 --- a/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.ui +++ b/internal/frontend/bridge-gui/bridge-gui-tester/Tabs/SettingsTab.ui @@ -217,7 +217,7 @@ - + @@ -259,16 +259,16 @@ - + - Use SSL For SMTP + Use SSL For IMAP - + - Use SSL For IMAP + Use SSL For SMTP From 89bb7b63897a262f1a3e1ed92f16eb9d62fde619 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 3 Jan 2024 13:34:58 +0100 Subject: [PATCH 38/58] feat(GODT-3172): do not list, just retrieve vault key. --- go.mod | 2 +- go.sum | 4 ++-- internal/app/vault.go | 11 ++++------- internal/vault/helper.go | 10 ---------- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index cdbbdca8..d7a0231c 100644 --- a/go.mod +++ b/go.mod @@ -124,5 +124,5 @@ replace ( github.com/emersion/go-message => github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7 github.com/emersion/go-smtp => github.com/ProtonMail/go-smtp v0.0.0-20231109081432-2b3d50599865 github.com/go-resty/resty/v2 => github.com/LBeernaertProton/resty/v2 v2.0.0-20231129100320-dddf8030d93a - github.com/keybase/go-keychain => github.com/cuthix/go-keychain v0.0.0-20230517073537-fc1740a83768 + github.com/keybase/go-keychain => github.com/cuthix/go-keychain v0.0.0-20240103134243-0b6a41580b77 ) diff --git a/go.sum b/go.sum index a92efc52..43f960f3 100644 --- a/go.sum +++ b/go.sum @@ -107,8 +107,8 @@ github.com/cucumber/godog v0.12.5/go.mod h1:u6SD7IXC49dLpPN35kal0oYEjsXZWee4pW6T github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= -github.com/cuthix/go-keychain v0.0.0-20230517073537-fc1740a83768 h1:Jrcoxtrk4qpuzKIYPlEkjIK0M+bABs0oW2QzrOuwlzk= -github.com/cuthix/go-keychain v0.0.0-20230517073537-fc1740a83768/go.mod h1:ZoZU1fnBy3mOLWr3Pg+Y2+nTKtu6ypDte2kZg9HvSwY= +github.com/cuthix/go-keychain v0.0.0-20240103134243-0b6a41580b77 h1:sdB/yJMbubPQothFl6KYCOrMBRgy0pZbBXIWoJqSFLo= +github.com/cuthix/go-keychain v0.0.0-20240103134243-0b6a41580b77/go.mod h1:ZoZU1fnBy3mOLWr3Pg+Y2+nTKtu6ypDte2kZg9HvSwY= github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= diff --git a/internal/app/vault.go b/internal/app/vault.go index 4d98ad4b..eaa2b310 100644 --- a/internal/app/vault.go +++ b/internal/app/vault.go @@ -104,14 +104,11 @@ func loadVaultKey(vaultDir string, keychains *keychain.List) ([]byte, error) { return nil, fmt.Errorf("could not create keychain: %w", err) } - has, err := vault.HasVaultKey(kc) + key, err := vault.GetVaultKey(kc) if err != nil { - return nil, fmt.Errorf("could not check for vault key: %w", err) + logrus.WithError(err).Warn("Not possible to retrieve vault key, generating new") + return vault.NewVaultKey(kc) } - if has { - return vault.GetVaultKey(kc) - } - - return vault.NewVaultKey(kc) + return key, nil } diff --git a/internal/vault/helper.go b/internal/vault/helper.go index a784ec2e..b0a965eb 100644 --- a/internal/vault/helper.go +++ b/internal/vault/helper.go @@ -28,7 +28,6 @@ import ( "github.com/ProtonMail/gopenpgp/v2/crypto" "github.com/ProtonMail/proton-bridge/v3/pkg/keychain" - "golang.org/x/exp/slices" ) const vaultSecretName = "bridge-vault-key" @@ -69,15 +68,6 @@ func SetHelper(vaultDir, helper string) error { return os.WriteFile(getKeychainPrefPath(vaultDir), b, 0o600) } -func HasVaultKey(kc *keychain.Keychain) (bool, error) { - secrets, err := kc.List() - if err != nil { - return false, fmt.Errorf("could not list keychain: %w", err) - } - - return slices.Contains(secrets, vaultSecretName), nil -} - func GetVaultKey(kc *keychain.Keychain) ([]byte, error) { _, keyEnc, err := kc.Get(vaultSecretName) if err != nil { From 9b1daa03739faec9d3ca110939292272e7b64905 Mon Sep 17 00:00:00 2001 From: Jakub Date: Thu, 4 Jan 2024 08:28:17 +0100 Subject: [PATCH 39/58] feat(GODT-3172): detect missing keychain item --- internal/app/vault.go | 8 ++++++-- pkg/keychain/helper_darwin.go | 2 +- pkg/keychain/helper_dbus_linux.go | 6 +++++- pkg/keychain/keychain.go | 17 ++++++++++++++++- pkg/keychain/keychain_test.go | 13 +++++++++++++ 5 files changed, 41 insertions(+), 5 deletions(-) diff --git a/internal/app/vault.go b/internal/app/vault.go index eaa2b310..8ec90f74 100644 --- a/internal/app/vault.go +++ b/internal/app/vault.go @@ -106,8 +106,12 @@ func loadVaultKey(vaultDir string, keychains *keychain.List) ([]byte, error) { key, err := vault.GetVaultKey(kc) if err != nil { - logrus.WithError(err).Warn("Not possible to retrieve vault key, generating new") - return vault.NewVaultKey(kc) + if keychain.IsErrKeychainNoItem(err) { + logrus.WithError(err).Warn("no vault key found, generating new") + return vault.NewVaultKey(kc) + } + + return nil, fmt.Errorf("could not check for vault key: %w", err) } return key, nil diff --git a/pkg/keychain/helper_darwin.go b/pkg/keychain/helper_darwin.go index 2ae834a7..5d9147fd 100644 --- a/pkg/keychain/helper_darwin.go +++ b/pkg/keychain/helper_darwin.go @@ -125,7 +125,7 @@ func (h *macOSHelper) Get(secretURL string) (string, string, error) { } if len(results) == 0 { - return "", "", errors.New("no result") + return "", "", ErrKeychainNoItem } if len(results) != 1 { diff --git a/pkg/keychain/helper_dbus_linux.go b/pkg/keychain/helper_dbus_linux.go index cf85c91a..8218d21b 100644 --- a/pkg/keychain/helper_dbus_linux.go +++ b/pkg/keychain/helper_dbus_linux.go @@ -168,10 +168,14 @@ func (s *SecretServiceDBusHelper) Get(serverURL string) (string, string, error) serverAtt: serverURL, }) - if len(items) == 0 || err != nil { + if err != nil { return "", "", err } + if len(items) == 0 { + return "", "", ErrKeychainNoItem + } + item := items[0] attributes, err := service.GetAttributes(item) diff --git a/pkg/keychain/keychain.go b/pkg/keychain/keychain.go index c8656294..21f276b5 100644 --- a/pkg/keychain/keychain.go +++ b/pkg/keychain/keychain.go @@ -41,8 +41,14 @@ var ( // ErrMacKeychainRebuild is returned on macOS with blocked or corrupted keychain. ErrMacKeychainRebuild = errors.New("keychain error -25293") + + ErrKeychainNoItem = errors.New("no such keychain item") ) +func IsErrKeychainNoItem(err error) bool { + return errors.Is(err, ErrKeychainNoItem) || credentials.IsErrCredentialsNotFound(err) +} + type Helpers map[string]helperConstructor type List struct { @@ -173,7 +179,16 @@ func (kc *Keychain) Get(userID string) (string, string, error) { kc.locker.Lock() defer kc.locker.Unlock() - return kc.helper.Get(kc.secretURL(userID)) + id, key, err := kc.helper.Get(kc.secretURL(userID)) + if err != nil { + return id, key, err + } + + if key == "" { + return id, key, ErrKeychainNoItem + } + + return id, key, err } func (kc *Keychain) Put(userID, secret string) error { diff --git a/pkg/keychain/keychain_test.go b/pkg/keychain/keychain_test.go index 22855bdd..becbb4d3 100644 --- a/pkg/keychain/keychain_test.go +++ b/pkg/keychain/keychain_test.go @@ -114,3 +114,16 @@ func TestInsertReadRemove(t *testing.T) { require.NotContains(t, actualList, id) } } + +func TestIsErrKeychainNoItem(t *testing.T) { + r := require.New(t) + helpers := NewList().GetHelpers() + + for helperName := range helpers { + kc, err := NewKeychain(helperName, "bridge-test", helpers, helperName) + r.NoError(err) + + _, _, err = kc.Get("non-existing") + r.True(IsErrKeychainNoItem(err), "failed for %s with error %w", helperName, err) + } +} From e63afd39108424a720f4eda0175c87c146f76a34 Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Fri, 5 Jan 2024 09:30:13 +0100 Subject: [PATCH 40/58] feat(GODT-3156): add time zone info to the bridge log. --- internal/app/app.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/app/app.go b/internal/app/app.go index 8d3a3f9c..1bf590ae 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -26,6 +26,7 @@ import ( "os" "path/filepath" "runtime" + "time" "github.com/Masterminds/semver/v3" "github.com/ProtonMail/gluon/async" @@ -371,6 +372,12 @@ func withLogging(c *cli.Context, crashHandler *crash.Handler, locations *locatio WithField("SentryID", sentry.GetProtectedHostname()). Info("Run app") + now := time.Now() + logrus. + WithField("timeZone", now.Format("MST")). + WithField("offset", now.Format("-07:00:00")). + Info("Time zone info") + return fn(closer) } From 5751166ebcbc3da70a76d0ec6ca972cf001bb3b6 Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Tue, 9 Jan 2024 09:24:21 +0100 Subject: [PATCH 41/58] feat(GODT-3155): customize log formatter for easier parsing. --- internal/logging/logging.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/internal/logging/logging.go b/internal/logging/logging.go index 2ba6f7ea..2faaab72 100644 --- a/internal/logging/logging.go +++ b/internal/logging/logging.go @@ -91,9 +91,11 @@ func (cs *coloredStdOutHook) Fire(entry *logrus.Entry) error { // the default pruning algorithm. func Init(logsPath string, sessionID SessionID, appName AppName, rotationSize, pruningSize int64, level string) (io.Closer, error) { logrus.SetFormatter(&logrus.TextFormatter{ - DisableColors: true, - FullTimestamp: true, - TimestampFormat: time.StampMilli, + DisableColors: true, + ForceQuote: true, + FullTimestamp: true, + QuoteEmptyFields: true, + TimestampFormat: "2006-01-02 15:04:05.000", }) logrus.AddHook(newColoredStdOutHook()) From 2895f42a6426439a470e20519593ec4ee5f65445 Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Wed, 10 Jan 2024 08:32:43 +0100 Subject: [PATCH 42/58] feat(GODT-3195): add OS info to the log. --- internal/app/app.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/internal/app/app.go b/internal/app/app.go index 1bf590ae..49fb83e0 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -44,6 +44,7 @@ import ( "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/ProtonMail/proton-bridge/v3/pkg/keychain" "github.com/ProtonMail/proton-bridge/v3/pkg/restarter" + "github.com/elastic/go-sysinfo" "github.com/pkg/profile" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" @@ -378,6 +379,18 @@ func withLogging(c *cli.Context, crashHandler *crash.Handler, locations *locatio WithField("offset", now.Format("-07:00:00")). Info("Time zone info") + host, err := sysinfo.Host() + if err != nil { + logrus.WithError(err).Error("Could not retrieve operating system info") + } else { + osInfo := host.Info().OS + logrus. + WithField("name", osInfo.Name). + WithField("version", osInfo.Version). + WithField("build", osInfo.Build). + Info("Operating system info") + } + return fn(closer) } From f565fc4f69551a0200aa986464d350f34af7eb8e Mon Sep 17 00:00:00 2001 From: Leander Beernaert Date: Thu, 11 Jan 2024 08:33:02 +0100 Subject: [PATCH 43/58] fix(GODT-3203): Crash in chunkDivide If for some reason all the message we are trying to sync in a chunk are deleted from another client it is possible that the input to the build stage will be empty. This case is now handled correctly. --- internal/services/syncservice/stage_build.go | 17 ++++++++++ .../services/syncservice/stage_build_test.go | 32 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/internal/services/syncservice/stage_build.go b/internal/services/syncservice/stage_build.go index 16cd4e97..55f9fd75 100644 --- a/internal/services/syncservice/stage_build.go +++ b/internal/services/syncservice/stage_build.go @@ -101,6 +101,23 @@ func (b *BuildStage) run(ctx context.Context) { continue } + if len(req.batch) == 0 { + // it is possible that if one does a mass delete on another client an entire download batch fails, + // and we reach this point without any messages to build. + req.onStageCompleted(ctx) + + if err := b.output.Produce(ctx, ApplyRequest{ + childJob: req.childJob, + messages: nil, + }); err != nil { + err = fmt.Errorf("failed to produce output for next stage: %w", err) + logrus.Errorf(err.Error()) + req.job.onError(err) + } + + continue + } + err = req.job.messageBuilder.WithKeys(func(_ *crypto.KeyRing, addrKRs map[string]*crypto.KeyRing) error { chunks := chunkSyncBuilderBatch(req.batch, b.maxBuildMem) diff --git a/internal/services/syncservice/stage_build_test.go b/internal/services/syncservice/stage_build_test.go index 6b51f949..4169a1e1 100644 --- a/internal/services/syncservice/stage_build_test.go +++ b/internal/services/syncservice/stage_build_test.go @@ -321,3 +321,35 @@ func TestBuildStage_CancelledJobIsDiscarded(t *testing.T) { _, err := output.Consume(context.Background()) require.ErrorIs(t, err, ErrNoMoreInput) } + +func TestTask_EmptyInputDoesNotCrash(t *testing.T) { + mockCtrl := gomock.NewController(t) + + input := NewChannelConsumerProducer[BuildRequest]() + output := NewChannelConsumerProducer[ApplyRequest]() + reporter := mocks.NewMockReporter(mockCtrl) + + labels := getTestLabels() + + ctx, cancel := context.WithCancel(context.Background()) + tj := newTestJob(ctx, mockCtrl, "u", labels) + + tj.syncReporter.EXPECT().OnProgress(gomock.Any(), gomock.Eq(int64(10))) + + tj.job.begin() + childJob := tj.job.newChildJob("f", 10) + tj.job.end() + + stage := NewBuildStage(input, output, 1024, &async.NoopPanicHandler{}, reporter) + + go func() { + stage.run(ctx) + }() + + require.NoError(t, input.Produce(ctx, BuildRequest{childJob: childJob, batch: []proton.FullMessage{}})) + + req, err := output.Consume(ctx) + cancel() + require.NoError(t, err) + require.Len(t, req.messages, 0) +} From 46fd1d5a76f6ada041bcbca92186163002ca204f Mon Sep 17 00:00:00 2001 From: Gjorgji Slamkov Date: Mon, 15 Jan 2024 13:10:22 +0000 Subject: [PATCH 44/58] test(GODT-3052): Replace attachments and inline content in feature tests with the smallest valid versions --- tests/features/imap/message/import.feature | 51 ++-- tests/features/smtp/send/failures.feature | 28 +- tests/features/smtp/send/html.feature | 35 +-- tests/features/smtp/send/html_att.feature | 24 +- .../smtp/send/html_to_internal.feature | 244 ++---------------- tests/features/smtp/send/inline.feature | 36 +-- .../smtp/send/one_account_to_another.feature | 12 +- tests/features/smtp/send/plain_att.feature | 36 +-- .../smtp/send/plain_to_internal.feature | 142 ++-------- 9 files changed, 90 insertions(+), 518 deletions(-) diff --git a/tests/features/imap/message/import.feature b/tests/features/imap/message/import.feature index ad0cf1bb..158c72fc 100644 --- a/tests/features/imap/message/import.feature +++ b/tests/features/imap/message/import.feature @@ -503,16 +503,7 @@ Feature: IMAP import messages Content-ID: Content-Disposition: inline; filename="email-action-left.gif" - R0lGODlhGAAYANUAACcsKOHs4kppTH6tgYWxiIq0jTVENpG5lDI/M7bRuEaJSkqOTk2RUU+P - U16lYl+lY2iva262cXS6d3rDfYLNhWeeamKTZGSVZkNbRGqhbOPt4////+7u7qioqFZWVlNT - UyIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAG - /8CNcLjRJAqVRqNSSGiI0GFgoKhar4NAdHioMhyRCYUyiTgY1cOWUH1ILgIDAGAQXCSPKgHa - XUAyGCCCg4IYGRALCmpCAVUQFgiEkiAIFhBVWhtUDxmRk5IIGXkDRQoMEoGfHpIYEmhGCg4X - nyAdHB+SFw4KRwoRArQdG7eEAhEKSAoTBoIdzs/Cw7iCBhMKSQoUAIJbQ8QgABQKStnbIN1C - 3+HjFcrMtdDO6dMg1dcFvsCfwt+CxsgJYs3a10+QLl4aTKGitYpQq1eaFHDyREtQqFGMHEGq - SMkSJi4K/ACiZQiRIihsJL6JM6fOnTwK9kTpYgqMGDJm0JzsNuWKTw0FWdANMYJECRMnW4IA - ADs= + R0lGODlhAQABAAAAADs= --61FA22A41A3F46E8E90EF528-- @@ -543,7 +534,7 @@ Feature: IMAP import messages "content-disposition": "inline", "content-disposition-filename": "email-action-left.gif", "transfer-encoding": "base64", - "body-is": "R0lGODlhGAAYANUAACcsKOHs4kppTH6tgYWxiIq0jTVENpG5lDI/M7bRuEaJSkqOTk2RUU+PU16l\r\nYl+lY2iva262cXS6d3rDfYLNhWeeamKTZGSVZkNbRGqhbOPt4////+7u7qioqFZWVlNTUyIiIgAA\r\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAG/8CNcLjRJAqVRqNS\r\nSGiI0GFgoKhar4NAdHioMhyRCYUyiTgY1cOWUH1ILgIDAGAQXCSPKgHaXUAyGCCCg4IYGRALCmpC\r\nAVUQFgiEkiAIFhBVWhtUDxmRk5IIGXkDRQoMEoGfHpIYEmhGCg4XnyAdHB+SFw4KRwoRArQdG7eE\r\nAhEKSAoTBoIdzs/Cw7iCBhMKSQoUAIJbQ8QgABQKStnbIN1C3+HjFcrMtdDO6dMg1dcFvsCfwt+C\r\nxsgJYs3a10+QLl4aTKGitYpQq1eaFHDyREtQqFGMHEGqSMkSJi4K/ACiZQiRIihsJL6JM6fOnTwK\r\n9kTpYgqMGDJm0JzsNuWKTw0FWdANMYJECRMnW4IAADs=" + "body-is": "R0lGODlhAQABAAAAADs=" } ] } @@ -575,16 +566,8 @@ Feature: IMAP import messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --BOUNDARY-- """ @@ -604,7 +587,12 @@ Feature: IMAP import messages "body-is": "Hello World" }, { - "content-type": "image/png" + "content-type": "image/png", + "content-type-name": "image.png", + "content-disposition": "attachment", + "content-disposition-filename": "image.png", + "transfer-encoding": "base64", + "body-is": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAA\r\nAABJRU5ErkJggg==" } ] } @@ -629,16 +617,8 @@ Feature: IMAP import messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --BOUNDARY-- """ @@ -658,7 +638,12 @@ Feature: IMAP import messages "body-is": "" }, { - "content-type": "image/png" + "content-type": "image/png", + "content-type-name": "image.png", + "content-disposition": "attachment", + "content-disposition-filename": "image.png", + "transfer-encoding": "base64", + "body-is": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAA\r\nAABJRU5ErkJggg==" } ] } diff --git a/tests/features/smtp/send/failures.feature b/tests/features/smtp/send/failures.feature index 0adc0ac1..08486f97 100644 --- a/tests/features/smtp/send/failures.feature +++ b/tests/features/smtp/send/failures.feature @@ -30,16 +30,8 @@ Feature: SMTP wrong messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606 @@ -57,12 +49,12 @@ Feature: SMTP wrong messages """ Then it fails with error "invalid return path" - Scenario: Send from a valid address that cannot send - When SMTP client "1" sends the following message from "[user:disabled]@[domain]" to "[user:to]@[domain]": - """ - From: Bridge Test Disabled <[user:disabled]@[domain]> - To: Internal Bridge <[user:to]@[domain]> +Scenario: Send from a valid address that cannot send + When SMTP client "1" sends the following message from "[user:disabled]@[domain]" to "[user:to]@[domain]": + """ + From: Bridge Test Disabled <[user:disabled]@[domain]> + To: Internal Bridge <[user:to]@[domain]> - Hello - """ - And it fails with error "Error: can't send on address: [user:disabled]@[domain]" + Hello + """ + And it fails with error "Error: can't send on address: [user:disabled]@[domain]" diff --git a/tests/features/smtp/send/html.feature b/tests/features/smtp/send/html.feature index 51cd3b3c..bdee2e96 100644 --- a/tests/features/smtp/send/html.feature +++ b/tests/features/smtp/send/html.feature @@ -86,16 +86,7 @@ Feature: SMTP sending of plain messages Content-ID: Content-Disposition: inline; filename="email-action-left.gif" - R0lGODlhGAAYANUAACcsKOHs4kppTH6tgYWxiIq0jTVENpG5lDI/M7bRuEaJSkqOTk2RUU+P - U16lYl+lY2iva262cXS6d3rDfYLNhWeeamKTZGSVZkNbRGqhbOPt4////+7u7qioqFZWVlNT - UyIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAG - /8CNcLjRJAqVRqNSSGiI0GFgoKhar4NAdHioMhyRCYUyiTgY1cOWUH1ILgIDAGAQXCSPKgHa - XUAyGCCCg4IYGRALCmpCAVUQFgiEkiAIFhBVWhtUDxmRk5IIGXkDRQoMEoGfHpIYEmhGCg4X - nyAdHB+SFw4KRwoRArQdG7eEAhEKSAoTBoIdzs/Cw7iCBhMKSQoUAIJbQ8QgABQKStnbIN1C - 3+HjFcrMtdDO6dMg1dcFvsCfwt+CxsgJYs3a10+QLl4aTKGitYpQq1eaFHDyREtQqFGMHEGq - SMkSJi4K/ACiZQiRIihsJL6JM6fOnTwK9kTpYgqMGDJm0JzsNuWKTw0FWdANMYJECRMnW4IA - ADs= + R0lGODlhAQABAAAAADs= --------------61FA22A41A3F46E8E90EF528-- """ @@ -149,7 +140,7 @@ Feature: SMTP sending of plain messages "content-disposition": "inline", "content-disposition-filename": "email-action-left.gif", "transfer-encoding": "base64", - "body-is": "R0lGODlhGAAYANUAACcsKOHs4kppTH6tgYWxiIq0jTVENpG5lDI/M7bRuEaJSkqOTk2RUU+PU16l\r\nYl+lY2iva262cXS6d3rDfYLNhWeeamKTZGSVZkNbRGqhbOPt4////+7u7qioqFZWVlNTUyIiIgAA\r\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAG/8CNcLjRJAqVRqNS\r\nSGiI0GFgoKhar4NAdHioMhyRCYUyiTgY1cOWUH1ILgIDAGAQXCSPKgHaXUAyGCCCg4IYGRALCmpC\r\nAVUQFgiEkiAIFhBVWhtUDxmRk5IIGXkDRQoMEoGfHpIYEmhGCg4XnyAdHB+SFw4KRwoRArQdG7eE\r\nAhEKSAoTBoIdzs/Cw7iCBhMKSQoUAIJbQ8QgABQKStnbIN1C3+HjFcrMtdDO6dMg1dcFvsCfwt+C\r\nxsgJYs3a10+QLl4aTKGitYpQq1eaFHDyREtQqFGMHEGqSMkSJi4K/ACiZQiRIihsJL6JM6fOnTwK\r\n9kTpYgqMGDJm0JzsNuWKTw0FWdANMYJECRMnW4IAADs=" + "body-is": "R0lGODlhAQABAAAAADs=" } ] } @@ -207,16 +198,7 @@ Feature: SMTP sending of plain messages Content-ID: Content-Disposition: inline; filename="email-action-left.gif" - R0lGODlhGAAYANUAACcsKOHs4kppTH6tgYWxiIq0jTVENpG5lDI/M7bRuEaJSkqOTk2RUU+P - U16lYl+lY2iva262cXS6d3rDfYLNhWeeamKTZGSVZkNbRGqhbOPt4////+7u7qioqFZWVlNT - UyIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAG - /8CNcLjRJAqVRqNSSGiI0GFgoKhar4NAdHioMhyRCYUyiTgY1cOWUH1ILgIDAGAQXCSPKgHa - XUAyGCCCg4IYGRALCmpCAVUQFgiEkiAIFhBVWhtUDxmRk5IIGXkDRQoMEoGfHpIYEmhGCg4X - nyAdHB+SFw4KRwoRArQdG7eEAhEKSAoTBoIdzs/Cw7iCBhMKSQoUAIJbQ8QgABQKStnbIN1C - 3+HjFcrMtdDO6dMg1dcFvsCfwt+CxsgJYs3a10+QLl4aTKGitYpQq1eaFHDyREtQqFGMHEGq - SMkSJi4K/ACiZQiRIihsJL6JM6fOnTwK9kTpYgqMGDJm0JzsNuWKTw0FWdANMYJECRMnW4IA - ADs= + R0lGODlhAQABAAAAADs= --------------61FA22A41A3F46E8E90EF528-- --------------5A259F4DE164B5ADA313F644-- @@ -297,16 +279,7 @@ Feature: SMTP sending of plain messages Content-ID: Content-Disposition: inline; filename="email-action-left.gif" - R0lGODlhGAAYANUAACcsKOHs4kppTH6tgYWxiIq0jTVENpG5lDI/M7bRuEaJSkqOTk2RUU+P - U16lYl+lY2iva262cXS6d3rDfYLNhWeeamKTZGSVZkNbRGqhbOPt4////+7u7qioqFZWVlNT - UyIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAYAAAG - /8CNcLjRJAqVRqNSSGiI0GFgoKhar4NAdHioMhyRCYUyiTgY1cOWUH1ILgIDAGAQXCSPKgHa - XUAyGCCCg4IYGRALCmpCAVUQFgiEkiAIFhBVWhtUDxmRk5IIGXkDRQoMEoGfHpIYEmhGCg4X - nyAdHB+SFw4KRwoRArQdG7eEAhEKSAoTBoIdzs/Cw7iCBhMKSQoUAIJbQ8QgABQKStnbIN1C - 3+HjFcrMtdDO6dMg1dcFvsCfwt+CxsgJYs3a10+QLl4aTKGitYpQq1eaFHDyREtQqFGMHEGq - SMkSJi4K/ACiZQiRIihsJL6JM6fOnTwK9kTpYgqMGDJm0JzsNuWKTw0FWdANMYJECRMnW4IA - ADs= + R0lGODlhAQABAAAAADs= --------------61FA22A41A3F46E8E90EF528-- --------------5A259F4DE164B5ADA313F644-- diff --git a/tests/features/smtp/send/html_att.feature b/tests/features/smtp/send/html_att.feature index 5d0a547f..ae07f373 100644 --- a/tests/features/smtp/send/html_att.feature +++ b/tests/features/smtp/send/html_att.feature @@ -29,16 +29,8 @@ Feature: SMTP sending of plain messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ @@ -89,16 +81,8 @@ Feature: SMTP sending of plain messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ diff --git a/tests/features/smtp/send/html_to_internal.feature b/tests/features/smtp/send/html_to_internal.feature index 6a2e2c1f..3d6258c9 100644 --- a/tests/features/smtp/send/html_to_internal.feature +++ b/tests/features/smtp/send/html_to_internal.feature @@ -241,7 +241,6 @@ Feature: SMTP sending of HTMl messages to Internal recipient { "content-type": "application/pgp-keys", "content-disposition": "attachment", - "transfer-encoding": "base64" } ] @@ -279,9 +278,7 @@ Feature: SMTP sending of HTMl messages to Internal recipient Content-Disposition: attachment; filename="index.html" Content-Transfer-Encoding: base64 - IDwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5QYWdlIFRpdGxlPC90 - aXRsZT4NCjwvaGVhZD4NCjxib2R5Pg0KDQo8aDE+TXkgRmlyc3QgSGVhZGluZzwvaDE+DQo8 - cD5NeSBmaXJzdCBwYXJhZ3JhcGguPC9wPg0KDQo8L2JvZHk+DQo8L2h0bWw+IA== + PCFET0NUWVBFIGh0bWw+ --------------2p04vJsuXgcobQxmsvuPsEB2 Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document; name="test.docx" @@ -505,59 +502,9 @@ Feature: SMTP sending of HTMl messages to Internal recipient Content-Disposition: attachment; filename="test.pdf" Content-Transfer-Encoding: base64 - JVBERi0xLjUKJeLjz9MKNyAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnRO - YW1lIC9BcmlhbAovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MDUKL0Rlc2Nl - bnQgLTIxMAovQ2FwSGVpZ2h0IDcyOAovQXZnV2lkdGggNDQxCi9NYXhXaWR0aCAyNjY1Ci9G - b250V2VpZ2h0IDQwMAovWEhlaWdodCAyNTAKL0xlYWRpbmcgMzMKL1N0ZW1WIDQ0Ci9Gb250 - QkJveCBbLTY2NSAtMjEwIDIwMDAgNzI4XQo+PgplbmRvYmoKOCAwIG9iagpbMjc4IDAgMCAw - IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw - IDAgMCAwIDAgNzIyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw - IDAgMCAwIDAgMCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAw - IDUwMCAyMjIgMCA1NTYgNTU2IDU1NiAwIDMzMyA1MDAgMjc4XQplbmRvYmoKNiAwIG9iago8 - PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUKL05hbWUgL0YxCi9CYXNlRm9udCAv - QXJpYWwKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKL0ZvbnREZXNjcmlwdG9yIDcgMCBS - Ci9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDExNgovV2lkdGhzIDggMCBSCj4+CmVuZG9iago5 - IDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3JtYWwKL2NhIDEKPj4KZW5kb2Jq - CjEwIDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3JtYWwKL0NBIDEKPj4KZW5k - b2JqCjExIDAgb2JqCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggMjUwCj4+CnN0 - cmVhbQp4nKWQQUsDMRCF74H8h3dMhGaTuM3uQumh21oUCxUXPIiH2m7XokZt+/9xJruCns3h - MW/yzQw8ZGtMJtmqvp7DZreb2EG1UU+nmM1rfElhjeVXOQ+LQFpUHsdWiocLRClmjRTZlYNz - xuZo9lI44iwcCm+sz1HYyoSA5p245X2B7kQ70SVXDm4pxaOq9Vi96FGpWpbt64F81O5Sdeyh - R7k6aB/UnqtkzyxphNmT9r7vf/LUjoVYP+6bW/7+YDiynLUr6BIxg/1Zmlal6qgHYsPErq9I - ntm+EdbqJzQ3Uiwogzsp/hOWD9ZU5e+wUkZDNPh7CItVjW9I9VnOCmVuZHN0cmVhbQplbmRv - YmoKNSAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVz - b3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA2IDAgUgo+PgovRXh0R1N0YXRlIDw8Ci9HUzcgOSAw - IFIKL0dTOCAxMCAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VD - IC9JbWFnZUldCj4+Ci9Db250ZW50cyAxMSAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAov - UyAvVHJhbnNwYXJlbmN5Ci9DUyAvRGV2aWNlUkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJl - bnRzIDAKL1BhcmVudCAyIDAgUgo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1MgL1AKL1R5cGUg - L1N0cnVjdEVsZW0KL0sgWzBdCi9QIDEzIDAgUgovUGcgNSAwIFIKPj4KZW5kb2JqCjEzIDAg - b2JqCjw8Ci9TIC9QYXJ0Ci9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsxMiAwIFJdCi9QIDMgMCBS - Cj4+CmVuZG9iagoxNCAwIG9iago8PAovTnVtcyBbMCBbMTIgMCBSXV0KPj4KZW5kb2JqCjQg - MCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRub3RlIC9Ob3RlCi9UZXh0Ym94IC9TZWN0 - Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5saW5lU2hhcGUgL1NlY3QKL0Fubm90 - YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9vayAvRG9jdW1lbnQKL1dvcmtz - aGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVldCAvUGFydAovRGlhbG9n - c2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlhZ3JhbSAvRmlndXJl - Cj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlIC9TdHJ1Y3RUcmVlUm9vdAovUm9sZU1hcCA0 - IDAgUgovSyBbMTMgMCBSXQovUGFyZW50VHJlZSAxNCAwIFIKL1BhcmVudFRyZWVOZXh0S2V5 - IDEKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs1IDAgUl0KL0Nv - dW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBS - Ci9MYW5nIChlbi1VUykKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9NYXJrSW5mbyA8PAovTWFy - a2VkIHRydWUKPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8Ci9DcmVhdG9yIDxGRUZGMDA0RDAw - NjkwMDYzMDA3MjAwNkYwMDczMDA2RjAwNjYwMDc0MDBBRTAwMjAwMDU3MDA2RjAwNzIwMDY0 - MDAyMDAwMzIwMDMwMDAzMTAwMzY+Ci9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA4MjAxMjMxMTAr - MDAnMDAnKQovUHJvZHVjZXIgKHd3dy5pbG92ZXBkZi5jb20pCi9Nb2REYXRlIChEOjIwMjAw - ODIwMTIzMTEwWikKPj4KZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYNCjAw - MDAwMDIwMTQgMDAwMDAgbg0KMDAwMDAwMTk1NyAwMDAwMCBuDQowMDAwMDAxODQ3IDAwMDAw - IG4NCjAwMDAwMDE1NjQgMDAwMDAgbg0KMDAwMDAwMTA4MyAwMDAwMCBuDQowMDAwMDAwNDc3 - IDAwMDAwIG4NCjAwMDAwMDAwMTUgMDAwMDAgbg0KMDAwMDAwMDI1MiAwMDAwMCBuDQowMDAw - MDAwNjQ3IDAwMDAwIG4NCjAwMDAwMDA3MDMgMDAwMDAgbg0KMDAwMDAwMDc2MCAwMDAwMCBu - DQowMDAwMDAxMzgwIDAwMDAwIG4NCjAwMDAwMDE0NTMgMDAwMDAgbg0KMDAwMDAwMTUyMyAw - MDAwMCBuDQowMDAwMDAyMTI4IDAwMDAwIG4NCnRyYWlsZXIKPDwKL1NpemUgMTYKL1Jvb3Qg - MSAwIFIKL0luZm8gMTUgMCBSCi9JRCBbPDY2MDhFOTQxN0M1OUExNkEwNjAzMDgxQzY1MTk1 - MzNCPiA8RTU2RENDMTkyRjY1RjAwNzVDN0FDMjE2ODYxQjg1MjA+XQo+PgpzdGFydHhyZWYK - MjM0NAolJUVPRgo= + JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1sz + IDAgUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0 + cmFpbGVyIDw8L1Jvb3QgMSAwIFI+Pg== --------------2p04vJsuXgcobQxmsvuPsEB2 Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="test.xlsx" @@ -717,12 +664,8 @@ Feature: SMTP sending of HTMl messages to Internal recipient Content-Disposition: attachment; filename="testxml.xml" Content-Transfer-Encoding: base64 - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN1aXRl - IFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KCjxzdWl0ZSBu - YW1lPSJBZmZpbGlhdGUgTmV0d29ya3MiPgoKICAgIDx0ZXN0IG5hbWU9IkFmZmlsaWF0ZSBO - ZXR3b3JrcyIgZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgPGNsYXNzZXM+CiAgICAgICAgICAg - IDxjbGFzcyBuYW1lPSJjb20uY2xpY2tvdXQuYXBpdGVzdGluZy5hZmZOZXR3b3Jrcy5Bd2lu - VUtUZXN0Ii8+CiAgICAgICAgPC9jbGFzc2VzPgogICAgPC90ZXN0PgoKPC9zdWl0ZT4= + PD94bWwgdmVyc2lvbj0iMS4xIj8+PCFET0NUWVBFIF9bPCFFTEVNRU5UIF8gRU1QVFk+XT48 + Xy8+ --------------2p04vJsuXgcobQxmsvuPsEB2 Content-Type: text/plain; charset=UTF-8; name="text file.txt" Content-Disposition: attachment; filename="text file.txt" @@ -764,7 +707,7 @@ Feature: SMTP sending of HTMl messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "index.html", "transfer-encoding": "base64", - "body-is": "IDwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5QYWdlIFRpdGxlPC90aXRs\r\nZT4NCjwvaGVhZD4NCjxib2R5Pg0KDQo8aDE+TXkgRmlyc3QgSGVhZGluZzwvaDE+DQo8cD5NeSBm\r\naXJzdCBwYXJhZ3JhcGguPC9wPg0KDQo8L2JvZHk+DQo8L2h0bWw+IA==" + "body-is": "PCFET0NUWVBFIGh0bWw+" }, { "content-type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", @@ -780,7 +723,7 @@ Feature: SMTP sending of HTMl messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "test.pdf", "transfer-encoding": "base64", - "body-is": "JVBERi0xLjUKJeLjz9MKNyAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1l\r\nIC9BcmlhbAovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MDUKL0Rlc2NlbnQgLTIx\r\nMAovQ2FwSGVpZ2h0IDcyOAovQXZnV2lkdGggNDQxCi9NYXhXaWR0aCAyNjY1Ci9Gb250V2VpZ2h0\r\nIDQwMAovWEhlaWdodCAyNTAKL0xlYWRpbmcgMzMKL1N0ZW1WIDQ0Ci9Gb250QkJveCBbLTY2NSAt\r\nMjEwIDIwMDAgNzI4XQo+PgplbmRvYmoKOCAwIG9iagpbMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAg\r\nMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDAgMCAw\r\nIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYg\r\nNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAwIDUwMCAyMjIgMCA1NTYgNTU2IDU1NiAw\r\nIDMzMyA1MDAgMjc4XQplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1\r\nZVR5cGUKL05hbWUgL0YxCi9CYXNlRm9udCAvQXJpYWwKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2Rp\r\nbmcKL0ZvbnREZXNjcmlwdG9yIDcgMCBSCi9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDExNgovV2lk\r\ndGhzIDggMCBSCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3Jt\r\nYWwKL2NhIDEKPj4KZW5kb2JqCjEwIDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3Jt\r\nYWwKL0NBIDEKPj4KZW5kb2JqCjExIDAgb2JqCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5n\r\ndGggMjUwCj4+CnN0cmVhbQp4nKWQQUsDMRCF74H8h3dMhGaTuM3uQumh21oUCxUXPIiH2m7XokZt\r\n+/9xJruCns3hMW/yzQw8ZGtMJtmqvp7DZreb2EG1UU+nmM1rfElhjeVXOQ+LQFpUHsdWiocLRClm\r\njRTZlYNzxuZo9lI44iwcCm+sz1HYyoSA5p245X2B7kQ70SVXDm4pxaOq9Vi96FGpWpbt64F81O5S\r\ndeyhR7k6aB/UnqtkzyxphNmT9r7vf/LUjoVYP+6bW/7+YDiynLUr6BIxg/1Zmlal6qgHYsPErq9I\r\nntm+EdbqJzQ3Uiwogzsp/hOWD9ZU5e+wUkZDNPh7CItVjW9I9VnOCmVuZHN0cmVhbQplbmRvYmoK\r\nNSAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVzb3VyY2Vz\r\nIDw8Ci9Gb250IDw8Ci9GMSA2IDAgUgo+PgovRXh0R1N0YXRlIDw8Ci9HUzcgOSAwIFIKL0dTOCAx\r\nMCAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUldCj4+\r\nCi9Db250ZW50cyAxMSAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAovUyAvVHJhbnNwYXJlbmN5\r\nCi9DUyAvRGV2aWNlUkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJlbnRzIDAKL1BhcmVudCAyIDAg\r\nUgo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1MgL1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWzBdCi9Q\r\nIDEzIDAgUgovUGcgNSAwIFIKPj4KZW5kb2JqCjEzIDAgb2JqCjw8Ci9TIC9QYXJ0Ci9UeXBlIC9T\r\ndHJ1Y3RFbGVtCi9LIFsxMiAwIFJdCi9QIDMgMCBSCj4+CmVuZG9iagoxNCAwIG9iago8PAovTnVt\r\ncyBbMCBbMTIgMCBSXV0KPj4KZW5kb2JqCjQgMCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRu\r\nb3RlIC9Ob3RlCi9UZXh0Ym94IC9TZWN0Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5s\r\naW5lU2hhcGUgL1NlY3QKL0Fubm90YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9v\r\nayAvRG9jdW1lbnQKL1dvcmtzaGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVl\r\ndCAvUGFydAovRGlhbG9nc2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlh\r\nZ3JhbSAvRmlndXJlCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlIC9TdHJ1Y3RUcmVlUm9vdAov\r\nUm9sZU1hcCA0IDAgUgovSyBbMTMgMCBSXQovUGFyZW50VHJlZSAxNCAwIFIKL1BhcmVudFRyZWVO\r\nZXh0S2V5IDEKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs1IDAgUl0K\r\nL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBS\r\nCi9MYW5nIChlbi1VUykKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9NYXJrSW5mbyA8PAovTWFya2Vk\r\nIHRydWUKPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8Ci9DcmVhdG9yIDxGRUZGMDA0RDAwNjkwMDYz\r\nMDA3MjAwNkYwMDczMDA2RjAwNjYwMDc0MDBBRTAwMjAwMDU3MDA2RjAwNzIwMDY0MDAyMDAwMzIw\r\nMDMwMDAzMTAwMzY+Ci9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA4MjAxMjMxMTArMDAnMDAnKQovUHJv\r\nZHVjZXIgKHd3dy5pbG92ZXBkZi5jb20pCi9Nb2REYXRlIChEOjIwMjAwODIwMTIzMTEwWikKPj4K\r\nZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDIwMTQgMDAwMDAgbg0K\r\nMDAwMDAwMTk1NyAwMDAwMCBuDQowMDAwMDAxODQ3IDAwMDAwIG4NCjAwMDAwMDE1NjQgMDAwMDAg\r\nbg0KMDAwMDAwMTA4MyAwMDAwMCBuDQowMDAwMDAwNDc3IDAwMDAwIG4NCjAwMDAwMDAwMTUgMDAw\r\nMDAgbg0KMDAwMDAwMDI1MiAwMDAwMCBuDQowMDAwMDAwNjQ3IDAwMDAwIG4NCjAwMDAwMDA3MDMg\r\nMDAwMDAgbg0KMDAwMDAwMDc2MCAwMDAwMCBuDQowMDAwMDAxMzgwIDAwMDAwIG4NCjAwMDAwMDE0\r\nNTMgMDAwMDAgbg0KMDAwMDAwMTUyMyAwMDAwMCBuDQowMDAwMDAyMTI4IDAwMDAwIG4NCnRyYWls\r\nZXIKPDwKL1NpemUgMTYKL1Jvb3QgMSAwIFIKL0luZm8gMTUgMCBSCi9JRCBbPDY2MDhFOTQxN0M1\r\nOUExNkEwNjAzMDgxQzY1MTk1MzNCPiA8RTU2RENDMTkyRjY1RjAwNzVDN0FDMjE2ODYxQjg1MjA+\r\nXQo+PgpzdGFydHhyZWYKMjM0NAolJUVPRgo=" + "body-is": "JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1szIDAg\r\nUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0cmFpbGVy\r\nIDw8L1Jvb3QgMSAwIFI+Pg==" }, { "content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @@ -796,7 +739,7 @@ Feature: SMTP sending of HTMl messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "testxml.xml", "transfer-encoding": "base64", - "body-is": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN1aXRlIFNZ\r\nU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KCjxzdWl0ZSBuYW1lPSJB\r\nZmZpbGlhdGUgTmV0d29ya3MiPgoKICAgIDx0ZXN0IG5hbWU9IkFmZmlsaWF0ZSBOZXR3b3JrcyIg\r\nZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgPGNsYXNzZXM+CiAgICAgICAgICAgIDxjbGFzcyBuYW1l\r\nPSJjb20uY2xpY2tvdXQuYXBpdGVzdGluZy5hZmZOZXR3b3Jrcy5Bd2luVUtUZXN0Ii8+CiAgICAg\r\nICAgPC9jbGFzc2VzPgogICAgPC90ZXN0PgoKPC9zdWl0ZT4=" + "body-is": "PD94bWwgdmVyc2lvbj0iMS4xIj8+PCFET0NUWVBFIF9bPCFFTEVNRU5UIF8gRU1QVFk+XT48Xy8+" }, { "content-type": "text/plain", @@ -861,159 +804,20 @@ Feature: SMTP sending of HTMl messages to Internal recipient --------------pXWj190lQsd0d77xbCjkhoss - Content-Type: image/png; name="icon_1.png" - Content-Disposition: inline; filename="icon_1.png" + Content-Type: image/gif; name="icon_1.gif" + Content-Disposition: inline; filename="icon_1.gif" Content-Id: Content-Transfer-Encoding: base64 - iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAh1BMVEX///8AAAABAQGbm5sP - Dw/b29snJyfFxcX8/Py8vLwfHx+5ubkjIyPY2Nijo6PQ0ND09PTh4eFBQUHq6uowMDDKysr2 - 9vZmZmY5OTmUlJQJCQkrKyszMzNZWVkUFBSurq6NjY1xcXFRUVFGRkZVVVV6enqDg4Opqalj - Y2NsbGw9PT13d3eIiIj8E2A4AAASV0lEQVR4nO1diYKiuhIlgBK1FRBQcMF99/+/75E9QVHR - AM591sxot4NJTqpSW0JhGNUSzP5C6LV61m4+nKYTc2L/zTbHndVreSMIK+69BhoFfmSdYnCX - wuOy0wq8fxhm0HeW2y5BY+aJwTyvDm7La3qo75DvDFYzGVz2A0NlAgWnvd4von8IJBI6r5Mc - 2wzdfREVrCWsPFnuvyGuaJSt5BiK4T9ESC8jIMeDgLbwvYRGF52mE2ncLxFlpT279I1vx9gJ - +VrLITBvMMkf8Z/PTtMQHpHXi8lg1bHLv0wmtj25/5/se8Pet2qdoLcmvDMZFwWb0nAzH1/2 - yySxLCtZ7i+n+SZMFRFlILO3bS9oGswdGvXGsjhKUjib761Fx/UVzox8t7PI/JyQsxJfzb41 - /j4+uvtUyBweL/6xe0x6kV84Wq8V9ZL5RAFJvmrvojqH/4SgEVhDaU0xfH+rXj8YPfv2yO8v - jrayfvHX4+SLRNVFbOAMpOMcdxC6lzQ/9PzFRv4uaWv9HWoVGiNLqHuqKkB48IyShs3fpUBp - KKP96BuMY7DJz314Qmuo3NDQ1XCw7vJGyFyFfiVjLkMjxxbqHr9trq7xll+SfWW0OP1xeSfN - LhpWqoFlqgyMkzfxGeRrXu9kqmy8NqhwMh26m1CAZMK71891fLCYM7tIIJ5aTS1GaPhHvAS5 - oh87T23DK+QP2kBMXKZTo2YgQqM1pGuPzHVX25KB/SN3/9C/aacJiBnACR0A4eNc63o5cM1F - 9E39EKHRp8jIELoHzXEdNkIEIsAQa6fIlgHO+5qbhwbc/8kQD3UzMZoxXZD96e6DCqQILs40 - GsN9HLRosZfJ3RCAuPPpwKtkmcBozR3yrJdenVz015ISnXYqm11/zsxR9mfm1KdugjnTc9mf - VPcSlMmbc//GBLFfF0S4kgCCKpYg78mAW8loxPUAhMaV2kHsh1azBKXuTtJ0birtivVoOHxW - s0CiSg4S8lZsQrM/yzrk1O+yxZ8B7NfQY3BiKbzspVN5d0ZwZHbCBMNXIwkyDTDoR07HifoB - lD59TkijErVtgnOr/JDLEUwmfELbr00oBhI4h2Q/Xp+n7el5Pd4nByfg//eU+mchNquqw0Un - 5J4MGLwwPnxJf3DZxl0gUzfeXgZ9fsWzXkWUZh8+Gv9TyiJCkyFcPb8cjd5P1lNbZLel/Qp7 - uk584wWM0BgI9R27n8N40JXFc2Fg9tIXehvGNWVrRvyyWbwkCWM6s2bFcuqm3FB0n9sJGFgp - Cz5ut9p4Osa2gucg4VmYqJ4eMPdodOIzOek9AwhbVltO1t8hlv3/S/rPGjPcLoc4qy7F2OP+ - Nrg+87Zbg7O6b2ia0jqUPiUpOuuZFWALBF1+1QUoT6OQ97F+Mo3wsGXySUVSUjEMpQCZvW6f - hbjBmOtTUI1RhIbFu+g+UQ/9i63sRKnbpAKXvBMzWT0JUjpTbqiOGnFJ5HUBm/rLYxldnOWd - KM6t88nquf1okbAjREJa8dXnJ8mYK9NPAFSRX4TGnnfw2CR5V2EPOIJ1ohwmGbnJWswAf90/ - zEe2NpyJcy2Y8u2HPIe5fHjdnDOH8HESHg9k5PQcG33zDsdQnNogrN4+XGEW8xhBtwqLIWTk - /MjkujHbqSFv6TwhzpkqVuTXfjJPgXL9Q/EYMSYCcNIvpS3R+iPP0O1KOzXZy3hRfAoIfRos - TrKkmiAthgiRuaJMDPWHUZmEUO0XPpg+Z6rs1GxeOFSBj3CYTLVmEcujnd8hN8h73ekvsgmD - G3+QYXdiliZGF6ZPzTht20qZxqU5tULq8FGcdTvgnQlrOiyePHfD16qJtoxeXSs4MWryVTAs - HvxoyJI2L8VuJcjb8ZaLWehvZYC7MjtRWfsSxHUx73ucic/cqpJEgwqk7ApXVrCSEn/dsoHq - 4Y/vg2SasriTDZ9qrSc1MrdXCEcBC3nsiABOy6s6pKT495MiOYEHzsSVzvPTARf/sNB5dLiv - aYJh+fmFhjMUxr+YQa2Y7VmmOsU04hNX6FcFs48AIojRRjQRFskp8gnpWA7anFNocD2TFnpL - e2kLpfNez7ATM4tugl3RVZ0uY6LGDDhM2bTN70tGNv/MIchm4e3NTLjo8qjKLNppwskwMhP6 - xNTheZak6JI596fA8oOelqKZbdE1CY9JLE1iCo0jk4tCb3Bg85GNP+kV8gw+sK2Ca5wZG85L - 6b6XiPozABwL9AzdUMQq4pOtDGi0Zjx5tS1QNp44iqInryg2m4oF8JDyTgcfdnbgfpFd1NSS - R84DTWK6Z3qmaKMCJYnoJcOPe9vwto4FmsRpMwdr/HFvhNaswWGBkHa4rgWfe/wueGaaWCBs - ov1ZHdSfsi4Ldiq8PTfCH6kZTBCeuDUoct5XTNX86Ti8APEiexhWoCmgV+g4tdAHrLn23eag - sWDWa1JovUrRji/s+1OqOMOfdwe9y7MY0AMs0Dp93h8+8EGNxbnggq3mgEZ4wesCc3DWGiS6 - ZyY0+/tC6vMBFfh0ZUnyy+6GwpBqd6ApIbX4Y0J695Qn2r3UnFiAAz5nd/0yiNM1WEwLbWYZ - SpgFvr8MYeaSMp9OV9Qdcb9sfV9sxELUsA012lFHF4QFFwhToWtzNhAGo0B1hUxMi/MdL5M/ - ZwBO9+czeh54lCYWPhToLmjwKVh/bp+imCG86wRKy3Cqby+hM32yEEWnn6+Mzh8LLArML+/s - QZqzLPU3DxES1454NZ8rU4HwrimoBqH7DGHrn0c4fIKw/0NYgr5TSv99hP99Hv4Q/hCWoU77 - P69pGkH43+fhD+EPYRn6aZofD9+i/wOEXyulUA99Kw83+m61bH0nD0Or09NDHSv8QoRV0Hch - 1AzT/D4emtINI5/TNyKsgn4Ia0FI9i2qgfjgjGKtCEfoIIbGJSgvRmAXHLnWidCZMoRFR5Oj - ShhIqGjfpV6Ehrudtqug6brQ060ZoQH7ThX04LbLuhHWT/Uj1BRU5EKMb0JYN/0QlqEfwmao - GoTNF9oUpHMfXyCssJRBSULnL03tCE3QrrTkRimK/tgp4RcryDxsLKZHyEwwrLKqVxni9Wq0 - nIkKaCUq9E9DczrIXZNlg2Rrr+E4JLvTALW3+QZBJXeqkkSHnuOQKyAgajhG9ik5bRoco/Ho - qQHib5jUo9s8es0+/gb2WGVm9DLXdEO3w+6Hw0CtJoszexZWelS7h9qckB6pJEbmDeyaM/3+ - jo4Bv3Y1LpkFg4il/9hUUf+I3jZAjJfe2hgLG0jFmeNXqldpJ7iIaf94Ieou/tFLmQZDL/a+ - 6oKQeYKGt7c5QFBFdZPODIjdBACGtdUSxQSRRpf7f1Ra4l1CnoQpugC1Fr2FPSAAIu+qEtfD - H0uKLHtb1lfwPliyTskIxpWo82wlXCcUItGsx2dV1nRRn1W3JwAn14q0ADTgIRQOhYlKV9VR - gXq0GAK52/AAq9MB0FnLPgX4q2o2RY+Z5PwBwGJUtASdSnuEOJgSS97cVqtToRFsTaHgTHQb - UOVLw1LWhOYiKjfkcB1Kei26SV8ruSFQFM61wmrXS3U6w1ri00xwTqkiOGO/GowQ2yexJNJT - 9ZWnScfGyJopi39TifXH1V0ZQOTGWDU+G0nSqViBTxPdOjXTocmU24jKdagf3fgQ/kVdISfd - XoZ/Ulf75XYIka4A2L8M4+ElbxW8gepInfUWwevwB7kRDg7UzAJEo5oNL1ow9tc45mz38sUB - I8kZzgaR6ruF1DCSVGoboGqeMmXj6OEHuWo5LTi6MFaN1bUGSRkVaZ6LKnWUJvqUJS4fx5ue - 2bMWddQ4iM6kKZzWV9xQpAzaIijN/sZvFohSCZWLMqWMQjuvxkZumx1vAfHnGZXOH0tOZp3m - H0kIOxumcGgi7vOIKpDSadgU5actSFgJepTL0HffExHVcZTz6/srxe8Hp0+9jv5JbVCtLpz1 - Ho35aIBOhGxJxFYOojTl4HPrT608KBCKrG+LpaOAfoSkZTuvT6DTVsxG9/qub5X5g9eukkdo - 5628f7QFvgoQUggLxW5Ao7UVdgP99GZEBUnxTLaqAa4qrHRk9P6ADLAChHTx50s1jJa2kid6 - 7wFb8AAEA7MXe5nLIHgn7kdViRB3cc7rt17OBXmjREYutgbDXEIUOmdpxetHaIq1hv7aebPQ - l9xIbKdKPgpxxOwud3Rz3kpAS/HyNapblzL7xLX4OBfbe0lXUjjIiSvDxiBJlW93k5yv4oyF - EZEHpJOHIBZCgl6n+Ue9KeEctZ0vUjRWHYdNTkJHhykQXbOxaEfoJkAVpJVaQBC2VupKmiWv - PEUmuyKZqat41VLdUOpW8CUAErcShD50UjUojPPKwALsBAEGOimqZKVQsJYSzdjK59VYLLpF - b6kD/UoQtujDpeSo5pKz7u5UmgP0+ryO00BcjL85Vfy+zAu45PpEtqpVEUKU9Y5VgWq7qkAZ - p1SMF4dUrUeCCltHle3pWJVsSOeMi36M/Y2qECJyc2ZB9RyzwR1ypnF6KBbV4JAb/zD3OFPs - 9SpGhHC4SoSGZ/2peu3oqlxyVxOhGLELVJQ0dlaABkFEQicrNTKBrgiF8esfS2ZUijD7aK7a - plh5Sme2cgayL47YmNyL/n0rBMp17UGgtOMNuIEil805nIoRGv6SG16yeHIPlh7R3VQhXPOb - nX9IH04txH2tphCMFk88U5hLMU9VI8xi+1BScMj0qfEGLvgpZDl7645dcQVEXl5XAohelUrh - 2RUL2UgCVEBQ6qByhPghgYppvCkHG7VzSn6SWRb0aBJ0piq42EAdfzufbzkBIHEwW+2Kvqoe - IdKZXXUI7Ui1G94+zXEJrPxRhnDkYwuncHiXy6ZFbXUC84+MroGHBtp7nkhsyDRh3m70thwi - W5XHg3M4il/p/287ORm3JkLHZq+TYz4tWgtClEzM+ZPjSB2pv+SGhUc+6s+YP0tfaZb54WKR - 3+6K1MPDTOAc/uQjwpR4kIs3OiRpzCyLKV7458fcGEeDWDVGc+d2374ehIikYyA03shdFRxC - YdWpL8e5d8/jaeV9pruHWupDaIyciaoTNrlHi8HWjnydQeNA0Qe7vNe6GAqA6IpJdDdXUCNC - iOsMy2bBvnkERjTkRltaiNnbOW8i8Nk12cTMCzZFa0SIbTPP8ZFhzW6e+9aLxePH2PvkJrpE - tWcFQGSAcn5EMwhxDE7shnBE85nqLAqc/7Glha/rblHR4dvsudQKshFFkVe9CJGvbU1Vu5Ez - YNlAvcVlyKV0eFl4efb0c0+km1oPcuc1I0TkzAUD0DDDxc3G3sg97LbxNF7vDrfqw1uEbHXS - OOLhOZ0GENJ4Q7DR3t253mu5rtu6wZ7F7DtbYqCpxBH3qAmExqgz484KP4PySj4R8kQkd3dm - nSf55EYQkgOoit3YvZhN3OVsxPPjow0hzOINKSRAb/YrBwlaqfqlvxceaNYYQqIQlTzVs5ME - 5NSK5BTNX5qVxhAa8Cry7/jv+OFBYoh3dIBIiExfOwfYHEKkNXJ5qvOhmI0eTj3KuaabUzv3 - qUEeGshu2Er8aq/QKG4yUajti3TIEVmY66sncppFaIx6obq0wgsy39JNb/jH6KIcVEVl61/e - c2wYoQED4YERoO05kVWaiULH0+dT/r800i1xvrlxhPistOKoogcD82DXWxxTzjl2nfXaCiTU - NEJEfWnPjMeGs9XBOVxioHyKsxolbzH+AoRZZLycck8V8GMAgEWIYp1iG1HyBO4XIDRQYlyY - fxmkgMckdFv6xN93ICTxhpxGNGl+TQadvS3Lt/wtCI0RfpSxnCoVZNI7Rdb3c02P6WsQoieL - 82P9Kj76b7Z467zmFyFEli9mmIR00h/jd28N+yqEBtoVnqVchzLdk85W759F/S6ESE8Gi912 - ZnMZtWfbHRbPd8+ifhdCiiNwBtfTetaercfXgRPwz9+ib0PIKeg7Haev4e7ar0WojX4Iy9AP - YTP0Q1iGfgiboR/CMvRD2Az9EJahH8Jm6IewDP0QNkM/hGXoh7AZ0olQ1BHu1Fxmr5ig0WPn - djQUVBWPz5p/C8AM4pYh1PAotGBMDxIAUOqu0CqJnEzG/9644fiGlmITZX5NrOYpuc7Fds/y - c4DoWfWAMhGAid08TejOFRpVqKMqDhzTvRTzzhZZM0SP64DbO3XeI0fcNPFNhI9Ja6qGm3wt - Qm1ljU7fCDEb0EoXQHyzccFedRPEVPtOY91tb9BVtzebhEdH0R1oLSwO3QvtoFl8YgQXV7eL - BYPFOEzNxiFmI0jD8eL1M3D/A1pNGGh1w+TvAAAAAElFTkSuQmCC + R0lGODlhAQABAAAAADs= --------------pXWj190lQsd0d77xbCjkhoss - Content-Type: image/webp; name="icon_2.webp" - Content-Disposition: inline; filename="icon_2.webp" + Content-Type: image/png; name="icon_2.png" + Content-Disposition: inline; filename="icon_2.png" Content-Id: Content-Transfer-Encoding: base64 - UklGRpYKAABXRUJQVlA4WAoAAAAYAAAAfwAAfwAAQUxQSMQFAAABsIZtm2k70ltVO+e6Oj6K - 829st23btm2Mbds6O20EY1ttKxxPO9r14R0drFqVnzNXREwAig+dCAAztjj2ndf+9MG/9fKT - j//65g+eut0QAMROQOVTBDCw+1uXruxxnPnP33/v/sMIiKliIQVgzvHX/YX/6aruTtLdxPif - T9xy6gIgpFCnkAIm7f6NJ+j0rM7xupsYnU9dt08fQgoVShHTT/8DSRXnhLsqybvPnoGQahMj - pp63nDRxNuxizpUXTkOMNQkJOOxBuhqLNHU+fERACtUICS/+Dl2NxZo6v/sSpFCJFHDBc1Rj - 0aZ87kKEVIUO5i6mCosX5eK56FQgYfPlFGcLPXP55kitSzh6HYUtFa49CqllCRdSla1V5QVI - rUq4kmpssSmvQGpRwqVUY6tNeQlSaxJOpRpbbsqTkVqSsHN2Y+vNezshtSLi+WuorKByzfMQ - WxDQ9zMqqyj86SSE8hLezcxKCt+FVFzCjjRW07gjUmEBk2+n1kP5h80Qykq4hsKKCq9GKiri - +U/Sa+J84nkIJSV8gcKqCj+PVFDEazK9Ls7eaxBL+gqFlRV+uaCIF6+j18a59sWIpSS8l8Lq - Ct+DVEhA/0pafYwr+xHKSDiWygorj0EqI2BxrRYjFBHx/LX0GjnXPg+xhA7OpbLKynPQKSFg - Sb2WIBQQMO9Jep2cT85DaC7hEBorbTwEqYSPUGol/EgBAfGXtFoZfxkRmlvwDL1WzmcWNJew - J53Vdu6F1FQHl1LqJbwUnaYSvly3LyM1FdGl1kvZRWxupG4jJXTr1v1/aL5JqZfwG8118Cbm - emW+EZ2mIp7/NL1Wziefh9gUEq5grlXmZUhoPuI69urUYxcRBQZM+zFzjTJ/OBWhBET0/4DZ - a+OZ35+JiDIjplxHsbqYcNFkRJQaIz5AtZqY8v2IEaXG1OnDaesp9RCuPw19nRQLiQAQ8YZH - KF4HFz7yBkQAiEVEbPHhr10xFxi6nmo1MOX1Q8C8K7/24S0RC4i4mDSu2QURF22ktE/ZuxgR - u6+hkZcgNhaxPT1LplyBiK0epXi7XPjoVgh4ozFLdm6P2FTCp9kjacrF84Dhm6nWJlPePAzM - Xkw1kj1+GqmpiBuoJOnClTsh4gqhtEepVyBim8cpTpLK6xGbG/lvpFCvQMQOKyjeDheu2BER - F2cK/6typITuaDTl9UPA3KVUa4Mpl84FBq+jGkfrlkUXPrI5At5oLuWJ2xsR8IaHKc7WkMIN - 5yFit9XMXpYLV++KiHPXUzjGNtCU3+gHFnybaiWZ8tsLgP6vU5Uto2U++HqE+EajlCPUN4aA - 197PbGwdXbj+XETstJziZbhw+Y6IOGc9xVkBUpXdQWD2TVQtQZU3zgYGvklVjrc1NOHDWyHi - vLUUb8qFa89DxJYPMxurQSrzFSHgVXdQrBlT3v4qRFzWo3ICCxmZGJpy2UJg8gdJ8YlzIT8w - GVi4lKqsDF34p4MQsftjVJsoUz62GyIO+BPFWR1SnJ+YDgx+ni4+ES7OLwwC0z5OF05w22jK - B7ZGxN6PUWV8onxsH0RsfR/VWCm6ML9rMtD/oUzVsakyf7gf2OydmeKsFqnKO7dGxOY/pquN - Zur88eaI2Op2qrLBGtCF8qF+hHjEfXQTc7dszvuOSAEzPygUZ+VIVS4/IgRMPukPHPX2UyYj - hMMfpyqbrQRdnd/fEgGTdvn4b/78l99+Ytc+BGz5Pbo6NwmkKWXR6wGgb2CgDwBe1xWqsfF6 - kGqUxQf347/2H3RbpikLrAldnFyz6PJjjrmsu5p0YZFVIV2Mo5o4N0EkXcRMxFlsfcr/XwAj - m7xuCV+n1Ev4VaSmOng3c83ehE5TCftS62W+M1JTAVMfpNXKeHsfQlNIOIc9r5NnHo+E5gO+ - zZ7XyHq8AQFFzP41Ta02psYf9ZeBgGkfXEcnvR5OOte+ezICygwRL3vfb56wmtgTv3nPSxAD - JhJWUDgg6gMAANAXAJ0BKoAAgAA+bSyVRaQiopj6dUhABsSzgGjQ/lwodk0jhPEboQRVkTKl - hqPjr+quAmmHfoysvUbx11NUSGkZu+ugEifSaPs8FBtkw+aWfnkU2tGTkaJ2nsy2FRPQXPMT - 1T79MxRTfG1KqoiPDVNVVzve6iRgvBGlSoWnwsHH34JedDZGtTWKsV0C6dzkP3zyk/c098vd - IEhAh1qqkDEBgQ3YoqaaW0USQejZdnpofDcr08bBi4hLkJWU1iI5NRjds49JjkAA/vz4QLwm - CqF1LvvDPAPnZxiIoDppKU4DZS52WwalyEqhPVjFxuX+OHn63YM8p+qktofqY6DW8yQcUJpf - WGQNn5aAl4ScDiAWyCY5NeamY+nS2IkokjdoKfoJpq1vK1JrJR6HiGS5Hngp/QvKLcpyZx+K - Yh+z8Vm+OLsFMGQNTioflpIAtTXB9aHy4Pbqcj4D3A2S1MBTxZgdwdXc9vYEnwn5Usn2jq2F - AU4ZLrWuU1THffKI3/J+sJo0yRhDAq0gUSe29Yole3GqgW2BviWafja+YrhOoDCA8tx5Pkzj - rmnhcqmHg6LumXDnBf8b6M8M/IxZbpSDXeMr+ZczwF8lbSDpbceEGyMSQuUXtT+3P5ZUvnft - KUjDkvXBNt5RdKeOPh/7/t8X0VhSFv8yv6hQqv1Sic8+gfVpJduCq+bmMkYSx5aNF1bl3xgA - joyk4v+AdvfJGRYFIY4tcxORTmkkopB1nrvxwyEzPcC2kLuIVy1j7eTYRrXmAcN/sCCHKw8g - C1snzbXcG/Am8c+t399S8r1RA4y2OzfH1OjP//YdfwT5sohaW0G5g++4pNga2pZTTIi0VipX - RZoJylnTrlEX9QPscrVfxWEP8fhADOJBmXIVINvcUYk65xAc4VlnpplTseD4IPXHqZOibz0Z - 7J8N5r0O+WBJlZQxrEyeIRgt9mGr1VunXurEhKNfak3y9vacdAXOX/fQDkLDuZfsAXvN8GAi - xGDH7QQE9iNkgc9gCRl44cekH8ocrEbLKyw5DV3oGgw/CRl3LmX7LdfK7yhfCPReRj0j2XKq - JUsGJhbS5nIAzHTDDH6MfnVUE6hlQeTAludD3dWF4c1DK0OA4YGs/EbwMEO/0aC0hXoTMFTY - /FA8PsFrlueEvzp5Xe9SsHw9ZqJKyuCMrPRc27YdiXo3CaUDSGUe7id0gmkzGjKFq/sBPueC - igWDx5eLWBwZ6J8UIahsInKSGxmKN4sESFNYWXO9lA/QJfHtUX8VGY7vWlyUK5pJM+ScoQnB - jBFqcPhfI5pjIW6sLdRnN/zwtJ5H7ZkwQ16syVzN98baLodS2gwgAEVYSUa6AAAARXhpZgAA - SUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQABAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAA - AgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAAAABIAAAAAQAAAEgAAAABAAAABgAAkAcA - BAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDABoAMAAQAAAP//AAACoAQAAQAAAIAA - AAADoAQAAQAAAIAAAAAAAAAA + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --------------pXWj190lQsd0d77xbCjkhoss-- @@ -1049,20 +853,20 @@ Feature: SMTP sending of HTMl messages to Internal recipient "body-is": "\r\n\r\n \r\n\r\n \r\n \r\n \r\n

Inline image 1

\r\n

\r\n

Inline image 2

\r\n

\r\n

End
\r\n

\r\n
\r\n \r\n" }, { - "content-type": "image/png", - "content-type-name": "icon_1.png", + "content-type": "image/gif", + "content-type-name": "icon_1.gif", "content-disposition": "inline", - "content-disposition-filename": "icon_1.png", + "content-disposition-filename": "icon_1.gif", "transfer-encoding": "base64", - "body-is": "iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAAh1BMVEX///8AAAABAQGbm5sPDw/b\r\n29snJyfFxcX8/Py8vLwfHx+5ubkjIyPY2Nijo6PQ0ND09PTh4eFBQUHq6uowMDDKysr29vZmZmY5\r\nOTmUlJQJCQkrKyszMzNZWVkUFBSurq6NjY1xcXFRUVFGRkZVVVV6enqDg4OpqaljY2NsbGw9PT13\r\nd3eIiIj8E2A4AAASV0lEQVR4nO1diYKiuhIlgBK1FRBQcMF99/+/75E9QVHRAM591sxot4NJTqpS\r\nW0JhGNUSzP5C6LV61m4+nKYTc2L/zTbHndVreSMIK+69BhoFfmSdYnCXwuOy0wq8fxhm0HeW2y5B\r\nY+aJwTyvDm7La3qo75DvDFYzGVz2A0NlAgWnvd4von8IJBI6r5Mc2wzdfREVrCWsPFnuvyGuaJSt\r\n5BiK4T9ESC8jIMeDgLbwvYRGF52mE2ncLxFlpT279I1vx9gJ+VrLITBvMMkf8Z/PTtMQHpHXi8lg\r\n1bHLv0wmtj25/5/se8Pet2qdoLcmvDMZFwWb0nAzH1/2yySxLCtZ7i+n+SZMFRFlILO3bS9oGswd\r\nGvXGsjhKUjib761Fx/UVzox8t7PI/JyQsxJfzb41/j4+uvtUyBweL/6xe0x6kV84Wq8V9ZL5RAFJ\r\nvmrvojqH/4SgEVhDaU0xfH+rXj8YPfv2yO8vjrayfvHX4+SLRNVFbOAMpOMcdxC6lzQ/9PzFRv4u\r\naWv9HWoVGiNLqHuqKkB48IyShs3fpUBpKKP96BuMY7DJz314Qmuo3NDQ1XCw7vJGyFyFfiVjLkMj\r\nxxbqHr9trq7xll+SfWW0OP1xeSfNLhpWqoFlqgyMkzfxGeRrXu9kqmy8NqhwMh26m1CAZMK71891\r\nfLCYM7tIIJ5aTS1GaPhHvAS5oh87T23DK+QP2kBMXKZTo2YgQqM1pGuPzHVX25KB/SN3/9C/aacJ\r\niBnACR0A4eNc63o5cM1F9E39EKHRp8jIELoHzXEdNkIEIsAQa6fIlgHO+5qbhwbc/8kQD3UzMZox\r\nXZD96e6DCqQILs40GsN9HLRosZfJ3RCAuPPpwKtkmcBozR3yrJdenVz015ISnXYqm11/zsxR9mfm\r\n1KdugjnTc9mfVPcSlMmbc//GBLFfF0S4kgCCKpYg78mAW8loxPUAhMaV2kHsh1azBKXuTtJ0birt\r\nivVoOHxWs0CiSg4S8lZsQrM/yzrk1O+yxZ8B7NfQY3BiKbzspVN5d0ZwZHbCBMNXIwkyDTDoR07H\r\nifoBlD59TkijErVtgnOr/JDLEUwmfELbr00oBhI4h2Q/Xp+n7el5Pd4nByfg//eU+mchNquqw0Un\r\n5J4MGLwwPnxJf3DZxl0gUzfeXgZ9fsWzXkWUZh8+Gv9TyiJCkyFcPb8cjd5P1lNbZLel/Qp7uk58\r\n4wWM0BgI9R27n8N40JXFc2Fg9tIXehvGNWVrRvyyWbwkCWM6s2bFcuqm3FB0n9sJGFgpCz5ut9p4\r\nOsa2gucg4VmYqJ4eMPdodOIzOek9AwhbVltO1t8hlv3/S/rPGjPcLoc4qy7F2OP+Nrg+87Zbg7O6\r\nb2ia0jqUPiUpOuuZFWALBF1+1QUoT6OQ97F+Mo3wsGXySUVSUjEMpQCZvW6fhbjBmOtTUI1RhIbF\r\nu+g+UQ/9i63sRKnbpAKXvBMzWT0JUjpTbqiOGnFJ5HUBm/rLYxldnOWdKM6t88nquf1okbAjREJa\r\n8dXnJ8mYK9NPAFSRX4TGnnfw2CR5V2EPOIJ1ohwmGbnJWswAf90/zEe2NpyJcy2Y8u2HPIe5fHjd\r\nnDOH8HESHg9k5PQcG33zDsdQnNogrN4+XGEW8xhBtwqLIWTk/MjkujHbqSFv6TwhzpkqVuTXfjJP\r\ngXL9Q/EYMSYCcNIvpS3R+iPP0O1KOzXZy3hRfAoIfRosTrKkmiAthgiRuaJMDPWHUZmEUO0XPpg+\r\nZ6rs1GxeOFSBj3CYTLVmEcujnd8hN8h73ekvsgmDG3+QYXdiliZGF6ZPzTht20qZxqU5tULq8FGc\r\ndTvgnQlrOiyePHfD16qJtoxeXSs4MWryVTAsHvxoyJI2L8VuJcjb8ZaLWehvZYC7MjtRWfsSxHUx\r\n73ucic/cqpJEgwqk7ApXVrCSEn/dsoHq4Y/vg2SasriTDZ9qrSc1MrdXCEcBC3nsiABOy6s6pKT4\r\n95MiOYEHzsSVzvPTARf/sNB5dLivaYJh+fmFhjMUxr+YQa2Y7VmmOsU04hNX6FcFs48AIojRRjQR\r\nFskp8gnpWA7anFNocD2TFnpLe2kLpfNez7ATM4tugl3RVZ0uY6LGDDhM2bTN70tGNv/MIchm4e3N\r\nTLjo8qjKLNppwskwMhP6xNTheZak6JI596fA8oOelqKZbdE1CY9JLE1iCo0jk4tCb3Bg85GNP+kV\r\n8gw+sK2Ca5wZG85L6b6XiPozABwL9AzdUMQq4pOtDGi0Zjx5tS1QNp44iqInryg2m4oF8JDyTgcf\r\ndnbgfpFd1NSSR84DTWK6Z3qmaKMCJYnoJcOPe9vwto4FmsRpMwdr/HFvhNaswWGBkHa4rgWfe/wu\r\neGaaWCBsov1ZHdSfsi4Ldiq8PTfCH6kZTBCeuDUoct5XTNX86Ti8APEiexhWoCmgV+g4tdAHrLn2\r\n3eagsWDWa1JovUrRji/s+1OqOMOfdwe9y7MY0AMs0Dp93h8+8EGNxbnggq3mgEZ4wesCc3DWGiS6\r\nZyY0+/tC6vMBFfh0ZUnyy+6GwpBqd6ApIbX4Y0J695Qn2r3UnFiAAz5nd/0yiNM1WEwLbWYZSpgF\r\nvr8MYeaSMp9OV9Qdcb9sfV9sxELUsA012lFHF4QFFwhToWtzNhAGo0B1hUxMi/MdL5M/ZwBO9+cz\r\neh54lCYWPhToLmjwKVh/bp+imCG86wRKy3Cqby+hM32yEEWnn6+Mzh8LLArML+/sQZqzLPU3DxES\r\n1454NZ8rU4HwrimoBqH7DGHrn0c4fIKw/0NYgr5TSv99hP99Hv4Q/hCWoU77P69pGkH43+fhD+EP\r\nYRn6aZofD9+i/wOEXyulUA99Kw83+m61bH0nD0Or09NDHSv8QoRV0Hch1AzT/D4emtINI5/TNyKs\r\ngn4Ia0FI9i2qgfjgjGKtCEfoIIbGJSgvRmAXHLnWidCZMoRFR5OjShhIqGjfpV6Ehrudtqug6brQ\r\n060ZoQH7ThX04LbLuhHWT/Uj1BRU5EKMb0JYN/0QlqEfwmaoGoTNF9oUpHMfXyCssJRBSULnL03t\r\nCE3QrrTkRimK/tgp4RcryDxsLKZHyEwwrLKqVxni9Wq0nIkKaCUq9E9DczrIXZNlg2Rrr+E4JLvT\r\nALW3+QZBJXeqkkSHnuOQKyAgajhG9ik5bRoco/HoqQHib5jUo9s8es0+/gb2WGVm9DLXdEO3w+6H\r\nw0CtJoszexZWelS7h9qckB6pJEbmDeyaM/3+jo4Bv3Y1LpkFg4il/9hUUf+I3jZAjJfe2hgLG0jF\r\nmeNXqldpJ7iIaf94Ieou/tFLmQZDL/a+6oKQeYKGt7c5QFBFdZPODIjdBACGtdUSxQSRRpf7f1Ra\r\n4l1CnoQpugC1Fr2FPSAAIu+qEtfDH0uKLHtb1lfwPliyTskIxpWo82wlXCcUItGsx2dV1nRRn1W3\r\nJwAn14q0ADTgIRQOhYlKV9VRgXq0GAK52/AAq9MB0FnLPgX4q2o2RY+Z5PwBwGJUtASdSnuEOJgS\r\nS97cVqtToRFsTaHgTHQbUOVLw1LWhOYiKjfkcB1Kei26SV8ruSFQFM61wmrXS3U6w1ri00xwTqki\r\nOGO/GowQ2yexJNJT9ZWnScfGyJopi39TifXH1V0ZQOTGWDU+G0nSqViBTxPdOjXTocmU24jKdagf\r\n3fgQ/kVdISfdXoZ/Ulf75XYIka4A2L8M4+ElbxW8gepInfUWwevwB7kRDg7UzAJEo5oNL1ow9tc4\r\n5mz38sUBI8kZzgaR6ruF1DCSVGoboGqeMmXj6OEHuWo5LTi6MFaN1bUGSRkVaZ6LKnWUJvqUJS4f\r\nx5ue2bMWddQ4iM6kKZzWV9xQpAzaIijN/sZvFohSCZWLMqWMQjuvxkZumx1vAfHnGZXOH0tOZp3m\r\nH0kIOxumcGgi7vOIKpDSadgU5actSFgJepTL0HffExHVcZTz6/srxe8Hp0+9jv5JbVCtLpz1Ho35\r\naIBOhGxJxFYOojTl4HPrT608KBCKrG+LpaOAfoSkZTuvT6DTVsxG9/qub5X5g9eukkdo5628f7QF\r\nvgoQUggLxW5Ao7UVdgP99GZEBUnxTLaqAa4qrHRk9P6ADLAChHTx50s1jJa2kid67wFb8AAEA7MX\r\ne5nLIHgn7kdViRB3cc7rt17OBXmjREYutgbDXEIUOmdpxetHaIq1hv7aebPQl9xIbKdKPgpxxOwu\r\nd3Rz3kpAS/HyNapblzL7xLX4OBfbe0lXUjjIiSvDxiBJlW93k5yv4oyFEZEHpJOHIBZCgl6n+Ue9\r\nKeEctZ0vUjRWHYdNTkJHhykQXbOxaEfoJkAVpJVaQBC2VupKmiWvPEUmuyKZqat41VLdUOpW8CUA\r\nErcShD50UjUojPPKwALsBAEGOimqZKVQsJYSzdjK59VYLLpFb6kD/UoQtujDpeSo5pKz7u5UmgP0\r\n+ryO00BcjL85Vfy+zAu45PpEtqpVEUKU9Y5VgWq7qkAZp1SMF4dUrUeCCltHle3pWJVsSOeMi36M\r\n/Y2qECJyc2ZB9RyzwR1ypnF6KBbV4JAb/zD3OFPs9SpGhHC4SoSGZ/2peu3oqlxyVxOhGLELVJQ0\r\ndlaABkFEQicrNTKBrgiF8esfS2ZUijD7aK7aplh5Sme2cgayL47YmNyL/n0rBMp17UGgtOMNuIEi\r\nl805nIoRGv6SG16yeHIPlh7R3VQhXPObnX9IH04txH2tphCMFk88U5hLMU9VI8xi+1BScMj0qfEG\r\nLvgpZDl7645dcQVEXl5XAohelUrh2RUL2UgCVEBQ6qByhPghgYppvCkHG7VzSn6SWRb0aBJ0piq4\r\n2EAdfzufbzkBIHEwW+2KvqoeIdKZXXUI7Ui1G94+zXEJrPxRhnDkYwuncHiXy6ZFbXUC84+MroGH\r\nBtp7nkhsyDRh3m70thwiW5XHg3M4il/p/287ORm3JkLHZq+TYz4tWgtClEzM+ZPjSB2pv+SGhUc+\r\n6s+YP0tfaZb54WKR3+6K1MPDTOAc/uQjwpR4kIs3OiRpzCyLKV7458fcGEeDWDVGc+d2374ehIik\r\nYyA03shdFRxCYdWpL8e5d8/jaeV9pruHWupDaIyciaoTNrlHi8HWjnydQeNA0Qe7vNe6GAqA6IpJ\r\ndDdXUCNCiOsMy2bBvnkERjTkRltaiNnbOW8i8Nk12cTMCzZFa0SIbTPP8ZFhzW6e+9aLxePH2Pvk\r\nJrpEtWcFQGSAcn5EMwhxDE7shnBE85nqLAqc/7Glha/rblHR4dvsudQKshFFkVe9CJGvbU1Vu5Ez\r\nYNlAvcVlyKV0eFl4efb0c0+km1oPcuc1I0TkzAUD0DDDxc3G3sg97LbxNF7vDrfqw1uEbHXSOOLh\r\nOZ0GENJ4Q7DR3t253mu5rtu6wZ7F7DtbYqCpxBH3qAmExqgz484KP4PySj4R8kQkd3dmnSf55EYQ\r\nkgOoit3YvZhN3OVsxPPjow0hzOINKSRAb/YrBwlaqfqlvxceaNYYQqIQlTzVs5ME5NSK5BTNX5qV\r\nxhAa8Cry7/jv+OFBYoh3dIBIiExfOwfYHEKkNXJ5qvOhmI0eTj3KuaabUzv3qUEeGshu2Er8aq/Q\r\nKG4yUajti3TIEVmY66sncppFaIx6obq0wgsy39JNb/jH6KIcVEVl61/ec2wYoQED4YERoO05kVWa\r\niULH0+dT/r800i1xvrlxhPistOKoogcD82DXWxxTzjl2nfXaCiTUNEJEfWnPjMeGs9XBOVxioHyK\r\nsxolbzH+AoRZZLycck8V8GMAgEWIYp1iG1HyBO4XIDRQYlyYfxmkgMckdFv6xN93ICTxhpxGNGl+\r\nTQadvS3Lt/wtCI0RfpSxnCoVZNI7Rdb3c02P6WsQoieL82P9Kj76b7Z467zmFyFEli9mmIR00h/j\r\nd28N+yqEBtoVnqVchzLdk85W759F/S6ESE8Gi912ZnMZtWfbHRbPd8+ifhdCiiNwBtfTetaercfX\r\ngRPwz9+ib0PIKeg7Haev4e7ar0WojX4Iy9APYTP0Q1iGfgiboR/CMvRD2Az9EJahH8Jm6IewDP0Q\r\nNkM/hGXoh7AZ0olQ1BHu1Fxmr5ig0WPndjQUVBWPz5p/C8AM4pYh1PAotGBMDxIAUOqu0CqJnEzG\r\n/9644fiGlmITZX5NrOYpuc7Fds/yc4DoWfWAMhGAid08TejOFRpVqKMqDhzTvRTzzhZZM0SP64Db\r\nO3XeI0fcNPFNhI9Ja6qGm3wtQm1ljU7fCDEb0EoXQHyzccFedRPEVPtOY91tb9BVtzebhEdH0R1o\r\nLSwO3QvtoFl8YgQXV7eLBYPFOEzNxiFmI0jD8eL1M3D/A1pNGGh1w+TvAAAAAElFTkSuQmCC" + "body-is": "R0lGODlhAQABAAAAADs=" }, { - "content-type": "image/webp", - "content-type-name": "icon_2.webp", + "content-type": "image/png", + "content-type-name": "icon_2.png", "content-disposition": "inline", - "content-disposition-filename": "icon_2.webp", + "content-disposition-filename": "icon_2.png", "transfer-encoding": "base64", - "body-is": "UklGRpYKAABXRUJQVlA4WAoAAAAYAAAAfwAAfwAAQUxQSMQFAAABsIZtm2k70ltVO+e6Oj6K829s\r\nt23btm2Mbds6O20EY1ttKxxPO9r14R0drFqVnzNXREwAig+dCAAztjj2ndf+9MG/9fKTj//65g+e\r\nut0QAMROQOVTBDCw+1uXruxxnPnP33/v/sMIiKliIQVgzvHX/YX/6aruTtLdxPifT9xy6gIgpFCn\r\nkAIm7f6NJ+j0rM7xupsYnU9dt08fQgoVShHTT/8DSRXnhLsqybvPnoGQahMjpp63nDRxNuxizpUX\r\nTkOMNQkJOOxBuhqLNHU+fERACtUICS/+Dl2NxZo6v/sSpFCJFHDBc1Rj0aZ87kKEVIUO5i6mCosX\r\n5eK56FQgYfPlFGcLPXP55kitSzh6HYUtFa49CqllCRdSla1V5QVIrUq4kmpssSmvQGpRwqVUY6tN\r\neQlSaxJOpRpbbsqTkVqSsHN2Y+vNezshtSLi+WuorKByzfMQWxDQ9zMqqyj86SSE8hLezcxKCt+F\r\nVFzCjjRW07gjUmEBk2+n1kP5h80Qykq4hsKKCq9GKiri+U/Sa+J84nkIJSV8gcKqCj+PVFDEazK9\r\nLs7eaxBL+gqFlRV+uaCIF6+j18a59sWIpSS8l8LqCt+DVEhA/0pafYwr+xHKSDiWygorj0EqI2Bx\r\nrRYjFBHx/LX0GjnXPg+xhA7OpbLKynPQKSFgSb2WIBQQMO9Jep2cT85DaC7hEBorbTwEqYSPUGol\r\n/EgBAfGXtFoZfxkRmlvwDL1WzmcWNJewJ53Vdu6F1FQHl1LqJbwUnaYSvly3LyM1FdGl1kvZRWxu\r\npG4jJXTr1v1/aL5JqZfwG8118CbmemW+EZ2mIp7/NL1Wziefh9gUEq5grlXmZUhoPuI69urUYxcR\r\nBQZM+zFzjTJ/OBWhBET0/4DZa+OZ35+JiDIjplxHsbqYcNFkRJQaIz5AtZqY8v2IEaXG1OnDaesp\r\n9RCuPw19nRQLiQAQ8YZHKF4HFz7yBkQAiEVEbPHhr10xFxi6nmo1MOX1Q8C8K7/24S0RC4i4mDSu\r\n2QURF22ktE/ZuxgRu6+hkZcgNhaxPT1LplyBiK0epXi7XPjoVgh4ozFLdm6P2FTCp9kjacrF84Dh\r\nm6nWJlPePAzMXkw1kj1+GqmpiBuoJOnClTsh4gqhtEepVyBim8cpTpLK6xGbG/lvpFCvQMQOKyje\r\nDheu2BERF2cK/6typITuaDTl9UPA3KVUa4Mpl84FBq+jGkfrlkUXPrI5At5oLuWJ2xsR8IaHKc7W\r\nkMIN5yFit9XMXpYLV++KiHPXUzjGNtCU3+gHFnybaiWZ8tsLgP6vU5Uto2U++HqE+EajlCPUN4aA\r\n197PbGwdXbj+XETstJziZbhw+Y6IOGc9xVkBUpXdQWD2TVQtQZU3zgYGvklVjrc1NOHDWyHivLUU\r\nb8qFa89DxJYPMxurQSrzFSHgVXdQrBlT3v4qRFzWo3ICCxmZGJpy2UJg8gdJ8YlzIT8wGVi4lKqs\r\nDF34p4MQsftjVJsoUz62GyIO+BPFWR1SnJ+YDgx+ni4+ES7OLwwC0z5OF05w22jKB7ZGxN6PUWV8\r\nonxsH0RsfR/VWCm6ML9rMtD/oUzVsakyf7gf2OydmeKsFqnKO7dGxOY/pquNZur88eaI2Op2qrLB\r\nGtCF8qF+hHjEfXQTc7dszvuOSAEzPygUZ+VIVS4/IgRMPukPHPX2UyYjhMMfpyqbrQRdnd/fEgGT\r\ndvn4b/78l99+Ytc+BGz5Pbo6NwmkKWXR6wGgb2CgDwBe1xWqsfF6kGqUxQf347/2H3RbpikLrAld\r\nnFyz6PJjjrmsu5p0YZFVIV2Mo5o4N0EkXcRMxFlsfcr/XwAjm7xuCV+n1Ev4VaSmOng3c83ehE5T\r\nCftS62W+M1JTAVMfpNXKeHsfQlNIOIc9r5NnHo+E5gO+zZ7XyHq8AQFFzP41Ta02psYf9ZeBgGkf\r\nXEcnvR5OOte+ezICygwRL3vfb56wmtgTv3nPSxADJhJWUDgg6gMAANAXAJ0BKoAAgAA+bSyVRaQi\r\nopj6dUhABsSzgGjQ/lwodk0jhPEboQRVkTKlhqPjr+quAmmHfoysvUbx11NUSGkZu+ugEifSaPs8\r\nFBtkw+aWfnkU2tGTkaJ2nsy2FRPQXPMT1T79MxRTfG1KqoiPDVNVVzve6iRgvBGlSoWnwsHH34Je\r\ndDZGtTWKsV0C6dzkP3zyk/c098vdIEhAh1qqkDEBgQ3YoqaaW0USQejZdnpofDcr08bBi4hLkJWU\r\n1iI5NRjds49JjkAA/vz4QLwmCqF1LvvDPAPnZxiIoDppKU4DZS52WwalyEqhPVjFxuX+OHn63YM8\r\np+qktofqY6DW8yQcUJpfWGQNn5aAl4ScDiAWyCY5NeamY+nS2IkokjdoKfoJpq1vK1JrJR6HiGS5\r\nHngp/QvKLcpyZx+KYh+z8Vm+OLsFMGQNTioflpIAtTXB9aHy4Pbqcj4D3A2S1MBTxZgdwdXc9vYE\r\nnwn5Usn2jq2FAU4ZLrWuU1THffKI3/J+sJo0yRhDAq0gUSe29Yole3GqgW2BviWafja+YrhOoDCA\r\n8tx5PkzjrmnhcqmHg6LumXDnBf8b6M8M/IxZbpSDXeMr+ZczwF8lbSDpbceEGyMSQuUXtT+3P5ZU\r\nvnftKUjDkvXBNt5RdKeOPh/7/t8X0VhSFv8yv6hQqv1Sic8+gfVpJduCq+bmMkYSx5aNF1bl3xgA\r\njoyk4v+AdvfJGRYFIY4tcxORTmkkopB1nrvxwyEzPcC2kLuIVy1j7eTYRrXmAcN/sCCHKw8gC1sn\r\nzbXcG/Am8c+t399S8r1RA4y2OzfH1OjP//YdfwT5sohaW0G5g++4pNga2pZTTIi0VipXRZoJylnT\r\nrlEX9QPscrVfxWEP8fhADOJBmXIVINvcUYk65xAc4VlnpplTseD4IPXHqZOibz0Z7J8N5r0O+WBJ\r\nlZQxrEyeIRgt9mGr1VunXurEhKNfak3y9vacdAXOX/fQDkLDuZfsAXvN8GAixGDH7QQE9iNkgc9g\r\nCRl44cekH8ocrEbLKyw5DV3oGgw/CRl3LmX7LdfK7yhfCPReRj0j2XKqJUsGJhbS5nIAzHTDDH6M\r\nfnVUE6hlQeTAludD3dWF4c1DK0OA4YGs/EbwMEO/0aC0hXoTMFTY/FA8PsFrlueEvzp5Xe9SsHw9\r\nZqJKyuCMrPRc27YdiXo3CaUDSGUe7id0gmkzGjKFq/sBPueCigWDx5eLWBwZ6J8UIahsInKSGxmK\r\nN4sESFNYWXO9lA/QJfHtUX8VGY7vWlyUK5pJM+ScoQnBjBFqcPhfI5pjIW6sLdRnN/zwtJ5H7Zkw\r\nQ16syVzN98baLodS2gwgAEVYSUa6AAAARXhpZgAASUkqAAgAAAAGABIBAwABAAAAAQAAABoBBQAB\r\nAAAAVgAAABsBBQABAAAAXgAAACgBAwABAAAAAgAAABMCAwABAAAAAQAAAGmHBAABAAAAZgAAAAAA\r\nAABIAAAAAQAAAEgAAAABAAAABgAAkAcABAAAADAyMTABkQcABAAAAAECAwAAoAcABAAAADAxMDAB\r\noAMAAQAAAP//AAACoAQAAQAAAIAAAAADoAQAAQAAAIAAAAAAAAAA" + "body-is": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAA\r\nAABJRU5ErkJggg==" } ] } diff --git a/tests/features/smtp/send/inline.feature b/tests/features/smtp/send/inline.feature index 97aab9e7..27a8ac95 100644 --- a/tests/features/smtp/send/inline.feature +++ b/tests/features/smtp/send/inline.feature @@ -28,16 +28,8 @@ Feature: SMTP messages containing inlines Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ @@ -86,16 +78,8 @@ Feature: SMTP messages containing inlines Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ @@ -144,16 +128,8 @@ Feature: SMTP messages containing inlines Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ diff --git a/tests/features/smtp/send/one_account_to_another.feature b/tests/features/smtp/send/one_account_to_another.feature index 82b29568..641498f6 100644 --- a/tests/features/smtp/send/one_account_to_another.feature +++ b/tests/features/smtp/send/one_account_to_another.feature @@ -88,16 +88,8 @@ Feature: SMTP sending two messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ diff --git a/tests/features/smtp/send/plain_att.feature b/tests/features/smtp/send/plain_att.feature index 63a48442..da10f902 100644 --- a/tests/features/smtp/send/plain_att.feature +++ b/tests/features/smtp/send/plain_att.feature @@ -29,16 +29,8 @@ Feature: SMTP sending of plain messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ @@ -89,16 +81,8 @@ Feature: SMTP sending of plain messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ @@ -150,16 +134,8 @@ Feature: SMTP sending of plain messages Content-Transfer-Encoding: base64 Content-Type: image/png - iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAALVBMVEUAAAD///////////////// - //////////////////////////////////////+hSKubAAAADnRSTlMAgO8QQM+/IJ9gj1AwcIQd - OXUAAAGdSURBVDjLXJC9SgNBFIVPXDURTYhgIQghINgowyLYCAYtRFAIgtYhpAjYhC0srCRW6YIg - WNpoHVSsg/gEii+Qnfxq4DyDc3cyMfrBwl2+O+fOHTi8p7LS5RUf/9gpMKL7iT9sK47Q95ggpkzv - 1cvRcsGYNMYsmP+zKN27NR2vcDyTNVdfkOuuniNPMWafvIbljt+YoMEvW8y7lt+ARwhvrgPjhA0I - BTng7S1GLPlypBvtIBPidY4YBDJFdtnkscQ5JGaGqxC9i7jSDwcwnB8qHWBaQjw1ABI8wYgtVoG6 - 9pFkH8iZIiJeulFt4JLvJq8I5N2GMWYbHWDWzM3JZTMdeSWla0kW86FcuI0mfStiNKQ/AhEeh8h0 - YUTffFwrMTT5oSwdojIQ0UKcocgAKRH1HiqhFQmmJa5qRaYHNbRiSsOgslY0NdixItUTUWlZkedP - HXVyAgAIA1F0wP5btQZPIyTwvAqa/Fl4oacuP+e4XHAjSYpkQkxSiMX+T7FPoZJToSStzED70HCy - KE3NGCg4jJrC6Ti7AFwZLhnW0gMbzFZc0RmmeAAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQot + tAAAAABJRU5ErkJggg== --bc5bd30245232f31b6c976adcd59bb0069c9b13f986f9e40c2571bb80aa16606-- """ diff --git a/tests/features/smtp/send/plain_to_internal.feature b/tests/features/smtp/send/plain_to_internal.feature index 795a08fc..8c7ee4b4 100644 --- a/tests/features/smtp/send/plain_to_internal.feature +++ b/tests/features/smtp/send/plain_to_internal.feature @@ -408,59 +408,9 @@ Feature: SMTP sending of PLAIN messages to Internal recipient Content-Disposition: attachment; filename="test.pdf" Content-Transfer-Encoding: base64 - JVBERi0xLjUKJeLjz9MKNyAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnRO - YW1lIC9BcmlhbAovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MDUKL0Rlc2Nl - bnQgLTIxMAovQ2FwSGVpZ2h0IDcyOAovQXZnV2lkdGggNDQxCi9NYXhXaWR0aCAyNjY1Ci9G - b250V2VpZ2h0IDQwMAovWEhlaWdodCAyNTAKL0xlYWRpbmcgMzMKL1N0ZW1WIDQ0Ci9Gb250 - QkJveCBbLTY2NSAtMjEwIDIwMDAgNzI4XQo+PgplbmRvYmoKOCAwIG9iagpbMjc4IDAgMCAw - IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw - IDAgMCAwIDAgNzIyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw - IDAgMCAwIDAgMCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAw - IDUwMCAyMjIgMCA1NTYgNTU2IDU1NiAwIDMzMyA1MDAgMjc4XQplbmRvYmoKNiAwIG9iago8 - PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUKL05hbWUgL0YxCi9CYXNlRm9udCAv - QXJpYWwKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKL0ZvbnREZXNjcmlwdG9yIDcgMCBS - Ci9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDExNgovV2lkdGhzIDggMCBSCj4+CmVuZG9iago5 - IDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3JtYWwKL2NhIDEKPj4KZW5kb2Jq - CjEwIDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3JtYWwKL0NBIDEKPj4KZW5k - b2JqCjExIDAgb2JqCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggMjUwCj4+CnN0 - cmVhbQp4nKWQQUsDMRCF74H8h3dMhGaTuM3uQumh21oUCxUXPIiH2m7XokZt+/9xJruCns3h - MW/yzQw8ZGtMJtmqvp7DZreb2EG1UU+nmM1rfElhjeVXOQ+LQFpUHsdWiocLRClmjRTZlYNz - xuZo9lI44iwcCm+sz1HYyoSA5p245X2B7kQ70SVXDm4pxaOq9Vi96FGpWpbt64F81O5Sdeyh - R7k6aB/UnqtkzyxphNmT9r7vf/LUjoVYP+6bW/7+YDiynLUr6BIxg/1Zmlal6qgHYsPErq9I - ntm+EdbqJzQ3Uiwogzsp/hOWD9ZU5e+wUkZDNPh7CItVjW9I9VnOCmVuZHN0cmVhbQplbmRv - YmoKNSAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVz - b3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA2IDAgUgo+PgovRXh0R1N0YXRlIDw8Ci9HUzcgOSAw - IFIKL0dTOCAxMCAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VD - IC9JbWFnZUldCj4+Ci9Db250ZW50cyAxMSAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAov - UyAvVHJhbnNwYXJlbmN5Ci9DUyAvRGV2aWNlUkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJl - bnRzIDAKL1BhcmVudCAyIDAgUgo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1MgL1AKL1R5cGUg - L1N0cnVjdEVsZW0KL0sgWzBdCi9QIDEzIDAgUgovUGcgNSAwIFIKPj4KZW5kb2JqCjEzIDAg - b2JqCjw8Ci9TIC9QYXJ0Ci9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsxMiAwIFJdCi9QIDMgMCBS - Cj4+CmVuZG9iagoxNCAwIG9iago8PAovTnVtcyBbMCBbMTIgMCBSXV0KPj4KZW5kb2JqCjQg - MCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRub3RlIC9Ob3RlCi9UZXh0Ym94IC9TZWN0 - Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5saW5lU2hhcGUgL1NlY3QKL0Fubm90 - YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9vayAvRG9jdW1lbnQKL1dvcmtz - aGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVldCAvUGFydAovRGlhbG9n - c2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlhZ3JhbSAvRmlndXJl - Cj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlIC9TdHJ1Y3RUcmVlUm9vdAovUm9sZU1hcCA0 - IDAgUgovSyBbMTMgMCBSXQovUGFyZW50VHJlZSAxNCAwIFIKL1BhcmVudFRyZWVOZXh0S2V5 - IDEKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs1IDAgUl0KL0Nv - dW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBS - Ci9MYW5nIChlbi1VUykKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9NYXJrSW5mbyA8PAovTWFy - a2VkIHRydWUKPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8Ci9DcmVhdG9yIDxGRUZGMDA0RDAw - NjkwMDYzMDA3MjAwNkYwMDczMDA2RjAwNjYwMDc0MDBBRTAwMjAwMDU3MDA2RjAwNzIwMDY0 - MDAyMDAwMzIwMDMwMDAzMTAwMzY+Ci9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA4MjAxMjMxMTAr - MDAnMDAnKQovUHJvZHVjZXIgKHd3dy5pbG92ZXBkZi5jb20pCi9Nb2REYXRlIChEOjIwMjAw - ODIwMTIzMTEwWikKPj4KZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYNCjAw - MDAwMDIwMTQgMDAwMDAgbg0KMDAwMDAwMTk1NyAwMDAwMCBuDQowMDAwMDAxODQ3IDAwMDAw - IG4NCjAwMDAwMDE1NjQgMDAwMDAgbg0KMDAwMDAwMTA4MyAwMDAwMCBuDQowMDAwMDAwNDc3 - IDAwMDAwIG4NCjAwMDAwMDAwMTUgMDAwMDAgbg0KMDAwMDAwMDI1MiAwMDAwMCBuDQowMDAw - MDAwNjQ3IDAwMDAwIG4NCjAwMDAwMDA3MDMgMDAwMDAgbg0KMDAwMDAwMDc2MCAwMDAwMCBu - DQowMDAwMDAxMzgwIDAwMDAwIG4NCjAwMDAwMDE0NTMgMDAwMDAgbg0KMDAwMDAwMTUyMyAw - MDAwMCBuDQowMDAwMDAyMTI4IDAwMDAwIG4NCnRyYWlsZXIKPDwKL1NpemUgMTYKL1Jvb3Qg - MSAwIFIKL0luZm8gMTUgMCBSCi9JRCBbPDY2MDhFOTQxN0M1OUExNkEwNjAzMDgxQzY1MTk1 - MzNCPiA8RTU2RENDMTkyRjY1RjAwNzVDN0FDMjE2ODYxQjg1MjA+XQo+PgpzdGFydHhyZWYK - MjM0NAolJUVPRgo= + JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1sz + IDAgUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0 + cmFpbGVyIDw8L1Jvb3QgMSAwIFI+Pg== --------------WI90RPIYF20K6dGXjs7dm2mi Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="test.xlsx" @@ -620,12 +570,8 @@ Feature: SMTP sending of PLAIN messages to Internal recipient Content-Disposition: attachment; filename="testxml.xml" Content-Transfer-Encoding: base64 - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN1aXRl - IFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KCjxzdWl0ZSBu - YW1lPSJBZmZpbGlhdGUgTmV0d29ya3MiPgoKICAgIDx0ZXN0IG5hbWU9IkFmZmlsaWF0ZSBO - ZXR3b3JrcyIgZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgPGNsYXNzZXM+CiAgICAgICAgICAg - IDxjbGFzcyBuYW1lPSJjb20uY2xpY2tvdXQuYXBpdGVzdGluZy5hZmZOZXR3b3Jrcy5Bd2lu - VUtUZXN0Ii8+CiAgICAgICAgPC9jbGFzc2VzPgogICAgPC90ZXN0PgoKPC9zdWl0ZT4= + PD94bWwgdmVyc2lvbj0iMS4xIj8+PCFET0NUWVBFIF9bPCFFTEVNRU5UIF8gRU1QVFk+XT48 + Xy8+ --------------WI90RPIYF20K6dGXjs7dm2mi Content-Type: text/plain; charset=UTF-8; name="text file.txt" Content-Disposition: attachment; filename="text file.txt" @@ -683,7 +629,7 @@ Feature: SMTP sending of PLAIN messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "test.pdf", "transfer-encoding": "base64", - "body-is": "JVBERi0xLjUKJeLjz9MKNyAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1l\r\nIC9BcmlhbAovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MDUKL0Rlc2NlbnQgLTIx\r\nMAovQ2FwSGVpZ2h0IDcyOAovQXZnV2lkdGggNDQxCi9NYXhXaWR0aCAyNjY1Ci9Gb250V2VpZ2h0\r\nIDQwMAovWEhlaWdodCAyNTAKL0xlYWRpbmcgMzMKL1N0ZW1WIDQ0Ci9Gb250QkJveCBbLTY2NSAt\r\nMjEwIDIwMDAgNzI4XQo+PgplbmRvYmoKOCAwIG9iagpbMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAg\r\nMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDAgMCAw\r\nIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYg\r\nNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAwIDUwMCAyMjIgMCA1NTYgNTU2IDU1NiAw\r\nIDMzMyA1MDAgMjc4XQplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1\r\nZVR5cGUKL05hbWUgL0YxCi9CYXNlRm9udCAvQXJpYWwKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2Rp\r\nbmcKL0ZvbnREZXNjcmlwdG9yIDcgMCBSCi9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDExNgovV2lk\r\ndGhzIDggMCBSCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3Jt\r\nYWwKL2NhIDEKPj4KZW5kb2JqCjEwIDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3Jt\r\nYWwKL0NBIDEKPj4KZW5kb2JqCjExIDAgb2JqCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5n\r\ndGggMjUwCj4+CnN0cmVhbQp4nKWQQUsDMRCF74H8h3dMhGaTuM3uQumh21oUCxUXPIiH2m7XokZt\r\n+/9xJruCns3hMW/yzQw8ZGtMJtmqvp7DZreb2EG1UU+nmM1rfElhjeVXOQ+LQFpUHsdWiocLRClm\r\njRTZlYNzxuZo9lI44iwcCm+sz1HYyoSA5p245X2B7kQ70SVXDm4pxaOq9Vi96FGpWpbt64F81O5S\r\ndeyhR7k6aB/UnqtkzyxphNmT9r7vf/LUjoVYP+6bW/7+YDiynLUr6BIxg/1Zmlal6qgHYsPErq9I\r\nntm+EdbqJzQ3Uiwogzsp/hOWD9ZU5e+wUkZDNPh7CItVjW9I9VnOCmVuZHN0cmVhbQplbmRvYmoK\r\nNSAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVzb3VyY2Vz\r\nIDw8Ci9Gb250IDw8Ci9GMSA2IDAgUgo+PgovRXh0R1N0YXRlIDw8Ci9HUzcgOSAwIFIKL0dTOCAx\r\nMCAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUldCj4+\r\nCi9Db250ZW50cyAxMSAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAovUyAvVHJhbnNwYXJlbmN5\r\nCi9DUyAvRGV2aWNlUkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJlbnRzIDAKL1BhcmVudCAyIDAg\r\nUgo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1MgL1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWzBdCi9Q\r\nIDEzIDAgUgovUGcgNSAwIFIKPj4KZW5kb2JqCjEzIDAgb2JqCjw8Ci9TIC9QYXJ0Ci9UeXBlIC9T\r\ndHJ1Y3RFbGVtCi9LIFsxMiAwIFJdCi9QIDMgMCBSCj4+CmVuZG9iagoxNCAwIG9iago8PAovTnVt\r\ncyBbMCBbMTIgMCBSXV0KPj4KZW5kb2JqCjQgMCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRu\r\nb3RlIC9Ob3RlCi9UZXh0Ym94IC9TZWN0Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5s\r\naW5lU2hhcGUgL1NlY3QKL0Fubm90YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9v\r\nayAvRG9jdW1lbnQKL1dvcmtzaGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVl\r\ndCAvUGFydAovRGlhbG9nc2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlh\r\nZ3JhbSAvRmlndXJlCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlIC9TdHJ1Y3RUcmVlUm9vdAov\r\nUm9sZU1hcCA0IDAgUgovSyBbMTMgMCBSXQovUGFyZW50VHJlZSAxNCAwIFIKL1BhcmVudFRyZWVO\r\nZXh0S2V5IDEKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs1IDAgUl0K\r\nL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBS\r\nCi9MYW5nIChlbi1VUykKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9NYXJrSW5mbyA8PAovTWFya2Vk\r\nIHRydWUKPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8Ci9DcmVhdG9yIDxGRUZGMDA0RDAwNjkwMDYz\r\nMDA3MjAwNkYwMDczMDA2RjAwNjYwMDc0MDBBRTAwMjAwMDU3MDA2RjAwNzIwMDY0MDAyMDAwMzIw\r\nMDMwMDAzMTAwMzY+Ci9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA4MjAxMjMxMTArMDAnMDAnKQovUHJv\r\nZHVjZXIgKHd3dy5pbG92ZXBkZi5jb20pCi9Nb2REYXRlIChEOjIwMjAwODIwMTIzMTEwWikKPj4K\r\nZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDIwMTQgMDAwMDAgbg0K\r\nMDAwMDAwMTk1NyAwMDAwMCBuDQowMDAwMDAxODQ3IDAwMDAwIG4NCjAwMDAwMDE1NjQgMDAwMDAg\r\nbg0KMDAwMDAwMTA4MyAwMDAwMCBuDQowMDAwMDAwNDc3IDAwMDAwIG4NCjAwMDAwMDAwMTUgMDAw\r\nMDAgbg0KMDAwMDAwMDI1MiAwMDAwMCBuDQowMDAwMDAwNjQ3IDAwMDAwIG4NCjAwMDAwMDA3MDMg\r\nMDAwMDAgbg0KMDAwMDAwMDc2MCAwMDAwMCBuDQowMDAwMDAxMzgwIDAwMDAwIG4NCjAwMDAwMDE0\r\nNTMgMDAwMDAgbg0KMDAwMDAwMTUyMyAwMDAwMCBuDQowMDAwMDAyMTI4IDAwMDAwIG4NCnRyYWls\r\nZXIKPDwKL1NpemUgMTYKL1Jvb3QgMSAwIFIKL0luZm8gMTUgMCBSCi9JRCBbPDY2MDhFOTQxN0M1\r\nOUExNkEwNjAzMDgxQzY1MTk1MzNCPiA8RTU2RENDMTkyRjY1RjAwNzVDN0FDMjE2ODYxQjg1MjA+\r\nXQo+PgpzdGFydHhyZWYKMjM0NAolJUVPRgo=" + "body-is": "JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1szIDAg\r\nUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0cmFpbGVy\r\nIDw8L1Jvb3QgMSAwIFI+Pg==" }, { "content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @@ -699,7 +645,7 @@ Feature: SMTP sending of PLAIN messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "testxml.xml", "transfer-encoding": "base64", - "body-is": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN1aXRlIFNZ\r\nU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KCjxzdWl0ZSBuYW1lPSJB\r\nZmZpbGlhdGUgTmV0d29ya3MiPgoKICAgIDx0ZXN0IG5hbWU9IkFmZmlsaWF0ZSBOZXR3b3JrcyIg\r\nZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgPGNsYXNzZXM+CiAgICAgICAgICAgIDxjbGFzcyBuYW1l\r\nPSJjb20uY2xpY2tvdXQuYXBpdGVzdGluZy5hZmZOZXR3b3Jrcy5Bd2luVUtUZXN0Ii8+CiAgICAg\r\nICAgPC9jbGFzc2VzPgogICAgPC90ZXN0PgoKPC9zdWl0ZT4=" + "body-is": "PD94bWwgdmVyc2lvbj0iMS4xIj8+PCFET0NUWVBFIF9bPCFFTEVNRU5UIF8gRU1QVFk+XT48Xy8+" }, { "content-type": "text/plain", @@ -754,78 +700,22 @@ Feature: SMTP sending of PLAIN messages to Internal recipient Content-Disposition: attachment; filename="index.html" Content-Transfer-Encoding: base64 - IDwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5QYWdlIFRpdGxlPC90 - aXRsZT4NCjwvaGVhZD4NCjxib2R5Pg0KDQo8aDE+TXkgRmlyc3QgSGVhZGluZzwvaDE+DQo8 - cD5NeSBmaXJzdCBwYXJhZ3JhcGguPC9wPg0KDQo8L2JvZHk+DQo8L2h0bWw+IA== + PCFET0NUWVBFIGh0bWw+ --------------MQ01Z9UM8OaR9z39TvzDfdIq Content-Type: text/xml; charset=UTF-8; name="testxml.xml" Content-Disposition: attachment; filename="testxml.xml" Content-Transfer-Encoding: base64 - PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN1aXRl - IFNZU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KCjxzdWl0ZSBu - YW1lPSJBZmZpbGlhdGUgTmV0d29ya3MiPgoKICAgIDx0ZXN0IG5hbWU9IkFmZmlsaWF0ZSBO - ZXR3b3JrcyIgZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgPGNsYXNzZXM+CiAgICAgICAgICAg - IDxjbGFzcyBuYW1lPSJjb20uY2xpY2tvdXQuYXBpdGVzdGluZy5hZmZOZXR3b3Jrcy5Bd2lu - VUtUZXN0Ii8+CiAgICAgICAgPC9jbGFzc2VzPgogICAgPC90ZXN0PgoKPC9zdWl0ZT4= + PD94bWwgdmVyc2lvbj0iMS4xIj8+PCFET0NUWVBFIF9bPCFFTEVNRU5UIF8gRU1QVFk+XT48 + Xy8+ --------------MQ01Z9UM8OaR9z39TvzDfdIq Content-Type: application/pdf; name="test.pdf" Content-Disposition: attachment; filename="test.pdf" Content-Transfer-Encoding: base64 - JVBERi0xLjUKJeLjz9MKNyAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnRO - YW1lIC9BcmlhbAovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MDUKL0Rlc2Nl - bnQgLTIxMAovQ2FwSGVpZ2h0IDcyOAovQXZnV2lkdGggNDQxCi9NYXhXaWR0aCAyNjY1Ci9G - b250V2VpZ2h0IDQwMAovWEhlaWdodCAyNTAKL0xlYWRpbmcgMzMKL1N0ZW1WIDQ0Ci9Gb250 - QkJveCBbLTY2NSAtMjEwIDIwMDAgNzI4XQo+PgplbmRvYmoKOCAwIG9iagpbMjc4IDAgMCAw - IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw - IDAgMCAwIDAgNzIyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw - IDAgMCAwIDAgMCAwIDAgMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAw - IDUwMCAyMjIgMCA1NTYgNTU2IDU1NiAwIDMzMyA1MDAgMjc4XQplbmRvYmoKNiAwIG9iago8 - PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUKL05hbWUgL0YxCi9CYXNlRm9udCAv - QXJpYWwKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKL0ZvbnREZXNjcmlwdG9yIDcgMCBS - Ci9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDExNgovV2lkdGhzIDggMCBSCj4+CmVuZG9iago5 - IDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3JtYWwKL2NhIDEKPj4KZW5kb2Jq - CjEwIDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3JtYWwKL0NBIDEKPj4KZW5k - b2JqCjExIDAgb2JqCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5ndGggMjUwCj4+CnN0 - cmVhbQp4nKWQQUsDMRCF74H8h3dMhGaTuM3uQumh21oUCxUXPIiH2m7XokZt+/9xJruCns3h - MW/yzQw8ZGtMJtmqvp7DZreb2EG1UU+nmM1rfElhjeVXOQ+LQFpUHsdWiocLRClmjRTZlYNz - xuZo9lI44iwcCm+sz1HYyoSA5p245X2B7kQ70SVXDm4pxaOq9Vi96FGpWpbt64F81O5Sdeyh - R7k6aB/UnqtkzyxphNmT9r7vf/LUjoVYP+6bW/7+YDiynLUr6BIxg/1Zmlal6qgHYsPErq9I - ntm+EdbqJzQ3Uiwogzsp/hOWD9ZU5e+wUkZDNPh7CItVjW9I9VnOCmVuZHN0cmVhbQplbmRv - YmoKNSAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVz - b3VyY2VzIDw8Ci9Gb250IDw8Ci9GMSA2IDAgUgo+PgovRXh0R1N0YXRlIDw8Ci9HUzcgOSAw - IFIKL0dTOCAxMCAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VD - IC9JbWFnZUldCj4+Ci9Db250ZW50cyAxMSAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAov - UyAvVHJhbnNwYXJlbmN5Ci9DUyAvRGV2aWNlUkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJl - bnRzIDAKL1BhcmVudCAyIDAgUgo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1MgL1AKL1R5cGUg - L1N0cnVjdEVsZW0KL0sgWzBdCi9QIDEzIDAgUgovUGcgNSAwIFIKPj4KZW5kb2JqCjEzIDAg - b2JqCjw8Ci9TIC9QYXJ0Ci9UeXBlIC9TdHJ1Y3RFbGVtCi9LIFsxMiAwIFJdCi9QIDMgMCBS - Cj4+CmVuZG9iagoxNCAwIG9iago8PAovTnVtcyBbMCBbMTIgMCBSXV0KPj4KZW5kb2JqCjQg - MCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRub3RlIC9Ob3RlCi9UZXh0Ym94IC9TZWN0 - Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5saW5lU2hhcGUgL1NlY3QKL0Fubm90 - YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9vayAvRG9jdW1lbnQKL1dvcmtz - aGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVldCAvUGFydAovRGlhbG9n - c2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlhZ3JhbSAvRmlndXJl - Cj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlIC9TdHJ1Y3RUcmVlUm9vdAovUm9sZU1hcCA0 - IDAgUgovSyBbMTMgMCBSXQovUGFyZW50VHJlZSAxNCAwIFIKL1BhcmVudFRyZWVOZXh0S2V5 - IDEKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs1IDAgUl0KL0Nv - dW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBS - Ci9MYW5nIChlbi1VUykKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9NYXJrSW5mbyA8PAovTWFy - a2VkIHRydWUKPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8Ci9DcmVhdG9yIDxGRUZGMDA0RDAw - NjkwMDYzMDA3MjAwNkYwMDczMDA2RjAwNjYwMDc0MDBBRTAwMjAwMDU3MDA2RjAwNzIwMDY0 - MDAyMDAwMzIwMDMwMDAzMTAwMzY+Ci9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA4MjAxMjMxMTAr - MDAnMDAnKQovUHJvZHVjZXIgKHd3dy5pbG92ZXBkZi5jb20pCi9Nb2REYXRlIChEOjIwMjAw - ODIwMTIzMTEwWikKPj4KZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYNCjAw - MDAwMDIwMTQgMDAwMDAgbg0KMDAwMDAwMTk1NyAwMDAwMCBuDQowMDAwMDAxODQ3IDAwMDAw - IG4NCjAwMDAwMDE1NjQgMDAwMDAgbg0KMDAwMDAwMTA4MyAwMDAwMCBuDQowMDAwMDAwNDc3 - IDAwMDAwIG4NCjAwMDAwMDAwMTUgMDAwMDAgbg0KMDAwMDAwMDI1MiAwMDAwMCBuDQowMDAw - MDAwNjQ3IDAwMDAwIG4NCjAwMDAwMDA3MDMgMDAwMDAgbg0KMDAwMDAwMDc2MCAwMDAwMCBu - DQowMDAwMDAxMzgwIDAwMDAwIG4NCjAwMDAwMDE0NTMgMDAwMDAgbg0KMDAwMDAwMTUyMyAw - MDAwMCBuDQowMDAwMDAyMTI4IDAwMDAwIG4NCnRyYWlsZXIKPDwKL1NpemUgMTYKL1Jvb3Qg - MSAwIFIKL0luZm8gMTUgMCBSCi9JRCBbPDY2MDhFOTQxN0M1OUExNkEwNjAzMDgxQzY1MTk1 - MzNCPiA8RTU2RENDMTkyRjY1RjAwNzVDN0FDMjE2ODYxQjg1MjA+XQo+PgpzdGFydHhyZWYK - MjM0NAolJUVPRgo= + JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1sz + IDAgUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0 + cmFpbGVyIDw8L1Jvb3QgMSAwIFI+Pg== --------------MQ01Z9UM8OaR9z39TvzDfdIq Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name="test.xlsx" @@ -1242,7 +1132,7 @@ Feature: SMTP sending of PLAIN messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "index.html", "transfer-encoding": "base64", - "body-is": "IDwhRE9DVFlQRSBodG1sPg0KPGh0bWw+DQo8aGVhZD4NCjx0aXRsZT5QYWdlIFRpdGxlPC90aXRs\r\nZT4NCjwvaGVhZD4NCjxib2R5Pg0KDQo8aDE+TXkgRmlyc3QgSGVhZGluZzwvaDE+DQo8cD5NeSBm\r\naXJzdCBwYXJhZ3JhcGguPC9wPg0KDQo8L2JvZHk+DQo8L2h0bWw+IA==" + "body-is": "PCFET0NUWVBFIGh0bWw+" }, { "content-type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", @@ -1258,7 +1148,7 @@ Feature: SMTP sending of PLAIN messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "test.pdf", "transfer-encoding": "base64", - "body-is": "JVBERi0xLjUKJeLjz9MKNyAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0ZvbnROYW1l\r\nIC9BcmlhbAovRmxhZ3MgMzIKL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA5MDUKL0Rlc2NlbnQgLTIx\r\nMAovQ2FwSGVpZ2h0IDcyOAovQXZnV2lkdGggNDQxCi9NYXhXaWR0aCAyNjY1Ci9Gb250V2VpZ2h0\r\nIDQwMAovWEhlaWdodCAyNTAKL0xlYWRpbmcgMzMKL1N0ZW1WIDQ0Ci9Gb250QkJveCBbLTY2NSAt\r\nMjEwIDIwMDAgNzI4XQo+PgplbmRvYmoKOCAwIG9iagpbMjc4IDAgMCAwIDAgMCAwIDAgMCAwIDAg\r\nMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgNzIyIDAgMCAw\r\nIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA1NTYg\r\nNTU2IDUwMCA1NTYgNTU2IDI3OCA1NTYgNTU2IDIyMiAwIDUwMCAyMjIgMCA1NTYgNTU2IDU1NiAw\r\nIDMzMyA1MDAgMjc4XQplbmRvYmoKNiAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1\r\nZVR5cGUKL05hbWUgL0YxCi9CYXNlRm9udCAvQXJpYWwKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2Rp\r\nbmcKL0ZvbnREZXNjcmlwdG9yIDcgMCBSCi9GaXJzdENoYXIgMzIKL0xhc3RDaGFyIDExNgovV2lk\r\ndGhzIDggMCBSCj4+CmVuZG9iago5IDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3Jt\r\nYWwKL2NhIDEKPj4KZW5kb2JqCjEwIDAgb2JqCjw8Ci9UeXBlIC9FeHRHU3RhdGUKL0JNIC9Ob3Jt\r\nYWwKL0NBIDEKPj4KZW5kb2JqCjExIDAgb2JqCjw8Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCi9MZW5n\r\ndGggMjUwCj4+CnN0cmVhbQp4nKWQQUsDMRCF74H8h3dMhGaTuM3uQumh21oUCxUXPIiH2m7XokZt\r\n+/9xJruCns3hMW/yzQw8ZGtMJtmqvp7DZreb2EG1UU+nmM1rfElhjeVXOQ+LQFpUHsdWiocLRClm\r\njRTZlYNzxuZo9lI44iwcCm+sz1HYyoSA5p245X2B7kQ70SVXDm4pxaOq9Vi96FGpWpbt64F81O5S\r\ndeyhR7k6aB/UnqtkzyxphNmT9r7vf/LUjoVYP+6bW/7+YDiynLUr6BIxg/1Zmlal6qgHYsPErq9I\r\nntm+EdbqJzQ3Uiwogzsp/hOWD9ZU5e+wUkZDNPh7CItVjW9I9VnOCmVuZHN0cmVhbQplbmRvYmoK\r\nNSAwIG9iago8PAovVHlwZSAvUGFnZQovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovUmVzb3VyY2Vz\r\nIDw8Ci9Gb250IDw8Ci9GMSA2IDAgUgo+PgovRXh0R1N0YXRlIDw8Ci9HUzcgOSAwIFIKL0dTOCAx\r\nMCAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDIC9JbWFnZUldCj4+\r\nCi9Db250ZW50cyAxMSAwIFIKL0dyb3VwIDw8Ci9UeXBlIC9Hcm91cAovUyAvVHJhbnNwYXJlbmN5\r\nCi9DUyAvRGV2aWNlUkdCCj4+Ci9UYWJzIC9TCi9TdHJ1Y3RQYXJlbnRzIDAKL1BhcmVudCAyIDAg\r\nUgo+PgplbmRvYmoKMTIgMCBvYmoKPDwKL1MgL1AKL1R5cGUgL1N0cnVjdEVsZW0KL0sgWzBdCi9Q\r\nIDEzIDAgUgovUGcgNSAwIFIKPj4KZW5kb2JqCjEzIDAgb2JqCjw8Ci9TIC9QYXJ0Ci9UeXBlIC9T\r\ndHJ1Y3RFbGVtCi9LIFsxMiAwIFJdCi9QIDMgMCBSCj4+CmVuZG9iagoxNCAwIG9iago8PAovTnVt\r\ncyBbMCBbMTIgMCBSXV0KPj4KZW5kb2JqCjQgMCBvYmoKPDwKL0Zvb3Rub3RlIC9Ob3RlCi9FbmRu\r\nb3RlIC9Ob3RlCi9UZXh0Ym94IC9TZWN0Ci9IZWFkZXIgL1NlY3QKL0Zvb3RlciAvU2VjdAovSW5s\r\naW5lU2hhcGUgL1NlY3QKL0Fubm90YXRpb24gL1NlY3QKL0FydGlmYWN0IC9TZWN0Ci9Xb3JrYm9v\r\nayAvRG9jdW1lbnQKL1dvcmtzaGVldCAvUGFydAovTWFjcm9zaGVldCAvUGFydAovQ2hhcnRzaGVl\r\ndCAvUGFydAovRGlhbG9nc2hlZXQgL1BhcnQKL1NsaWRlIC9QYXJ0Ci9DaGFydCAvU2VjdAovRGlh\r\nZ3JhbSAvRmlndXJlCj4+CmVuZG9iagozIDAgb2JqCjw8Ci9UeXBlIC9TdHJ1Y3RUcmVlUm9vdAov\r\nUm9sZU1hcCA0IDAgUgovSyBbMTMgMCBSXQovUGFyZW50VHJlZSAxNCAwIFIKL1BhcmVudFRyZWVO\r\nZXh0S2V5IDEKPj4KZW5kb2JqCjIgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs1IDAgUl0K\r\nL0NvdW50IDEKPj4KZW5kb2JqCjEgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDIgMCBS\r\nCi9MYW5nIChlbi1VUykKL1N0cnVjdFRyZWVSb290IDMgMCBSCi9NYXJrSW5mbyA8PAovTWFya2Vk\r\nIHRydWUKPj4KPj4KZW5kb2JqCjE1IDAgb2JqCjw8Ci9DcmVhdG9yIDxGRUZGMDA0RDAwNjkwMDYz\r\nMDA3MjAwNkYwMDczMDA2RjAwNjYwMDc0MDBBRTAwMjAwMDU3MDA2RjAwNzIwMDY0MDAyMDAwMzIw\r\nMDMwMDAzMTAwMzY+Ci9DcmVhdGlvbkRhdGUgKEQ6MjAyMDA4MjAxMjMxMTArMDAnMDAnKQovUHJv\r\nZHVjZXIgKHd3dy5pbG92ZXBkZi5jb20pCi9Nb2REYXRlIChEOjIwMjAwODIwMTIzMTEwWikKPj4K\r\nZW5kb2JqCnhyZWYKMCAxNgowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDIwMTQgMDAwMDAgbg0K\r\nMDAwMDAwMTk1NyAwMDAwMCBuDQowMDAwMDAxODQ3IDAwMDAwIG4NCjAwMDAwMDE1NjQgMDAwMDAg\r\nbg0KMDAwMDAwMTA4MyAwMDAwMCBuDQowMDAwMDAwNDc3IDAwMDAwIG4NCjAwMDAwMDAwMTUgMDAw\r\nMDAgbg0KMDAwMDAwMDI1MiAwMDAwMCBuDQowMDAwMDAwNjQ3IDAwMDAwIG4NCjAwMDAwMDA3MDMg\r\nMDAwMDAgbg0KMDAwMDAwMDc2MCAwMDAwMCBuDQowMDAwMDAxMzgwIDAwMDAwIG4NCjAwMDAwMDE0\r\nNTMgMDAwMDAgbg0KMDAwMDAwMTUyMyAwMDAwMCBuDQowMDAwMDAyMTI4IDAwMDAwIG4NCnRyYWls\r\nZXIKPDwKL1NpemUgMTYKL1Jvb3QgMSAwIFIKL0luZm8gMTUgMCBSCi9JRCBbPDY2MDhFOTQxN0M1\r\nOUExNkEwNjAzMDgxQzY1MTk1MzNCPiA8RTU2RENDMTkyRjY1RjAwNzVDN0FDMjE2ODYxQjg1MjA+\r\nXQo+PgpzdGFydHhyZWYKMjM0NAolJUVPRgo=" + "body-is": "JVBERi0xLgoxIDAgb2JqPDwvUGFnZXMgMiAwIFI+PmVuZG9iagoyIDAgb2JqPDwvS2lkc1szIDAg\r\nUl0vQ291bnQgMT4+ZW5kb2JqCjMgMCBvYmo8PC9QYXJlbnQgMiAwIFI+PmVuZG9iagp0cmFpbGVy\r\nIDw8L1Jvb3QgMSAwIFI+Pg==" }, { "content-type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", @@ -1274,7 +1164,7 @@ Feature: SMTP sending of PLAIN messages to Internal recipient "content-disposition": "attachment", "content-disposition-filename": "testxml.xml", "transfer-encoding": "base64", - "body-is": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN1aXRlIFNZ\r\nU1RFTSAiaHR0cDovL3Rlc3RuZy5vcmcvdGVzdG5nLTEuMC5kdGQiID4KCjxzdWl0ZSBuYW1lPSJB\r\nZmZpbGlhdGUgTmV0d29ya3MiPgoKICAgIDx0ZXN0IG5hbWU9IkFmZmlsaWF0ZSBOZXR3b3JrcyIg\r\nZW5hYmxlZD0idHJ1ZSI+CiAgICAgICAgPGNsYXNzZXM+CiAgICAgICAgICAgIDxjbGFzcyBuYW1l\r\nPSJjb20uY2xpY2tvdXQuYXBpdGVzdGluZy5hZmZOZXR3b3Jrcy5Bd2luVUtUZXN0Ii8+CiAgICAg\r\nICAgPC9jbGFzc2VzPgogICAgPC90ZXN0PgoKPC9zdWl0ZT4=" + "body-is": "PD94bWwgdmVyc2lvbj0iMS4xIj8+PCFET0NUWVBFIF9bPCFFTEVNRU5UIF8gRU1QVFk+XT48Xy8+" }, { "content-type": "text/plain", From 856efec886138e5558eb699613906c050d9913cb Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Wed, 17 Jan 2024 09:13:01 +0100 Subject: [PATCH 45/58] fix(GODT-3160): updated external dependencies reported by govulncheck. --- go.mod | 12 ++++++------ go.sum | 21 ++++++++++++--------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index d7a0231c..5776c16d 100644 --- a/go.mod +++ b/go.mod @@ -45,10 +45,10 @@ require ( go.uber.org/goleak v1.2.1 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/net v0.17.0 - golang.org/x/sys v0.13.0 - golang.org/x/text v0.13.0 + golang.org/x/sys v0.16.0 + golang.org/x/text v0.14.0 google.golang.org/grpc v1.56.3 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 howett.net/plist v1.0.0 ) @@ -100,7 +100,7 @@ require ( github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/rivo/uniseg v0.4.2 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -111,9 +111,9 @@ require ( github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect gitlab.com/c0b/go-ordered-json v0.0.0-20201030195603-febf46534d5a // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.18.0 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/sync v0.2.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/tools v0.6.0 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 43f960f3..e976233e 100644 --- a/go.sum +++ b/go.sum @@ -358,8 +358,8 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= @@ -450,8 +450,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -519,8 +520,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -560,8 +561,9 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -582,8 +584,9 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -644,8 +647,8 @@ google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 76d257af21aff2e4afdd10ddfba27dd2592a85c6 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 17 Jan 2024 14:56:24 +0100 Subject: [PATCH 46/58] fix(GODT-3160): ignore non-called vulnerabilities. --- utils/govulncheck.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/govulncheck.sh b/utils/govulncheck.sh index fa465a4e..99bc6238 100755 --- a/utils/govulncheck.sh +++ b/utils/govulncheck.sh @@ -25,7 +25,7 @@ main(){ make gofiles govulncheck -json ./... > vulns.json - jq -r '.osv.id | select( . != null )' < vulns.json > vulns_osv_ids.txt + jq -r '.finding | select( (.osv != null) and (.trace[0].function != null) ) | .osv ' < vulns.json > vulns_osv_ids.txt ignore GO-2023-2102 "GODT-3160 update go to 1.21.4" ignore GO-2023-2043 "GODT-3160 update go to 1.21.4" From 773a230d14f698d78a7f428bf9974c0cb242bf01 Mon Sep 17 00:00:00 2001 From: Romain Le Jeune Date: Thu, 18 Jan 2024 16:45:08 +0000 Subject: [PATCH 47/58] fix(GODT-3176): assume inline if content id is present. --- pkg/message/parser.go | 24 ++++++++++--- pkg/message/parser_test.go | 22 ++++++++++++ .../text_html_image_inline_no_disposition.eml | 35 +++++++++++++++++++ 3 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 pkg/message/testdata/text_html_image_inline_no_disposition.eml diff --git a/pkg/message/parser.go b/pkg/message/parser.go index ecb85679..491d3323 100644 --- a/pkg/message/parser.go +++ b/pkg/message/parser.go @@ -119,7 +119,7 @@ func parse(p *parser.Parser, allowInvalidAddressLists bool) (Message, error) { } if err := patchInlineImages(p); err != nil { - return Message{}, err + return Message{}, errors.Wrap(err, "patching inline images failed") } m, err := parseMessageHeader(p.Root().Header, allowInvalidAddressLists) @@ -671,11 +671,10 @@ func patchInlineImages(p *parser.Parser) error { if rfc822.MIMEType(contentType) == rfc822.TextPlain { result[i] = &inlinePatchBodyOnly{part: curPart, contentTypeMap: contentTypeMap} } else if strings.HasPrefix(contentType, "image/") { - disposition, _, err := curPart.ContentDisposition() + disposition, err := getImageContentDisposition(curPart) if err != nil { - return fmt.Errorf("failted to get content disposition for child %v:%w", i, err) + return fmt.Errorf("failed to get content disposition for child %v:%w", i, err) } - if disposition == "inline" && !curPart.HasContentID() { if rfc822.MIMEType(prevContentType) == rfc822.TextPlain { result[i-1] = &inlinePatchBodyWithInlineImage{ @@ -707,6 +706,23 @@ func patchInlineImages(p *parser.Parser) error { return nil } +func getImageContentDisposition(curPart *parser.Part) (string, error) { + disposition, _, err := curPart.ContentDisposition() + if err == nil { + return disposition, nil + } + + if curPart.Header.Get("Content-Disposition") != "" { + return "", err + } + + if curPart.HasContentID() { + return "inline", nil + } + + return "attachment", nil +} + type inlinePatchJob interface { Patch() } diff --git a/pkg/message/parser_test.go b/pkg/message/parser_test.go index ca9fbdc8..6108270e 100644 --- a/pkg/message/parser_test.go +++ b/pkg/message/parser_test.go @@ -495,6 +495,7 @@ func TestParseTextHTMLWithImageInline(t *testing.T) { assert.Equal(t, `"Receiver" `, m.ToList[0].String()) require.Len(t, m.Attachments, 1) + require.Equal(t, m.Attachments[0].Disposition, proton.InlineDisposition) assert.Equal(t, fmt.Sprintf(`This is body of HTML mail with attachment`, m.Attachments[0].ContentID), string(m.RichBody)) assert.Equal(t, "This is body of *HTML mail* with attachment", string(m.PlainBody)) @@ -506,6 +507,27 @@ func TestParseTextHTMLWithImageInline(t *testing.T) { assert.Equal(t, 8, img.Height) } +func TestParseTextHTMLWithImageInlineNoDisposition(t *testing.T) { + f := getFileReader("text_html_image_inline_no_disposition.eml") + + m, err := Parse(f) + require.NoError(t, err) + + assert.Equal(t, `"Sender" `, m.Sender.String()) + assert.Equal(t, `"Receiver" `, m.ToList[0].String()) + + require.Len(t, m.Attachments, 1) + + assert.Equal(t, `This is body of HTML mail with attachment`, string(m.RichBody)) + assert.Equal(t, "This is body of *HTML mail* with attachment", string(m.PlainBody)) + + // The inline image is an 8x8 mic-dropping gopher. + img, err := png.DecodeConfig(bytes.NewReader(m.Attachments[0].Data)) + require.NoError(t, err) + assert.Equal(t, 8, img.Width) + assert.Equal(t, 8, img.Height) +} + func TestParseWithAttachedPublicKey(t *testing.T) { f := getFileReader("text_plain.eml") diff --git a/pkg/message/testdata/text_html_image_inline_no_disposition.eml b/pkg/message/testdata/text_html_image_inline_no_disposition.eml new file mode 100644 index 00000000..d0e7c4ac --- /dev/null +++ b/pkg/message/testdata/text_html_image_inline_no_disposition.eml @@ -0,0 +1,35 @@ +From: Sender +To: Receiver +Content-Type: multipart/mixed; boundary=longrandomstring + +--longrandomstring +Content-Type: text/html + +This is body of HTML mail with attachment +--longrandomstring +Content-Type: image/png +Content-ID: +Content-Transfer-Encoding: base64 + +iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAACBjSFJ +NAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhGVYSWZNTQAqAAAACAAFAR +IAAwAAAAEAAQAAARoABQAAAAEAAABKARsABQAAAAEAAABSASgAAwAAAAEAAgAAh2kABAAAAAEAA +ABaAAAAAAAAASwAAAABAAABLAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAACKADAAQAAAAB +AAAACAAAAAAAXWZ6AAAACXBIWXMAAC4jAAAuIwF4pT92AAACZmlUWHRYTUw6Y29tLmFkb2JlLnh +tcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIE +NvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5O +TkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91 +dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4 +wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC +8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgI +CAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAg +ICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl +4ZWxYRGltZW5zaW9uPjE2PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UG +l4ZWxZRGltZW5zaW9uPjE2PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY +3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CgZBD4sAAAEISURBVBgZY2CAAO5F +x07Zz96xZ0Pn4lXqIKGGhgYmsFTHvAWdW6/dvnb89Yf/B5+9/r/y9IXzbVPahCH6/jMysfAJygo +JC2r++/T619Mb139J8HIb8Gs5hYMUzJ+/gJ1Jmo9H6c+L5wz3bt5iEeLmYOHn42fQ4vyacqGNQS +0xMfEHc7Cvl6CYho4rh5jUPyYefqafLKyMbH9+/d28/dFfdWtfDaZvTy7Zvv72nYGZkeEvw98/f +5j//2P4yCvxq/nU7zVs//8yM2gzMMitOnnu5cUff/8ff/v5/5Xf///vuHBhJcSRDAws9aEMr38c +W7XjNgvzexZ2rn9vbjx/IXl/M9iLM2fOZAUAKCZv7dU+UgAAAAAASUVORK5CYII= +--longrandomstring-- From 56aa497b9dc0230161f014de55dfcff9d89b371d Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 23 Jan 2024 11:49:50 +0100 Subject: [PATCH 48/58] feat(GODT-3169): load pipeline env from bridge internal. --- .gitlab-ci.yml | 3 +-- ci/env.yml | 35 +++++++---------------------------- ci/setup.yml | 7 +++++++ ci/test.yml | 28 +++++++++++++++++----------- 4 files changed, 32 insertions(+), 41 deletions(-) create mode 100644 ci/setup.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 44f556b4..ba8d8f7f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,8 +16,6 @@ # along with ProtonMail Bridge. If not, see . --- -image: gitlab.protontech.ch:4567/go/bridge-internal:test-go1.20 - default: tags: - shared-small @@ -35,6 +33,7 @@ stages: - build include: + - local: ci/setup.yml - local: ci/rules.yml - local: ci/env.yml - local: ci/test.yml diff --git a/ci/env.yml b/ci/env.yml index 4968666a..4252b93b 100644 --- a/ci/env.yml +++ b/ci/env.yml @@ -4,18 +4,8 @@ .env-windows: before_script: - export BRIDGE_SYNC_FORCE_MINIMUM_SPEC=1 - - export GOROOT=/c/Go1.20/ - - export PATH=$GOROOT/bin:$PATH - - export GOARCH=amd64 - - export GOPATH=~/go1.20 - - export GO111MODULE=on - - export PATH="${GOPATH}/bin:${PATH}" - - export MSYSTEM= - - export QT6DIR=/c/grrrQt/6.4.3/msvc2019_64 - - export PATH=$PATH:${QT6DIR}/bin - - export PATH="/c/Program Files/Microsoft Visual Studio/2022/Community/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin:$PATH" - - $(git config --global -l | grep -o 'url.*gitlab.protontech.ch.*insteadof' | xargs -L 1 git config --global --unset &> /dev/null) || echo "nothing to remove" - - git config --global url.https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}.insteadOf https://${CI_SERVER_HOST} + - !reference [.before-script-windows-aws-build, before_script] + - !reference [.before-script-git-config, before_script] - git config --global safe.directory '*' - git status --porcelain cache: {} @@ -25,23 +15,14 @@ .env-darwin: before_script: - export BRIDGE_SYNC_FORCE_MINIMUM_SPEC=1 - - export PATH=/usr/local/bin:$PATH - - export PATH=/usr/local/opt/git/bin:$PATH - - export PATH=/usr/local/opt/make/libexec/gnubin:$PATH - - export PATH=/usr/local/opt/gnu-sed/libexec/gnubin:$PATH - - export GOROOT=~/local/opt/go@1.20 - - export PATH="${GOROOT}/bin:$PATH" - - export GOPATH=~/go1.20 - - export PATH="${GOPATH}/bin:$PATH" - - export QT6DIR=/opt/Qt/6.4.3/macos - - export PATH="${QT6DIR}/bin:$PATH" - - uname -a + - !reference [.before-script-darwin-build, before_script] cache: {} tags: - macos-m1-bridge .env-linux-build: - image: gitlab.protontech.ch:4567/go/bridge-internal:build-go1.20-qt6.4.3 + extends: + - .image-linux-build variables: VCPKG_DEFAULT_BINARY_CACHE: ${CI_PROJECT_DIR}/.cache cache: @@ -50,13 +31,11 @@ - .cache when: 'always' before_script: - - mkdir -p .cache/bin - export BRIDGE_SYNC_FORCE_MINIMUM_SPEC=1 + - !reference [.before-script-git-config, before_script] + - mkdir -p .cache/bin - export PATH=$(pwd)/.cache/bin:$PATH - export GOPATH="$CI_PROJECT_DIR/.cache" - - export PATH=$PATH:$QT6DIR/bin - - $(git config --global -l | grep -o 'url.*gitlab.protontech.ch.*insteadof' | xargs -L 1 git config --global --unset &> /dev/null) || echo "nothing to remove" - - git config --global url.https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}.insteadOf https://${CI_SERVER_HOST} tags: - shared-large diff --git a/ci/setup.yml b/ci/setup.yml new file mode 100644 index 00000000..9c6b63f7 --- /dev/null +++ b/ci/setup.yml @@ -0,0 +1,7 @@ +--- + +include: + - project: 'go/bridge-internal' + ref: 'feat/godt-3160' + file: 'ci/runners-setup.yml' + diff --git a/ci/test.yml b/ci/test.yml index 5b8e055b..6b7475f9 100644 --- a/ci/test.yml +++ b/ci/test.yml @@ -4,15 +4,17 @@ lint: stage: test extends: + - .image-linux-test - .rules-branch-manual-br-tag-and-MR-and-devel-always script: - make lint tags: - shared-medium -bug-report-preview: +lint-bug-report-preview: stage: test extends: + - .image-linux-test - .rules-branch-and-MR-manual script: - make lint-bug-report-preview @@ -31,13 +33,25 @@ bug-report-preview: test-linux: extends: + - .image-linux-test - .script-test tags: - shared-large +test-windows: + extends: + - .env-windows + - .script-test + +test-darwin: + extends: + - .env-darwin + - .script-test + fuzz-linux: stage: test extends: + - .image-linux-test - .rules-branch-manual-MR-and-devel-always script: - make fuzz @@ -86,19 +100,10 @@ test-integration-nightly: paths: - nightly-job.log -test-windows: - extends: - - .env-windows - - .script-test - -test-darwin: - extends: - - .env-darwin - - .script-test - test-coverage: stage: test extends: + - .image-linux-test - .rules-branch-manual-scheduled-and-test-branch-always script: - ./utils/coverage.sh @@ -123,6 +128,7 @@ test-coverage: go-vuln-check: extends: + - .image-linux-test - .rules-branch-manual-MR-and-devel-always stage: test tags: From 1cd35defe527f23a7b894b3da6cc96734532fa6d Mon Sep 17 00:00:00 2001 From: Jakub Cuth Date: Tue, 23 Jan 2024 14:13:23 +0000 Subject: [PATCH 49/58] feat(GODT-3160): bump version Go 1.21.6 Qt 6.4.3. --- BUILDS.md | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/BUILDS.md b/BUILDS.md index 261ecd69..175fc96c 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -3,7 +3,7 @@ ## Prerequisites * 64-bit OS: - the go-rfc5322 module cannot currently be compiled for 32-bit OSes -* Go 1.20 +* Go 1.21.6 * Bash with basic build utils: make, gcc, sed, find, grep, ... - For Windows, it is recommended to use MinGW 64bit shell from [MSYS2](https://www.msys2.org/) * GCC (Linux), msvc (Windows) or Xcode (macOS) diff --git a/go.mod b/go.mod index 5776c16d..55a1546c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/ProtonMail/proton-bridge/v3 -go 1.20 +go 1.21 require ( github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557 From 374194c13bd6f7d566c77c5fdd0cffc4c2285945 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 24 Jan 2024 10:22:43 +0100 Subject: [PATCH 50/58] feat(GODT-3160): make linter happy --- Makefile | 2 +- internal/versioner/version.go | 3 ++- internal/versioner/version_test.go | 2 +- internal/versioner/versioner_test.go | 2 +- tests/collector_test.go | 14 +++++++++----- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 9b381d3a..55cbe24d 100644 --- a/Makefile +++ b/Makefile @@ -185,7 +185,7 @@ ${RESOURCE_FILE}: ./dist/info.rc ./dist/${SRC_ICO} .FORCE ## Dev dependencies .PHONY: install-devel-tools install-linter install-go-mod-outdated install-git-hooks -LINTVER:="v1.52.2" +LINTVER:="v1.55.2" LINTSRC:="https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh" install-dev-dependencies: install-devel-tools install-linter install-go-mod-outdated diff --git a/internal/versioner/version.go b/internal/versioner/version.go index bfd3b149..88c85e48 100644 --- a/internal/versioner/version.go +++ b/internal/versioner/version.go @@ -30,6 +30,7 @@ import ( ) const sumFile = ".sum" +const sigFile = ".sig" type Version struct { version *semver.Version @@ -83,7 +84,7 @@ func VerifyUpdateFolder(kr *crypto.KeyRing, path string) error { return err } - sigBytes, err := os.ReadFile(filepath.Join(path, sumFile+".sig")) //nolint:gosec + sigBytes, err := os.ReadFile(filepath.Join(path, sumFile+sigFile)) //nolint:gosec if err != nil { return err } diff --git a/internal/versioner/version_test.go b/internal/versioner/version_test.go index cf839852..869b6e9c 100644 --- a/internal/versioner/version_test.go +++ b/internal/versioner/version_test.go @@ -136,5 +136,5 @@ func signFile(t *testing.T, path string, kr *crypto.KeyRing) { sig, err := kr.SignDetached(crypto.NewPlainMessage(file)) require.NoError(t, err) - require.NoError(t, os.WriteFile(path+".sig", sig.GetBinary(), 0o700)) + require.NoError(t, os.WriteFile(path+sigFile, sig.GetBinary(), 0o700)) } diff --git a/internal/versioner/versioner_test.go b/internal/versioner/versioner_test.go index f5ae301e..6bf92c72 100644 --- a/internal/versioner/versioner_test.go +++ b/internal/versioner/versioner_test.go @@ -66,7 +66,7 @@ func makeDummyVersionDirectory(t *testing.T, exeName, updates, version string) s require.NoError(t, exe.Close()) require.NoError(t, os.Chmod(exe.Name(), 0o700)) - sig, err := os.Create(filepath.Join(target, getExeName(exeName)+".sig")) + sig, err := os.Create(filepath.Join(target, getExeName(exeName)+sigFile)) require.NoError(t, err) require.NotNil(t, sig) require.NoError(t, sig.Close()) diff --git a/tests/collector_test.go b/tests/collector_test.go index c1a56395..1eb74213 100644 --- a/tests/collector_test.go +++ b/tests/collector_test.go @@ -63,13 +63,17 @@ func (c *eventCollector) collectFrom(eventCh <-chan events.Event) <-chan events. } func awaitType[T events.Event](c *eventCollector, ofType T, timeout time.Duration) (T, bool) { - if event := c.await(ofType, timeout); event == nil { + event := c.await(ofType, timeout) + + if event == nil { return *new(T), false //nolint:gocritic - } else if event, ok := event.(T); !ok { - panic(fmt.Errorf("unexpected event type %T", event)) - } else { - return event, true } + + if eventT, ok := event.(T); !ok { + return eventT, true + } + + panic(fmt.Errorf("unexpected event type %T", event)) } func (c *eventCollector) await(ofType events.Event, timeout time.Duration) events.Event { From 164fb236532fb6a6490c8855df749f08da6f0bbd Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 24 Jan 2024 10:30:30 +0100 Subject: [PATCH 51/58] feat(GODT-3160): no need to ignore vulns --- ci/setup.yml | 2 +- ci/test.yml | 1 - tests/collector_test.go | 2 +- utils/govulncheck.sh | 9 --------- 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/ci/setup.yml b/ci/setup.yml index 9c6b63f7..087e7a76 100644 --- a/ci/setup.yml +++ b/ci/setup.yml @@ -2,6 +2,6 @@ include: - project: 'go/bridge-internal' - ref: 'feat/godt-3160' + ref: 'master' file: 'ci/runners-setup.yml' diff --git a/ci/test.yml b/ci/test.yml index 6b7475f9..91160848 100644 --- a/ci/test.yml +++ b/ci/test.yml @@ -134,7 +134,6 @@ go-vuln-check: tags: - shared-medium script: - - apt-get -y install jq - ./utils/govulncheck.sh artifacts: when: always diff --git a/tests/collector_test.go b/tests/collector_test.go index 1eb74213..e74200d0 100644 --- a/tests/collector_test.go +++ b/tests/collector_test.go @@ -69,7 +69,7 @@ func awaitType[T events.Event](c *eventCollector, ofType T, timeout time.Duratio return *new(T), false //nolint:gocritic } - if eventT, ok := event.(T); !ok { + if eventT, ok := event.(T); ok { return eventT, true } diff --git a/utils/govulncheck.sh b/utils/govulncheck.sh index 99bc6238..86411ae7 100755 --- a/utils/govulncheck.sh +++ b/utils/govulncheck.sh @@ -27,15 +27,6 @@ main(){ jq -r '.finding | select( (.osv != null) and (.trace[0].function != null) ) | .osv ' < vulns.json > vulns_osv_ids.txt - ignore GO-2023-2102 "GODT-3160 update go to 1.21.4" - ignore GO-2023-2043 "GODT-3160 update go to 1.21.4" - ignore GO-2023-2041 "GODT-3160 update go to 1.21.4" - ignore GO-2023-1878 "GODT-3160 update go to 1.21.4" - ignore GO-2023-1987 "GODT-3160 update go to 1.21.4" - ignore GO-2023-1840 "GODT-3160 update go to 1.21.4" - ignore GO-2023-2185 "GODT-3160 update go to 1.21.4" - ignore GO-2023-2186 "GODT-3160 update go to 1.21.4" - ignore GO-2023-2382 "GODT-3160 update go to 1.21.4" ignore GO-2023-2328 "GODT-3124 RESTY race condition" has_vulns From 5df95566b771df11268626253f0d4667efe4331a Mon Sep 17 00:00:00 2001 From: Jakub Date: Thu, 25 Jan 2024 10:10:11 +0100 Subject: [PATCH 52/58] chore: Ypsilon Bridge 3.9.0 changelog. --- Changelog.md | 31 +++++++++++++++++++++++++++++++ Makefile | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index 64f7183e..addd4836 100644 --- a/Changelog.md +++ b/Changelog.md @@ -3,6 +3,37 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## Ypsilon Bridge 3.9.0 + +### Added +* GODT-3195: Add OS info to the log. +* GODT-3156: Add time zone info to the bridge log. +* GODT-3162: Test: Add test scenarios for KB article suggestions. +* Test: Add scenarios for checking messages sent from Web Client. +* GODT-3162: Test: Add step definition for checking KB article suggestions. + +### Changed +* GODT-3160: Bump version Go 1.21.6. +* GODT-3169: Load pipeline env from bridge internal. +* GODT-3052: Test: Replace attachments and inline content in feature tests with the smallest valid versions. +* GODT-3155: Customize log formatter for easier parsing. +* GODT-3172: Detect missing keychain item. +* GODT-3172: Do not list, just retrieve vault key. +* Log the message received time when handling message creation event. +* Set log as artefact for all integration test. +* Get better logging arround keychain list initialisation. + +### Fixed +* GODT-3176: Assume inline if content id is present. +* GODT-3160: Ignore non-called vulnerabilities. +* GODT-3160: Updated external dependencies reported by govulncheck. +* GODT-3203: Crash in chunkDivide. +* Fix for SMTP connection mode toggle in bridge-gui-tester. +* GODT-3183: Fix database indices. +* GODT-3187: Fix numberOfDay computation when changing year and day. +* GODT-3188: Happy new year. + + ## Xikou Bridge 3.8.1 ### Added diff --git a/Makefile b/Makefile index 55cbe24d..1074e832 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.8.1+git +BRIDGE_APP_VERSION?=3.9.0+git APP_VERSION:=${BRIDGE_APP_VERSION} APP_FULL_NAME:=Proton Mail Bridge APP_VENDOR:=Proton AG From a433da8782cd6b193d2214da8c609603d5ddb1de Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Mon, 29 Jan 2024 07:52:08 +0100 Subject: [PATCH 53/58] fix(GODT-3228): get rid of fork of docker-credential-helpers. --- go.mod | 7 +++---- go.sum | 27 ++++++++++++++++++++------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 55a1546c..d51cedb9 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/bradenaw/juniper v0.12.0 github.com/cucumber/godog v0.12.5 github.com/cucumber/messages-go/v16 v16.0.1 - github.com/docker/docker-credential-helpers v0.6.3 + github.com/docker/docker-credential-helpers v0.8.1 github.com/elastic/go-sysinfo v1.11.2-0.20231129083954-35e55cd2a542 github.com/emersion/go-imap v1.2.1 github.com/emersion/go-imap-id v0.0.0-20190926060100-f94a56b9ecde @@ -39,7 +39,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 github.com/sirupsen/logrus v1.9.2 - github.com/stretchr/testify v1.8.3 + github.com/stretchr/testify v1.8.4 github.com/urfave/cli/v2 v2.24.4 github.com/vmihailenco/msgpack/v5 v5.3.5 go.uber.org/goleak v1.2.1 @@ -66,7 +66,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/cronokirby/saferith v0.33.0 // indirect github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect - github.com/danieljoos/wincred v1.1.2 // indirect + github.com/danieljoos/wincred v1.2.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/elastic/go-windows v1.0.1 // indirect github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 // indirect @@ -120,7 +120,6 @@ require ( ) replace ( - github.com/docker/docker-credential-helpers => github.com/ProtonMail/docker-credential-helpers v1.1.0 github.com/emersion/go-message => github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7 github.com/emersion/go-smtp => github.com/ProtonMail/go-smtp v0.0.0-20231109081432-2b3d50599865 github.com/go-resty/resty/v2 => github.com/LBeernaertProton/resty/v2 v2.0.0-20231129100320-dddf8030d93a diff --git a/go.sum b/go.sum index e976233e..03af54f9 100644 --- a/go.sum +++ b/go.sum @@ -22,12 +22,11 @@ github.com/LBeernaertProton/resty/v2 v2.0.0-20231129100320-dddf8030d93a/go.mod h github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/bcrypt v0.0.0-20210511135022-227b4adcab57/go.mod h1:HecWFHognK8GfRDGnFQbW/LiV7A3MX3gZVs45vk5h8I= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs69zUkSzubzjBbL+cmOXgnmt9Fyd9ug= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= -github.com/ProtonMail/docker-credential-helpers v1.1.0 h1:+kvUIpwWcbtP3WFv5sSvkFn/XLzSqPOB5AAthuk9xPk= -github.com/ProtonMail/docker-credential-helpers v1.1.0/go.mod h1:mK0aBveCxhnQ756AmaTfXMZDeULvheYVhF/MWMErN5g= github.com/ProtonMail/gluon v0.17.1-0.20240102132144-89b40fb6fe7e h1:DR97ydcuS4/EjTTCkp7F9IRCi+ykD1UoAP7UBFtEcRA= github.com/ProtonMail/gluon v0.17.1-0.20240102132144-89b40fb6fe7e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a h1:D+aZah+k14Gn6kmL7eKxoo/4Dr/lK3ChBcwce2+SQP4= @@ -109,18 +108,23 @@ github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/cuthix/go-keychain v0.0.0-20240103134243-0b6a41580b77 h1:sdB/yJMbubPQothFl6KYCOrMBRgy0pZbBXIWoJqSFLo= github.com/cuthix/go-keychain v0.0.0-20240103134243-0b6a41580b77/go.mod h1:ZoZU1fnBy3mOLWr3Pg+Y2+nTKtu6ypDte2kZg9HvSwY= -github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= -github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= -github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= +github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= +github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.1 h1:j/eKUktUltBtMzKqmfLB0PAgqYyMHOp5vfsD1807oKo= +github.com/docker/docker-credential-helpers v0.8.1/go.mod h1:P3ci7E3lwkZg6XiHdRKft1KckHiO9a2rNtyFbZ/ry9M= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/elastic/go-sysinfo v1.11.2-0.20231129083954-35e55cd2a542 h1:IFTm6NBbfSgZCaeEzorQhH4T7ZERl4j+1u7oXWzmJcM= github.com/elastic/go-sysinfo v1.11.2-0.20231129083954-35e55cd2a542/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= @@ -157,6 +161,7 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200625191551-73d3c3675aa3/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -164,6 +169,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -182,6 +188,7 @@ github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -283,9 +290,11 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/lucor/goinfo v0.0.0-20200401173949-526b5363a13a/go.mod h1:ORP3/rB5IsulLEBwQZCJyyV6niqmI7P4EWSmkug+1Ng= @@ -331,7 +340,9 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= @@ -341,6 +352,7 @@ github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNc github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -367,6 +379,7 @@ github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -408,8 +421,9 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -547,7 +561,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 5b4c6870b5a6e1db6d3d2aea4cfa9f2485f42e47 Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Mon, 29 Jan 2024 08:03:49 +0100 Subject: [PATCH 54/58] fix(GODT-3228): update COPYING_NOTES.md --- COPYING_NOTES.md | 1 - 1 file changed, 1 deletion(-) diff --git a/COPYING_NOTES.md b/COPYING_NOTES.md index 3659d2e3..347ed9eb 100644 --- a/COPYING_NOTES.md +++ b/COPYING_NOTES.md @@ -132,7 +132,6 @@ Proton Mail Bridge includes the following 3rd party software: * [tools](https://golang.org/x/tools) available under [license](https://cs.opensource.google/go/x/tools/+/master:LICENSE) * [genproto](https://google.golang.org/genproto) available under [license](https://pkg.go.dev/google.golang.org/genproto?tab=licenses) * [yaml](https://gopkg.in/yaml.v3) available under [license](https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE) -* [docker-credential-helpers](https://github.com/ProtonMail/docker-credential-helpers) available under [license](https://github.com/ProtonMail/docker-credential-helpers/blob/master/LICENSE) * [go-message](https://github.com/ProtonMail/go-message) available under [license](https://github.com/ProtonMail/go-message/blob/master/LICENSE) * [go-smtp](https://github.com/ProtonMail/go-smtp) available under [license](https://github.com/ProtonMail/go-smtp/blob/master/LICENSE) * [resty](https://github.com/LBeernaertProton/resty/v2) available under [license](https://github.com/LBeernaertProton/resty/v2/blob/master/LICENSE) From fdb5c0cbee7078a5773a7cb1aff4af8a23371d00 Mon Sep 17 00:00:00 2001 From: Jakub Date: Mon, 29 Jan 2024 11:17:23 +0100 Subject: [PATCH 55/58] chore: Ypsilon Bridge 3.9.0 changelog. --- Changelog.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog.md b/Changelog.md index addd4836..5f7790d2 100644 --- a/Changelog.md +++ b/Changelog.md @@ -14,7 +14,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) ### Changed * GODT-3160: Bump version Go 1.21.6. -* GODT-3169: Load pipeline env from bridge internal. +* GODT-3160: Load pipeline env from bridge internal. * GODT-3052: Test: Replace attachments and inline content in feature tests with the smallest valid versions. * GODT-3155: Customize log formatter for easier parsing. * GODT-3172: Detect missing keychain item. @@ -24,6 +24,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * Get better logging arround keychain list initialisation. ### Fixed +* GODT-3228: Get rid of fork of docker-credential-helpers. * GODT-3176: Assume inline if content id is present. * GODT-3160: Ignore non-called vulnerabilities. * GODT-3160: Updated external dependencies reported by govulncheck. From bfde96dc88465cd6c45c1fedf60ef6f600e6f4e5 Mon Sep 17 00:00:00 2001 From: Gjorgji Slamkov Date: Mon, 29 Jan 2024 11:33:55 +0000 Subject: [PATCH 56/58] feat(GODT-3230): Scripts for removing Bridge from device --- utils/remove-bridge/README.md | 116 +++++++++++ utils/remove-bridge/Remove-Bridge.ps1 | 169 ++++++++++++++++ utils/remove-bridge/remove_bridge | 268 ++++++++++++++++++++++++++ 3 files changed, 553 insertions(+) create mode 100644 utils/remove-bridge/README.md create mode 100644 utils/remove-bridge/Remove-Bridge.ps1 create mode 100755 utils/remove-bridge/remove_bridge diff --git a/utils/remove-bridge/README.md b/utils/remove-bridge/README.md new file mode 100644 index 00000000..7b72981a --- /dev/null +++ b/utils/remove-bridge/README.md @@ -0,0 +1,116 @@ +# Clean Bridge + +## Description + +This repository contains scripts with which just by running them Bridge will quit, uninstall, and remove all leftover resources from your device. On Windows it will delete the entry(ies) in the Credential Manager, on macOS it will delete the entries from the Keychain Access, and on Linux distros it will try to delete the credentials both from `gnome-keyring` and `pass`. +There's a PowerShell script for Windows, and a Shell script for Linux & macOS. + +--- + +### --WARNING-- + +These scripts are made with the assumption that there isn't another process with the `bridge` name in it. Be careful when using it on your own devices, it might kill another process with `bridge` in it's name. + +The Shell script [remove_bridge](/remove_bridge) does not quit the process of Bridge V2. You'll need to manually quit it before executing this script. In the current implementation the process that the script quits is `bridge-gui` because when it was `bridge` previously, on Ubuntu the script closed itself not Bridge. + +--- + +## Installation + +There's no installation needed. Just download the script relevant for your Operating System, or clone the whole repo. + +## Prerequisites + +The `remove_bridge` script requires `zsh` to be executed. + +## Usage + +Run the script on your device when you need it. + +On Linux distros it needs to be ran with `sudo` so it can uninstall Bridge. + +### Linux & macOS + +Recommendation for Linux & macOS is to place it in you `$PATH` location so you can run it immediately from the terminal when needed. + +### Windows + +To use the script without the need to input the full path of it, you can place it in a specific directory and add that directory to the PowerShell profile ([wiki link](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.3)) of the PowerShell version you are using so it's loaded in each session. Then you can just enter the name of the script to run it no matter the active directory in the session. + +The `$PROFILE` automatic variable stores the paths to the PowerShell profiles that are available in the current session. +To view a profile path, display the value of the `$PROFILE` variable. + +```PowerShell +PS C:\Users\Gjorgji> Write-Output $PROFILE +C:\Users\Gjorgji\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 +PS C:\Users\Gjorgji> +``` + +The `$PROFILE` variable stores the path to the "Current User, Current Host" profile. The other profiles are saved in note properties of the $PROFILE variable. +For example, the `$PROFILE` variable has the following values in the Windows PowerShell console. + +- Current User, Current Host - $PROFILE +- Current User, Current Host - $PROFILE.CurrentUserCurrentHost +- Current User, All Hosts - $PROFILE.CurrentUserAllHosts +- All Users, Current Host - $PROFILE.AllUsersCurrentHost +- All Users, All Hosts - $PROFILE.AllUsersAllHosts + +The script folder can be added to the profile at `$PROFILE.AllUsersAllHosts`, but where you place it it's up to you. The guide continues by just using `$PROFILE` for "Current User, Current Host". + +#### **Create the Profile file** + +By default, the Profile file is not created so you'll need to create it yourself before adding the script directory in it. If you have the Profile file already created skip to the [next step](#adding-the-script-directory-to-the-profile). + +To create the file, open a PowerShell terminal and input: + +```PowerShell +if (!(Test-Path -Path )) { + New-Item -ItemType File -Path -Force +} +``` + +For example, to create a profile for the current user in the current PowerShell host application, use the following command: + +```PowerShell +if (!(Test-Path -Path $PROFILE)) { + New-Item -ItemType File -Path $PROFILE -Force +} +``` + +#### **Adding the script directory to the Profile** + +To edit the $PROFILE file, open it with your favorite text editor, or just open your PowerShell terminal and input: + +```PowerShell +PS C:\Users\Gjorgji> notepad $PROFILE +``` + +This will open the Profile file with the default Windows Notepad. + +Once the file is opened, add the following and save the file: + +```PowerShell +# Load scripts from the following locations +$env:Path += ";" +``` + +As an example, if the script is placed in `C:\Users\Gjorgji\Documents\PowerShell\Scripts`, this line will be in the Profile: + +```PowerShell +# Load scripts from the following location +$env:Path += ";$HOME\Documents\PowerShell\Scripts" +``` + +#### **Finally** + +After doing all the above, restart your PowerShell terminal so the changes take effect, and whenever needed just run `Remove-Bridge` + +```PowerShell +╭─    ~\bridge    devel ≡  ?1 ~1   ✔  08:43:49  ─╮ +╰─ Remove-Bridge ─╯ +All Bridge resource folders deleted! + +CMDKEY: Credential deleted successfully. +╭─    ~\bridge    devel ≡  ?1 ~1   37.152s   ✔  08:45:43  ─╮ +╰─ ─╯ +``` diff --git a/utils/remove-bridge/Remove-Bridge.ps1 b/utils/remove-bridge/Remove-Bridge.ps1 new file mode 100644 index 00000000..74496a87 --- /dev/null +++ b/utils/remove-bridge/Remove-Bridge.ps1 @@ -0,0 +1,169 @@ +# Copyright (c) 2024 Proton AG +# +# This file is part of Proton Mail Bridge. +# +# Proton Mail Bridge is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Proton Mail Bridge is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Proton Mail Bridge. If not, see . + +# Remove-Bridge is a script for quitting, uninstalling, and deleted all Bridge related files on Windows + +# Define variables with path to Bridge files (vault, cache, startup entry etc) +$RoamProtonmail = "$env:APPDATA\protonmail" +$RoamProtonAG = "$env:APPDATA\Proton AG" +$LocalProtonmail = "$env:LOCALAPPDATA\protonmail" +$LocalProtonAG = "$env:LOCALAPPDATA\Proton AG" +$StartUpProtonBridge = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\Proton Mail Bridge.lnk" + +function Uninstall-PMBridge { + # Uninstalling REBRANDED version of Bridge + # Find the UninstallSTring in the registry (64bit & 32bit) + # Use the UninstallString with `msiexec.exe` to uninstall Bridge + + $registry64 = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_ -match "Proton Mail Bridge" } | Select-Object UninstallString + + if ($registry64) { + $registry64 = $registry64 | Select-Object -Last 1 + $registry64 = $registry64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" + $registry64 = $registry64.Trim() + Start-Process "msiexec.exe" -arg "/X $registry64 /passive" -Wait + } + + $registry32 = Get-ChildItem "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_ -match "Proton Mail Bridge" } | Select-Object UninstallString + + if ($registry32) { + $registry32 = $registry32 | Select-Object -Last 1 + $registry32 = $registry32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" + $registry32 = $registry32.Trim() + Start-Process "msiexec.exe" -arg "/X $registry32 /passive" -Wait + } + + + # Uninstalling PRE-REBRANDED version of Bridge + # Find the UninstallSTring in the registry (64bit & 32bit) + # Use the UninstallString with `msiexec.exe` to uninstall Bridge + + $preRebrandRegistry64 = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_ -match "ProtonMail Bridge" } | Select-Object UninstallString + + if ($preRebrandRegistry64) { + $preRebrandRegistry64 = $preRebrandRegistry64 | Select-Object -Last 1 + $preRebrandRegistry64 = $preRebrandRegistry64.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" + $preRebrandRegistry64 = $preRebrandRegistry64.Trim() + Start-Process "msiexec.exe" -arg "/X $preRebrandRegistry64 /passive" -Wait + } + + $preRebrandRegistry32 = Get-ChildItem "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object { Get-ItemProperty $_.PSPath } | Where-Object { $_ -match "ProtonMail Bridge" } | Select-Object UninstallString + + if ($preRebrandRegistry32) { + $preRebrandRegistry32 = $preRebrandRegistry32 | Select-Object -Last 1 + $preRebrandRegistry32 = $preRebrandRegistry32.UninstallString -Replace "msiexec.exe","" -Replace "/I","" -Replace "/X","" + $preRebrandRegistry32 = $preRebrandRegistry32.Trim() + Start-Process "msiexec.exe" -arg "/X $preRebrandRegistry32 /passive" -Wait + } + +} + + +function Stop-PMBridge { + # Stop the `bridge` process to completely quit Bridge + + $bridge = Get-Process "bridge" -ErrorAction SilentlyContinue + + if ($bridge){ + + $bridge | Stop-Process -Force + + } + +} + + +function Remove-PMBridgeResources { + # Delete all the Bridge resource folders + # They should be deleted with uninstalling Bridge + # But to just make sure do this again + + Remove-Item $RoamProtonmail -Force -Recurse -ErrorAction SilentlyContinue + Remove-Item $RoamProtonAG -Force -Recurse -ErrorAction SilentlyContinue + Remove-Item $LocalProtonmail -Force -Recurse -ErrorAction SilentlyContinue + Remove-Item $LocalProtonAG -Force -Recurse -ErrorAction SilentlyContinue + Remove-Item $StartUpProtonBridge -Force -Recurse -ErrorAction SilentlyContinue + +} + + +function Find-PMBridgeResources { + # Search and check if the Bridge resource folders + # Are deleted + # Write to Output the result + + $FolderExists = $false + + if ( Test-Path -Path $RoamProtonmail ){ + Write-Host "`r`n'$RoamProtonmail' is not deleted!" -ForegroundColor Red + $FolderExists = $true + } + + if ( Test-Path -Path $RoamProtonAG ) { + Write-Host "`r`n'$RoamProtonAG' is not deleted!" -ForegroundColor Red + $FolderExists = $true + } + + if ( Test-Path -Path $LocalProtonmail ) { + Write-Host "`r`n'$LocalProtonmail' is not deleted!" -ForegroundColor Red + $FolderExists = $true + } + + if ( Test-Path -Path $LocalProtonAG ) { + Write-Host "`r`n'$LocalProtonAG' is not deleted!" -ForegroundColor Red + $FolderExists = $true + } + + if ( Test-Path -Path $StartUpProtonBridge ) { + Write-Host "`r`n'$StartUpProtonBridge' is not deleted!" -ForegroundColor Red + $FolderExists = $true + } + + if ( $FolderExists ) { + Write-Host "`r`nSome directories were not deleted properly!`r`n" -ForegroundColor Red + } + + else { + Write-Host "`r`nAll Bridge resource folders deleted!`r`n" -ForegroundColor Green + } + +} + + +function Remove-PMBridgeCredentials { + # Delete the entries in the credential manager + + $CredentialsData = @((cmdkey /listall | Where-Object{$_ -like "*LegacyGeneric:target=protonmail*"}).replace("Target: ","")) + + for($i =0; $i -le ($CredentialsData.Count -1); $i++){ + [string]$DeleteData = $CredentialsData[$i].trim() + cmdkey /delete:$DeleteData + } + +} + + +function Invoke-BridgeFunctions { + Stop-PMBridge + Uninstall-PMBridge + Remove-PMBridgeResources + Find-PMBridgeResources + Remove-PMBridgeCredentials +} + + +Invoke-BridgeFunctions diff --git a/utils/remove-bridge/remove_bridge b/utils/remove-bridge/remove_bridge new file mode 100755 index 00000000..aabb8b9a --- /dev/null +++ b/utils/remove-bridge/remove_bridge @@ -0,0 +1,268 @@ +#!/bin/zsh + +# Copyright (c) 2024 Proton AG +# +# This file is part of Proton Mail Bridge. +# +# Proton Mail Bridge is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Proton Mail Bridge is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Proton Mail Bridge. If not, see . + +# remove_bridge is a script for quitting, uninstalling, and deleted all Bridge related files on macOS, and Linux distros. + +# Colours for prettying up the terminal output +NC='\033[0m' +GREEN='\033[0;32m' +RED='\033[0;31m' + +# Variables with path to Bridge files (vault, cache, etc) +BRIDGE_PROCESS=bridge-gui +MAC_BRIDGE_APP_NAME=(Proton\ Mail\ Bridge.app) +MAC_SUPPORT_PROTONMAIL=~/Library/Application\ Support/protonmail +MAC_CACHE_PROTONMAIL=~/Library/Caches/protonmail +MAC_CACHE_PROTON=~/Library/Caches/Proton\ AG +MAC_BRIDGE_CREDS_V2="Proton Mail Bridge" +MAC_BRIDGE_CREDS_V3="Proton Mail Bridge-V3" +MAC_LAUNCH_AGENTS=~/Library/LaunchAgents/Proton\ Mail\ Bridge.plist +LINUX_CACHE_PROTON=~/.cache/Proton\ AG +LINUX_CACHE_PROTONMAIL=~/.cache/protonmail +LINUX_CONFIG_PROTONMAIL=~/.config/protonmail +LINUX_LOCAL_PROTONMAIL=~/.local/share/protonmail +LINUX_BRIDGE_USER_INFO=~/.config/protonmail/bridge/cache/c11/user_info.json +LINUX_STARTUP_ENTRY=~/.config/autostart/Proton\ Mail\ Bridge.desktop + + +quit_bridge() { +# Quit a running Bridge + pkill $BRIDGE_PROCESS + +} + + +uninstall_bridge() { +# Uninstall Bridge + + if [[ "$OSTYPE" == "darwin"* ]]; then + + rm -rf /Applications/"${MAC_BRIDGE_APP_NAME[@]}" + + elif [[ "$OSTYPE" == "linux-gnu"* ]]; then + + if [ -f "/usr/bin/apt-get" ]; then + + sudo dpkg -P protonmail-bridge + + elif [ -f "/bin/dnf" ]; then + + sudo dnf remove -y protonmail-bridge + + fi + + else + + echo -e "${RED}Unknown operating system!{$NC}" + + fi + +} + + +get_user_info() { +# Get the UserID from `user_info.json` file to be used when +# Deleting keychain entries from `gnome-keyring` + + result=( $(cat $LINUX_BRIDGE_USER_INFO | jq -r '. | keys[]') ) + +} + + +delete_credentials() { + + if [[ "$OSTYPE" == "darwin"* ]]; then + + while security delete-generic-password -s "${MAC_BRIDGE_CREDS_V2}" >/dev/null + do + true; + done + + security delete-generic-password -s "${MAC_BRIDGE_CREDS_V3}" + + elif [[ "$OSTYPE" == "linux-gnu"* ]]; then + + if [[ $(which gnome-keyring | grep 'gnome-keyring') ]]; then + + secret-tool clear username bridge-vault-key + + get_user_info + + for value in "${result[@]}"; do + + secret-tool clear username "$value" + + done + + fi + + if [[ $(which pass | grep 'pass') ]]; then + + pass remove -rf protonmail-credentials + + fi + + else + + echo -e "${RED}Unknown operating system!{$NC}" + + fi + +} + + +delete_resource_folders() { + + if [[ "$OSTYPE" == "darwin"* ]]; then + + rm -rf $MAC_SUPPORT_PROTONMAIL + rm -rf $MAC_CACHE_PROTONMAIL + rm -rf $MAC_CACHE_PROTON + rm $MAC_LAUNCH_AGENTS + + elif [[ "$OSTYPE" == "linux-gnu"* ]]; then + + rm -rf $LINUX_CACHE_PROTON + rm -rf $LINUX_CACHE_PROTONMAIL + rm -rf $LINUX_CONFIG_PROTONMAIL + rm -rf $LINUX_LOCAL_PROTONMAIL + rm -rf $LINUX_STARTUP_ENTRY + + else + + echo -e "${RED}Unknown operating system!{$NC}" + + fi + +} + + +check_resource_folders() { + + FOLDER_EXISTS=false + + if [[ "$OSTYPE" == "darwin"* ]]; then + + if [ -d "$MAC_SUPPORT_PROTONMAIL" ]; then + + echo -e "\n${RED}$MAC_SUPPORT_PROTONMAIL still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -d "$MAC_CACHE_PROTONMAIL" ]; then + + echo -e "\n${RED}$MAC_CACHE_PROTONMAIL still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -d "$MAC_CACHE_PROTON" ]; then + + echo -e "\n${RED}$MAC_CACHE_PROTON still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -f "$MAC_LAUNCH_AGENTS" ]; then + + echo -e "\n${RED}$MAC_LAUNCH_AGENTS still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ "$FOLDER_EXISTS" = true ]; then + + echo -e "\n${RED}Some directories were not deleted properly!${NC}\n" + + else + + echo -e "\n${GREEN}All Bridge resource folders deleted!${NC}\n" + + fi + + elif [[ "$OSTYPE" == "linux-gnu"* ]]; then + + if [ -d "$LINUX_CACHE_PROTON" ]; then + + echo -e "\n${RED}$LINUX_CACHE_PROTON still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -d "$LINUX_CACHE_PROTONMAIL" ]; then + + echo -e "\n${RED}$LINUX_CACHE_PROTONMAIL still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -d "$LINUX_CONFIG_PROTONMAIL" ]; then + + echo -e "\n${RED}$LINUX_CONFIG_PROTONMAIL still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -d "$LINUX_LOCAL_PROTONMAIL" ]; then + + echo -e "\n${RED}$LINUX_LOCAL_PROTONMAIL still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ -f "$LINUX_STARTUP_ENTRY" ]; then + + echo -e "\n${RED}$LINUX_STARTUP_ENTRY still exists!${NC}" + FOLDER_EXISTS=true + + fi + + if [ "$FOLDER_EXISTS" = true ]; then + + echo -e "\n${RED}Some directories were not deleted properly!${NC}\n" + + else + + echo -e "\n${GREEN}All Bridge resource folders deleted!${NC}\n" + + fi + + else + + echo -e "${RED}Unknown operating system!{$NC}" + + fi + +} + + +execute_script() { + + echo -e "\n${GREEN}Quitting and uninstalling Bridge!${NC}\n" + quit_bridge + delete_credentials + uninstall_bridge + delete_resource_folders + check_resource_folders + +} + + +execute_script From 97fc964467d2f17979a4284f7b889cb6d7af59fe Mon Sep 17 00:00:00 2001 From: Xavier Michelon Date: Mon, 29 Jan 2024 16:27:11 +0100 Subject: [PATCH 57/58] fix(GODT-3229): escape reserved XML characters in Apple configuration profile. --- internal/clientconfig/applemail.go | 33 ++++++++++++++------- internal/clientconfig/applemail_test.go | 38 +++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 internal/clientconfig/applemail_test.go diff --git a/internal/clientconfig/applemail.go b/internal/clientconfig/applemail.go index eba6f0f7..6b598818 100644 --- a/internal/clientconfig/applemail.go +++ b/internal/clientconfig/applemail.go @@ -21,6 +21,7 @@ import ( "os" "path/filepath" "strconv" + "strings" "time" "github.com/ProtonMail/proton-bridge/v3/internal/useragent" @@ -70,24 +71,24 @@ func prepareMobileConfig( password []byte, ) *mobileconfig.Config { return &mobileconfig.Config{ - DisplayName: username, - EmailAddress: addresses, - AccountName: displayName, - AccountDescription: username, - Identifier: "protonmail " + username + strconv.FormatInt(time.Now().Unix(), 10), + DisplayName: escapeXMLString(username), + EmailAddress: escapeXMLString(addresses), + AccountName: escapeXMLString(displayName), + AccountDescription: escapeXMLString(username), + Identifier: escapeXMLString("protonmail " + username + strconv.FormatInt(time.Now().Unix(), 10)), IMAP: &mobileconfig.IMAP{ - Hostname: hostname, + Hostname: escapeXMLString(hostname), Port: imapPort, TLS: imapSSL, - Username: username, - Password: string(password), + Username: escapeXMLString(username), + Password: escapeXMLString(string(password)), }, SMTP: &mobileconfig.SMTP{ - Hostname: hostname, + Hostname: escapeXMLString(hostname), Port: smtpPort, TLS: smtpSSL, - Username: username, - Password: string(password), + Username: escapeXMLString(username), + Password: escapeXMLString(string(password)), }, } } @@ -121,3 +122,13 @@ func saveConfigTemporarily(mc *mobileconfig.Config) (fname string, err error) { return } + +// escapeXMLString replace all occurrences of the 5 characters `&`, `<`, `>`, `"` and `'` by their respective escaped version as per the XML spec. +// https://www.w3.org/TR/xml/#syntax +func escapeXMLString(input string) string { + result := strings.ReplaceAll(input, `&`, `&`) + result = strings.ReplaceAll(result, `<`, `<`) + result = strings.ReplaceAll(result, `>`, `>`) + result = strings.ReplaceAll(result, `"`, `"`) + return strings.ReplaceAll(result, `'`, `'`) +} diff --git a/internal/clientconfig/applemail_test.go b/internal/clientconfig/applemail_test.go new file mode 100644 index 00000000..68036d03 --- /dev/null +++ b/internal/clientconfig/applemail_test.go @@ -0,0 +1,38 @@ +// Copyright (c) 2024 Proton AG +// +// This file is part of Proton Mail Bridge. +// +// Proton Mail Bridge is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Proton Mail Bridge is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Proton Mail Bridge. If not, see . + +//go:build darwin + +package clientconfig + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEscapeXMLString(t *testing.T) { + require.Equal(t, escapeXMLString(`abc&&''""<<>>def`), `abc&&''""<<>>def`) +} + +// This test requires human interaction (user configuration profile installation prompt). It is for debugging purpose and is disabled by default. +func _TestInstallCert(t *testing.T) { //nolint:unused + require.NoError( + t, + (&AppleMail{}).Configure(`127.0.0.1`, 1143, 1025, true, false, `user&>>`, `<>`, `user&a`, []byte(`ir8R9vhdNXyB7isWzhyEkQ`)), + ) +} From 45c2102ff7c91cf7aa5b3ea4f3a1441fab8acfd1 Mon Sep 17 00:00:00 2001 From: Jakub Date: Tue, 30 Jan 2024 16:15:48 +0100 Subject: [PATCH 58/58] chore: Ypsilon Bridge 3.9.0 changelog. --- Changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Changelog.md b/Changelog.md index 5f7790d2..add401fe 100644 --- a/Changelog.md +++ b/Changelog.md @@ -6,6 +6,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) ## Ypsilon Bridge 3.9.0 ### Added +* GODT-3230: Scripts for removing Bridge from device. * GODT-3195: Add OS info to the log. * GODT-3156: Add time zone info to the bridge log. * GODT-3162: Test: Add test scenarios for KB article suggestions. @@ -24,6 +25,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * Get better logging arround keychain list initialisation. ### Fixed +* GODT-3229: Escape reserved XML characters in Apple configuration profile. * GODT-3228: Get rid of fork of docker-credential-helpers. * GODT-3176: Assume inline if content id is present. * GODT-3160: Ignore non-called vulnerabilities.