diff --git a/pkg/keychain/helper_darwin.go b/pkg/keychain/helper_darwin.go index c82a4aed..b519f9c8 100644 --- a/pkg/keychain/helper_darwin.go +++ b/pkg/keychain/helper_darwin.go @@ -35,6 +35,9 @@ func init() { // nolint[noinit] // MacOS always provides a keychain. Helpers[MacOSKeychain] = newMacOSHelper + + // Use MacOSKeychain by default. + defaultHelper = WindowsCredentials } func newMacOSHelper(url string) (credentials.Helper, error) { diff --git a/pkg/keychain/helper_linux.go b/pkg/keychain/helper_linux.go index d8d1cf1f..23a1a1d0 100644 --- a/pkg/keychain/helper_linux.go +++ b/pkg/keychain/helper_linux.go @@ -40,6 +40,14 @@ func init() { // nolint[noinit] if _, err := exec.LookPath("gnome-keyring"); err == nil { Helpers[GnomeKeyring] = newGnomeKeyringHelper } + + // If GnomeKeyring is available, use it by default. + // Otherwise, if pass is available, use it by default. + if _, ok := Helpers[GnomeKeyring]; ok { + defaultHelper = GnomeKeyring + } else if _, ok := Helpers[Pass]; ok { + defaultHelper = Pass + } } func newPassHelper(string) (credentials.Helper, error) { diff --git a/pkg/keychain/helper_windows.go b/pkg/keychain/helper_windows.go index 96b3d038..bb17aff7 100644 --- a/pkg/keychain/helper_windows.go +++ b/pkg/keychain/helper_windows.go @@ -29,6 +29,9 @@ func init() { // nolint[noinit] // Windows always provides a keychain. Helpers[WindowsCredentials] = newWinCredHelper + + // Use WindowsCredentials by default. + defaultHelper = WindowsCredentials } func newWinCredHelper(string) (credentials.Helper, error) { diff --git a/pkg/keychain/keychain.go b/pkg/keychain/keychain.go index d07ccc9e..39c91a82 100644 --- a/pkg/keychain/keychain.go +++ b/pkg/keychain/keychain.go @@ -21,7 +21,6 @@ package keychain import ( "errors" "fmt" - "reflect" "sync" "github.com/ProtonMail/proton-bridge/internal/config/settings" @@ -40,6 +39,9 @@ var ( // Helpers holds all discovered keychain helpers. It is populated in init(). Helpers map[string]helperConstructor // nolint[noglobals] + + // defaultHelper is the default helper to use if the user hasn't yet set a preference. + defaultHelper string // nolint[noglobals] ) // NewKeychain creates a new native keychain. @@ -52,13 +54,20 @@ func NewKeychain(s *settings.Settings, keychainName string) (*Keychain, error) { // hostURL uniquely identifies the app's keychain items within the system keychain. hostURL := fmt.Sprintf("protonmail/%v/users", keychainName) - // If the preferred keychain is unsupported, set a default one. + // If the preferred keychain is unsupported, fallback to the default one. + // NOTE: Maybe we want to error out here and show something in the GUI instead? if _, ok := Helpers[s.Get(settings.PreferredKeychainKey)]; !ok { - s.Set(settings.PreferredKeychainKey, reflect.ValueOf(Helpers).MapKeys()[0].Interface().(string)) + s.Set(settings.PreferredKeychainKey, defaultHelper) } // Load the user's preferred keychain helper. - helper, err := Helpers[s.Get(settings.PreferredKeychainKey)](hostURL) + helperConstructor, ok := Helpers[s.Get(settings.PreferredKeychainKey)] + if !ok { + return nil, ErrNoKeychain + } + + // Construct the keychain helper. + helper, err := helperConstructor(hostURL) if err != nil { return nil, err }