diff --git a/go.mod b/go.mod index 9170f769..99aa4b10 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.21.9 require ( github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557 github.com/Masterminds/semver/v3 v3.2.0 - github.com/ProtonMail/gluon v0.17.1-0.20241112142609-f4ac4c4fbbce + github.com/ProtonMail/gluon v0.17.1-0.20241121121545-aa1cfd19b4b2 github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a github.com/ProtonMail/go-proton-api v0.4.1-0.20240918100656-b4860af56d47 github.com/ProtonMail/gopenpgp/v2 v2.7.4-proton diff --git a/go.sum b/go.sum index 56ade6a1..9d5e7a20 100644 --- a/go.sum +++ b/go.sum @@ -34,26 +34,8 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE 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/gluon v0.17.1-0.20240923151549-d23b4bec3602 h1:EoMjWlC32tg46L/07hWoiZfLkqJyxVMcsq4Cyn+Ofqc= -github.com/ProtonMail/gluon v0.17.1-0.20240923151549-d23b4bec3602/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241002092751-3bbeea9053af h1:iMxTQUg2cB47cXqpMev3cZmQoGBOef3cSUjBbdEl33M= -github.com/ProtonMail/gluon v0.17.1-0.20241002092751-3bbeea9053af/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241002111651-173859b80060 h1:dcu3tT84GjoXb++n7crv8UJeG8eRwogjTYdkoJ+MjQI= -github.com/ProtonMail/gluon v0.17.1-0.20241002111651-173859b80060/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241002142736-ef4153d156d8 h1:YxPHSJUA87i1hc6s1YrW89++V7HpcR7LSFQ6XM0TsAE= -github.com/ProtonMail/gluon v0.17.1-0.20241002142736-ef4153d156d8/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241008123701-ddf4a459d0b4 h1:xE+V17O9HIttMpVymNCORQILk9OKpSekrrPbX7YGnF8= -github.com/ProtonMail/gluon v0.17.1-0.20241008123701-ddf4a459d0b4/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241014082854-9d93627be032 h1:5bwI+mwF26c460xlq2Dw3/cVF1cU4Xo4kTKX1/pBXko= -github.com/ProtonMail/gluon v0.17.1-0.20241014082854-9d93627be032/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241018144126-31e040c2417e h1:+UfdKOkF9JEiH9VXWBo+/nlXNVSJcxtuf4+SJTrk9fw= -github.com/ProtonMail/gluon v0.17.1-0.20241018144126-31e040c2417e/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241111071724-6536da14d087 h1:hqoJCo54y/4cO1w9ZfaqRMAvxdxJMRT0vc0ICbg8nVA= -github.com/ProtonMail/gluon v0.17.1-0.20241111071724-6536da14d087/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241112080731-83106972325c h1:+klUNkIb8TMXxnE80PDJM5YV2gPfmyOal3hiofdGSAs= -github.com/ProtonMail/gluon v0.17.1-0.20241112080731-83106972325c/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= -github.com/ProtonMail/gluon v0.17.1-0.20241112142609-f4ac4c4fbbce h1:lphIROziz1jya/E40KzWSDNm+tEyp86XkPk7qk1LgVY= -github.com/ProtonMail/gluon v0.17.1-0.20241112142609-f4ac4c4fbbce/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= +github.com/ProtonMail/gluon v0.17.1-0.20241121121545-aa1cfd19b4b2 h1:iZjKvjb6VkGb52ZaBBiXC1MGYJN4C/S97JfppdzpMHQ= +github.com/ProtonMail/gluon v0.17.1-0.20241121121545-aa1cfd19b4b2/go.mod h1:0/c03TzZPNiSgY5UDJK1iRDkjlDPwWugxTT6et2qDu8= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a h1:D+aZah+k14Gn6kmL7eKxoo/4Dr/lK3ChBcwce2+SQP4= github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a/go.mod h1:oTGdE7/DlWIr23G0IKW3OXK9wZ5Hw1GGiaJFccTvZi4= github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= diff --git a/internal/bridge/imap.go b/internal/bridge/imap.go index 58b93d3c..40438ff3 100644 --- a/internal/bridge/imap.go +++ b/internal/bridge/imap.go @@ -26,6 +26,7 @@ import ( imapEvents "github.com/ProtonMail/gluon/events" "github.com/ProtonMail/proton-bridge/v3/internal/events" "github.com/ProtonMail/proton-bridge/v3/internal/services/imapsmtpserver" + "github.com/ProtonMail/proton-bridge/v3/internal/unleash" "github.com/ProtonMail/proton-bridge/v3/internal/useragent" "github.com/sirupsen/logrus" ) @@ -93,6 +94,10 @@ func (b *bridgeIMAPSettings) LogServer() bool { return b.b.logIMAPServer } +func (b *bridgeIMAPSettings) DisableIMAPAuthenticate() bool { + return b.b.unleashService.GetFlagValue(unleash.IMAPAuthenticateCommandDisabled) +} + func (b *bridgeIMAPSettings) Port() int { return b.b.vault.GetIMAPPort() } diff --git a/internal/services/imapsmtpserver/imap.go b/internal/services/imapsmtpserver/imap.go index 806b6c56..0ec98a3f 100644 --- a/internal/services/imapsmtpserver/imap.go +++ b/internal/services/imapsmtpserver/imap.go @@ -49,6 +49,7 @@ type IMAPSettingsProvider interface { Port() int SetPort(int) error UseSSL() bool + DisableIMAPAuthenticate() bool CacheDirectory() string DataDirectory() (string, error) SetCacheDirectory(string) error @@ -74,6 +75,7 @@ func newIMAPServer( tlsConfig *tls.Config, reporter reporter.Reporter, logClient, logServer bool, + disableIMAPAuthenticate bool, eventPublisher IMAPEventPublisher, tasks *async.Group, uidValidityGenerator imap.UIDValidityGenerator, @@ -113,7 +115,7 @@ func newIMAPServer( imapServerLog = io.Discard } - imapServer, err := gluon.New( + options := []gluon.Option{ gluon.WithTLS(tlsConfig), gluon.WithDataDir(gluonCacheDir), gluon.WithDatabaseDir(gluonConfigDir), @@ -124,7 +126,13 @@ func newIMAPServer( gluon.WithUIDValidityGenerator(uidValidityGenerator), gluon.WithPanicHandler(panicHandler), gluon.WithObservabilitySender(observability.NewAdapter(observabilitySender), int(observability.GluonImapError), int(observability.GluonMessageError), int(observability.GluonOtherError)), - ) + } + + if disableIMAPAuthenticate { + options = append(options, gluon.WithDisableIMAPAuthenticate()) + } + + imapServer, err := gluon.New(options...) if err != nil { return nil, err } diff --git a/internal/services/imapsmtpserver/service.go b/internal/services/imapsmtpserver/service.go index f56e7275..a80ddf7e 100644 --- a/internal/services/imapsmtpserver/service.go +++ b/internal/services/imapsmtpserver/service.go @@ -451,6 +451,7 @@ func (sm *Service) createIMAPServer(ctx context.Context) (*gluon.Server, error) sm.reporter, sm.imapSettings.LogClient(), sm.imapSettings.LogServer(), + sm.imapSettings.DisableIMAPAuthenticate(), sm.imapSettings.EventPublisher(), sm.tasks, sm.uidValidityGenerator, diff --git a/internal/services/notifications/service.go b/internal/services/notifications/service.go index bf2bbc83..8a78f53e 100644 --- a/internal/services/notifications/service.go +++ b/internal/services/notifications/service.go @@ -50,7 +50,6 @@ type Service struct { } const bitfieldRegexPattern = `^\\\d+` -const disableNotificationsKillSwitch = "InboxBridgeEventLoopNotificationDisabled" func NewService(userID string, service userevents.Subscribable, eventPublisher events.EventPublisher, store *Store, getFlagFn unleash.GetFlagValueFn, observabilitySender observability.Sender) *Service { @@ -103,7 +102,7 @@ func (s *Service) run(ctx context.Context) { } func (s *Service) HandleNotificationEvents(ctx context.Context, notificationEvents []proton.NotificationEvent) error { - if s.getFlagValueFn(disableNotificationsKillSwitch) { + if s.getFlagValueFn(unleash.EventLoopNotificationDisabled) { s.log.Info("Received notification events. Skipping as kill switch is enabled.") return nil } diff --git a/internal/unleash/service.go b/internal/unleash/service.go index 174cd639..56f56135 100644 --- a/internal/unleash/service.go +++ b/internal/unleash/service.go @@ -36,6 +36,11 @@ var pollJitter = 2 * time.Minute //nolint:gochecknoglobals const filename = "unleash_flags" +const ( + EventLoopNotificationDisabled = "InboxBridgeEventLoopNotificationDisabled" + IMAPAuthenticateCommandDisabled = "InboxBridgeImapAuthenticateCommandDisabled" +) + type requestFeaturesFn func(ctx context.Context) (proton.FeatureFlagResult, error) type GetFlagValueFn func(key string) bool