GODT-1522: Rebuild macOS keychain notification

This commit is contained in:
Jakub
2022-03-17 10:57:51 +01:00
parent 0ed78f1ccb
commit 478345e277
9 changed files with 91 additions and 6 deletions

View File

@ -69,6 +69,7 @@ func newUser(
creds, err := credStorer.Get(userID)
if err != nil {
notifyKeychainRepair(eventListener, err)
return nil, nil, errors.Wrap(err, "failed to load user credentials")
}
@ -162,6 +163,7 @@ func (u *User) handleAuthRefresh(auth *pmapi.AuthRefresh) {
creds, err := u.credStorer.UpdateToken(u.userID, auth.UID, auth.RefreshToken)
if err != nil {
notifyKeychainRepair(u.listener, err)
u.log.WithError(err).Error("Failed to update refresh token in credentials store")
return
}
@ -408,6 +410,7 @@ func (u *User) UpdateUser(ctx context.Context) error {
creds, err := u.credStorer.UpdateEmails(u.userID, u.client.Addresses().ActiveEmails())
if err != nil {
notifyKeychainRepair(u.listener, err)
return err
}
@ -445,6 +448,7 @@ func (u *User) SwitchAddressMode() error {
creds, err := u.credStorer.SwitchAddressMode(u.userID)
if err != nil {
notifyKeychainRepair(u.listener, err)
return errors.Wrap(err, "could not switch credentials store address mode")
}
@ -490,9 +494,11 @@ func (u *User) Logout() error {
creds, err := u.credStorer.Logout(u.userID)
if err != nil {
notifyKeychainRepair(u.listener, err)
u.log.WithError(err).Warn("Could not log user out from credentials store")
if err := u.credStorer.Delete(u.userID); err != nil {
notifyKeychainRepair(u.listener, err)
u.log.WithError(err).Error("Could not delete user from credentials store")
}
} else {

View File

@ -27,6 +27,7 @@ import (
"github.com/ProtonMail/proton-bridge/internal/events"
"github.com/ProtonMail/proton-bridge/internal/metrics"
"github.com/ProtonMail/proton-bridge/internal/users/credentials"
"github.com/ProtonMail/proton-bridge/pkg/keychain"
"github.com/ProtonMail/proton-bridge/pkg/listener"
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
"github.com/hashicorp/go-multierror"
@ -130,6 +131,7 @@ func (u *Users) loadUsersFromCredentialsStore() error {
userIDs, err := u.credStorer.List()
if err != nil {
notifyKeychainRepair(u.events, err)
return err
}
@ -188,6 +190,7 @@ func (u *Users) loadConnectedUser(ctx context.Context, user *User, creds *creden
// Update the user's credentials with the latest auth used to connect this user.
if creds, err = u.credStorer.UpdateToken(creds.UserID, auth.UID, auth.RefreshToken); err != nil {
notifyKeychainRepair(u.events, err)
return errors.Wrap(err, "could not create get user's refresh token")
}
@ -226,12 +229,14 @@ func (u *Users) FinishLogin(client pmapi.Client, auth *pmapi.Auth, password []by
// Update the user's credentials with the latest auth used to connect this user.
if _, err := u.credStorer.UpdateToken(auth.UserID, auth.UID, auth.RefreshToken); err != nil {
notifyKeychainRepair(u.events, err)
return nil, errors.Wrap(err, "failed to load user credentials")
}
// Update the password in case the user changed it.
creds, err := u.credStorer.UpdatePassword(apiUser.ID, passphrase)
if err != nil {
notifyKeychainRepair(u.events, err)
return nil, errors.Wrap(err, "failed to update password of user in credentials store")
}
@ -260,6 +265,7 @@ func (u *Users) addNewUser(client pmapi.Client, apiUser *pmapi.User, auth *pmapi
defer u.lock.Unlock()
if _, err := u.credStorer.Add(apiUser.ID, apiUser.Name, auth.UID, auth.RefreshToken, passphrase, client.Addresses().ActiveEmails()); err != nil {
notifyKeychainRepair(u.events, err)
return errors.Wrap(err, "failed to add user credentials to credentials store")
}
@ -384,6 +390,7 @@ func (u *Users) DeleteUser(userID string, clearStore bool) error {
}
if err := u.credStorer.Delete(userID); err != nil {
notifyKeychainRepair(u.events, err)
log.WithError(err).Error("Cannot remove user")
return err
}
@ -443,3 +450,9 @@ func (u *Users) crashBandicoot(username string) {
panic("Your wish is my command… I crash!")
}
}
func notifyKeychainRepair(l listener.Listener, err error) {
if err == keychain.ErrMacKeychainRebuild {
l.Emit(events.CredentialsErrorEvent, err.Error())
}
}