diff --git a/internal/bridge/settings.go b/internal/bridge/settings.go index 3331b3e7..29f74f77 100644 --- a/internal/bridge/settings.go +++ b/internal/bridge/settings.go @@ -23,9 +23,11 @@ import ( "net" "github.com/Masterminds/semver/v3" + "github.com/ProtonMail/proton-bridge/v2/internal/constants" "github.com/ProtonMail/proton-bridge/v2/internal/updater" "github.com/ProtonMail/proton-bridge/v2/internal/user" "github.com/ProtonMail/proton-bridge/v2/internal/vault" + "github.com/ProtonMail/proton-bridge/v2/pkg/keychain" "github.com/sirupsen/logrus" ) @@ -284,6 +286,18 @@ func (bridge *Bridge) FactoryReset(ctx context.Context) { if err := bridge.locator.Clear(); err != nil { logrus.WithError(err).Error("Failed to clear data paths") } + + // Lastly clear the keychain. + vaultDir, err := bridge.locator.ProvideSettingsPath() + if err != nil { + logrus.WithError(err).Error("Failed to get vault dir") + } else if helper, err := vault.GetHelper(vaultDir); err != nil { + logrus.WithError(err).Error("Failed to get keychain helper") + } else if keychain, err := keychain.NewKeychain(helper, constants.KeyChainName); err != nil { + logrus.WithError(err).Error("Failed to get keychain") + } else if err := keychain.Clear(); err != nil { + logrus.WithError(err).Error("Failed to clear keychain") + } } func getPort(addr net.Addr) int { diff --git a/pkg/keychain/keychain.go b/pkg/keychain/keychain.go index 64859f32..b8d90046 100644 --- a/pkg/keychain/keychain.go +++ b/pkg/keychain/keychain.go @@ -125,6 +125,21 @@ func (kc *Keychain) Delete(userID string) error { return kc.helper.Delete(kc.secretURL(userID)) } +func (kc *Keychain) Clear() error { + entries, err := kc.List() + if err != nil { + return err + } + + for _, entry := range entries { + if err := kc.Delete(entry); err != nil { + return err + } + } + + return nil +} + // Get returns the username and secret for the given userID. func (kc *Keychain) Get(userID string) (string, string, error) { kc.locker.Lock()