@@ -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
103105func (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" )
0 commit comments