diff --git a/go.mod b/go.mod index 171266e5..75e25390 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Masterminds/semver/v3 v3.2.0 github.com/ProtonMail/gluon v0.16.1-0.20230706110757-a9327fb18611 github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a - github.com/ProtonMail/go-proton-api v0.4.1-0.20230704060229-a77a437ec052 + github.com/ProtonMail/go-proton-api v0.4.1-0.20230727082922-9115b4750ec7 github.com/ProtonMail/gopenpgp/v2 v2.7.1-proton github.com/PuerkitoBio/goquery v1.8.1 github.com/abiosoft/ishell v2.0.0+incompatible diff --git a/go.sum b/go.sum index c3e5d887..2b015f2b 100644 --- a/go.sum +++ b/go.sum @@ -35,8 +35,8 @@ github.com/ProtonMail/go-message v0.13.1-0.20230526094639-b62c999c85b7 h1:+j+Kd/ 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.20230704060229-a77a437ec052 h1:uIq0RX4gU9PSZ9x5b2LmJUXNOuBXRRVSOkM1RGnSy68= -github.com/ProtonMail/go-proton-api v0.4.1-0.20230704060229-a77a437ec052/go.mod h1:+aTJoYu8bqzGECXL2DOdiZTZ64bGn3w0NC8VcFpJrFM= +github.com/ProtonMail/go-proton-api v0.4.1-0.20230727082922-9115b4750ec7 h1:Rmg3TPK6vFGNWR4hxmPoBhV75Sl716iB46wEi2U4Q+c= +github.com/ProtonMail/go-proton-api v0.4.1-0.20230727082922-9115b4750ec7/go.mod h1:+aTJoYu8bqzGECXL2DOdiZTZ64bGn3w0NC8VcFpJrFM= 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= diff --git a/internal/user/debug.go b/internal/user/debug.go index dbc73992..34b37d1d 100644 --- a/internal/user/debug.go +++ b/internal/user/debug.go @@ -131,7 +131,7 @@ func (apm DiagnosticMetadata) BuildMailboxToMessageMap(user *User) (map[string]A func (user *User) GetDiagnosticMetadata(ctx context.Context) (DiagnosticMetadata, error) { failedMessages := xmaps.SetFromSlice(user.vault.SyncStatus().FailedMessageIDs) - messageIDs, err := user.client.GetMessageIDs(ctx, "") + messageIDs, err := user.client.GetAllMessageIDs(ctx, "") if err != nil { return DiagnosticMetadata{}, err } diff --git a/internal/user/sync.go b/internal/user/sync.go index b0183392..717a677a 100644 --- a/internal/user/sync.go +++ b/internal/user/sync.go @@ -150,7 +150,7 @@ func (user *User) sync(ctx context.Context) error { user.log.Info("Syncing messages") // Determine which messages to sync. - messageIDs, err := user.client.GetMessageIDs(ctx, "") + messageIDs, err := getAllMessageIDs(ctx, user.client) if err != nil { return fmt.Errorf("failed to get message IDs to sync: %w", err) } @@ -198,6 +198,30 @@ func (user *User) sync(ctx context.Context) error { }) } +func getAllMessageIDs(ctx context.Context, client *proton.Client) ([]string, error) { + var messageIDs []string + + for afterID := ""; ; afterID = messageIDs[len(messageIDs)-1] { + for { + page, err := client.GetMessageIDs(ctx, afterID, 1000) + if err != nil { + if is429Error(err) { + continue + } + return nil, err + } + + if len(page) == 0 { + return messageIDs, nil + } + + messageIDs = append(messageIDs, page...) + + break + } + } +} + // nolint:exhaustive func syncLabels(ctx context.Context, apiLabels map[string]proton.Label, updateCh ...*async.QueuedChannel[imap.Update]) error { var updates []imap.Update