Skip to content

Commit 5ea53ea

Browse files
jameshoulahanJakub Cuth
authored andcommitted
fix(GODT-2318): Remove gluon DB if label sync was incomplete
1 parent 367c505 commit 5ea53ea

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

internal/bridge/imap.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ func (bridge *Bridge) closeIMAP(ctx context.Context) error {
100100
}
101101

102102
// addIMAPUser connects the given user to gluon.
103+
//
104+
//nolint:funlen
103105
func (bridge *Bridge) addIMAPUser(ctx context.Context, user *user.User) error {
104106
if bridge.imapServer == nil {
105107
return fmt.Errorf("no imap server instance running")
@@ -125,13 +127,33 @@ func (bridge *Bridge) addIMAPUser(ctx context.Context, user *user.User) error {
125127
return fmt.Errorf("failed to load IMAP user: %w", err)
126128
}
127129

128-
// If the DB was newly created, clear the sync status; gluon's DB was not found.
129130
if isNew {
131+
// If the DB was newly created, clear the sync status; gluon's DB was not found.
130132
logrus.Warn("IMAP user DB was newly created, clearing sync status")
131133

132134
if err := user.ClearSyncStatus(); err != nil {
133135
return fmt.Errorf("failed to clear sync status: %w", err)
134136
}
137+
} else if status := user.GetSyncStatus(); !status.HasLabels {
138+
// Otherwise, the DB already exists -- if the labels are not yet synced, we need to re-create the DB.
139+
if err := bridge.imapServer.RemoveUser(ctx, gluonID, true); err != nil {
140+
return fmt.Errorf("failed to remove old IMAP user: %w", err)
141+
}
142+
143+
if err := user.RemoveGluonID(addrID, gluonID); err != nil {
144+
return fmt.Errorf("failed to remove old IMAP user ID: %w", err)
145+
}
146+
147+
gluonID, err := bridge.imapServer.AddUser(ctx, imapConn, user.GluonKey())
148+
if err != nil {
149+
return fmt.Errorf("failed to add IMAP user: %w", err)
150+
}
151+
152+
if err := user.SetGluonID(addrID, gluonID); err != nil {
153+
return fmt.Errorf("failed to set IMAP user ID: %w", err)
154+
}
155+
156+
log.WithField("gluonID", gluonID).Info("Re-created IMAP user")
135157
}
136158
} else {
137159
log.Info("Creating new IMAP user")

internal/user/user.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,8 @@ func (user *User) NewIMAPConnectors() (map[string]connector.Connector, error) {
430430
}
431431

432432
// SendMail sends an email from the given address to the given recipients.
433+
//
434+
// nolint:funlen
433435
func (user *User) SendMail(authID string, from string, to []string, r io.Reader) error {
434436
if user.vault.SyncStatus().IsComplete() {
435437
defer user.goPollAPIEvents(true)

0 commit comments

Comments
 (0)