forked from Silverfish/proton-bridge
feat: default keychain helper
This commit is contained in:
@ -35,6 +35,9 @@ func init() { // nolint[noinit]
|
|||||||
|
|
||||||
// MacOS always provides a keychain.
|
// MacOS always provides a keychain.
|
||||||
Helpers[MacOSKeychain] = newMacOSHelper
|
Helpers[MacOSKeychain] = newMacOSHelper
|
||||||
|
|
||||||
|
// Use MacOSKeychain by default.
|
||||||
|
defaultHelper = WindowsCredentials
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMacOSHelper(url string) (credentials.Helper, error) {
|
func newMacOSHelper(url string) (credentials.Helper, error) {
|
||||||
|
|||||||
@ -40,6 +40,14 @@ func init() { // nolint[noinit]
|
|||||||
if _, err := exec.LookPath("gnome-keyring"); err == nil {
|
if _, err := exec.LookPath("gnome-keyring"); err == nil {
|
||||||
Helpers[GnomeKeyring] = newGnomeKeyringHelper
|
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) {
|
func newPassHelper(string) (credentials.Helper, error) {
|
||||||
|
|||||||
@ -29,6 +29,9 @@ func init() { // nolint[noinit]
|
|||||||
|
|
||||||
// Windows always provides a keychain.
|
// Windows always provides a keychain.
|
||||||
Helpers[WindowsCredentials] = newWinCredHelper
|
Helpers[WindowsCredentials] = newWinCredHelper
|
||||||
|
|
||||||
|
// Use WindowsCredentials by default.
|
||||||
|
defaultHelper = WindowsCredentials
|
||||||
}
|
}
|
||||||
|
|
||||||
func newWinCredHelper(string) (credentials.Helper, error) {
|
func newWinCredHelper(string) (credentials.Helper, error) {
|
||||||
|
|||||||
@ -21,7 +21,6 @@ package keychain
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/ProtonMail/proton-bridge/internal/config/settings"
|
"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 holds all discovered keychain helpers. It is populated in init().
|
||||||
Helpers map[string]helperConstructor // nolint[noglobals]
|
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.
|
// 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 uniquely identifies the app's keychain items within the system keychain.
|
||||||
hostURL := fmt.Sprintf("protonmail/%v/users", keychainName)
|
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 {
|
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.
|
// 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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user