diff --git a/internal/user/smtp.go b/internal/user/smtp.go index 8defe540..ef4ea533 100644 --- a/internal/user/smtp.go +++ b/internal/user/smtp.go @@ -158,7 +158,7 @@ func (user *User) sendMail(authID string, from string, to []string, r io.Reader) return nil }) - }, user.apiUserLock, user.apiAddrsLock) + }, user.apiUserLock, user.apiAddrsLock, user.eventLock) } // sendWithKey sends the message with the given address key. diff --git a/internal/user/user.go b/internal/user/user.go index 18caf83d..4abd6d8c 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -60,9 +60,11 @@ type User struct { vault *vault.User client *proton.Client reporter reporter.Reporter - eventCh *queue.QueuedChannel[events.Event] sendHash *sendRecorder + eventCh *queue.QueuedChannel[events.Event] + eventLock safe.RWMutex + apiUser proton.User apiUserLock safe.RWMutex @@ -120,9 +122,11 @@ func New( vault: encVault, client: client, reporter: reporter, - eventCh: queue.NewQueuedChannel[events.Event](0, 0), sendHash: newSendRecorder(sendEntryExpiry), + eventCh: queue.NewQueuedChannel[events.Event](0, 0), + eventLock: safe.NewRWMutex(), + apiUser: apiUser, apiUserLock: safe.NewRWMutex(), @@ -548,6 +552,9 @@ func (user *User) initUpdateCh(mode vault.AddressMode) { // doEventPoll is called whenever API events should be polled. func (user *User) doEventPoll(ctx context.Context) error { + user.eventLock.Lock() + defer user.eventLock.Unlock() + event, err := user.client.GetEvent(ctx, user.vault.EventID()) if err != nil { return fmt.Errorf("failed to get event: %w", err)