diff --git a/browser/edge/edge.go b/browser/edge/edge.go index ca5a40b..2428c66 100644 --- a/browser/edge/edge.go +++ b/browser/edge/edge.go @@ -27,7 +27,6 @@ func ReadCookies(filename string, filters ...kooky.Filter) ([]*kooky.Cookie, err // CookieJar returns an initiated http.CookieJar based on the cookies stored by // the Edge browser. Set cookies are memory stored and do not modify any // browser files. -// func CookieJar(filename string, filters ...kooky.Filter) (http.CookieJar, error) { j, err := cookieStore(filename, filters...) if err != nil { @@ -41,7 +40,6 @@ func CookieJar(filename string, filters ...kooky.Filter) (http.CookieJar, error) } // CookieStore has to be closed with CookieStore.Close() after use. -// func CookieStore(filename string, filters ...kooky.Filter) (kooky.CookieStore, error) { return cookieStore(filename, filters...) } diff --git a/browser/edge/find.go b/browser/edge/find.go index 34c038e..b67498b 100644 --- a/browser/edge/find.go +++ b/browser/edge/find.go @@ -1,22 +1,13 @@ -//go:build windows - package edge import ( - "errors" - "os" - "path/filepath" - "github.com/zellyn/kooky" "github.com/zellyn/kooky/internal/chrome" "github.com/zellyn/kooky/internal/chrome/find" "github.com/zellyn/kooky/internal/cookies" - "github.com/zellyn/kooky/internal/ie" - _ "github.com/zellyn/kooky/internal/ie/find" + edgefind "github.com/zellyn/kooky/internal/edge/find" ) -// TODO !windows platforms - type edgeFinder struct{} var _ kooky.CookieStoreFinder = (*edgeFinder)(nil) @@ -26,41 +17,29 @@ func init() { } func (f *edgeFinder) FindCookieStores() ([]kooky.CookieStore, error) { - locApp := os.Getenv(`LocalAppData`) - if len(locApp) == 0 { - return nil, errors.New(`%LocalAppData% is empty`) - } - - var cookiesFiles []kooky.CookieStore - - // Blink based - newRoot := func() ([]string, error) { - return []string{filepath.Join(locApp, `Microsoft`, `Edge`, `User Data`)}, nil - } - blinkCookiesFiles, err := find.FindCookieStoreFiles(newRoot, `edge`) + files, err := find.FindCookieStoreFiles(edgefind.GetEdgeRoots(), `edge`) if err != nil { return nil, err } - for _, cookiesFile := range blinkCookiesFiles { - cookiesFiles = append( - cookiesFiles, + + var ret []kooky.CookieStore + for _, file := range files { + ret = append( + ret, &cookies.CookieJar{ - CookieStore: &ie.CookieStore{ - CookieStore: &chrome.CookieStore{ - DefaultCookieStore: cookies.DefaultCookieStore{ - BrowserStr: cookiesFile.Browser, - ProfileStr: cookiesFile.Profile, - OSStr: cookiesFile.OS, - IsDefaultProfileBool: cookiesFile.IsDefaultProfile, - FileNameStr: cookiesFile.Path, - }, + CookieStore: &chrome.CookieStore{ + DefaultCookieStore: cookies.DefaultCookieStore{ + BrowserStr: file.Browser, + ProfileStr: file.Profile, + OSStr: file.OS, + IsDefaultProfileBool: file.IsDefaultProfile, + FileNameStr: file.Path, }, }, }, ) } - - return cookiesFiles, nil + return ret, nil } /* diff --git a/internal/chrome/chrome_darwin_cgo.go b/internal/chrome/chrome_darwin_cgo.go index 7bc66bc..5e87a91 100644 --- a/internal/chrome/chrome_darwin_cgo.go +++ b/internal/chrome/chrome_darwin_cgo.go @@ -27,12 +27,32 @@ func (s *CookieStore) getKeyringPassword(useSaved bool) ([]byte, error) { } } - password, err := keychain.GetGenericPassword("Chrome Safe Storage", "Chrome", "", "") + localSafeStorage := describeSafeStorage(s.BrowserStr) + password, err := keychain.GetGenericPassword(localSafeStorage.name, localSafeStorage.account, "", "") if err != nil { - return nil, fmt.Errorf("error reading 'Chrome Safe Storage' keychain password: %w", err) + return nil, fmt.Errorf(localSafeStorage.errorMsg, localSafeStorage.name, err) } s.KeyringPasswordBytes = password keyringPasswordMap.set(kpmKey, password) return s.KeyringPasswordBytes, nil } + +type safeStorage struct { + name string + account string + errorMsg string +} + +func describeSafeStorage(browserName string) safeStorage { + defaultStore := safeStorage{ + name: "Chrome Safe Storage", + account: "Chrome", + errorMsg: "error reading '%s' keychain password: %w", + } + if browserName == `edge` { + defaultStore.name = "Microsoft Edge Safe Storage" + defaultStore.account = "Microsoft Edge" + } + return defaultStore +} diff --git a/internal/edge/find/find.go b/internal/edge/find/find.go new file mode 100644 index 0000000..2cf158a --- /dev/null +++ b/internal/edge/find/find.go @@ -0,0 +1,5 @@ +package find + +func GetEdgeRoots() (rootsFunc func() ([]string, error)) { + return edgeRoots +} diff --git a/internal/edge/find/find_darwin.go b/internal/edge/find/find_darwin.go new file mode 100644 index 0000000..f8c8f82 --- /dev/null +++ b/internal/edge/find/find_darwin.go @@ -0,0 +1,17 @@ +//go:build darwin + +package find + +import ( + "os" + "path/filepath" +) + +func edgeRoots() ([]string, error) { + // "$HOME/Library/Application Support" + cfgDir, err := os.UserConfigDir() + if err != nil { + return nil, err + } + return []string{filepath.Join(cfgDir, `Microsoft Edge`)}, nil +} diff --git a/internal/edge/find/find_others.go b/internal/edge/find/find_others.go new file mode 100644 index 0000000..d4432b1 --- /dev/null +++ b/internal/edge/find/find_others.go @@ -0,0 +1,9 @@ +//go:build plan9 || android || ios || js || aix + +package find + +import "errors" + +func edgeRoots() ([]string, error) { + return nil, errors.New(`not implemented`) +} diff --git a/internal/edge/find/find_unix.go b/internal/edge/find/find_unix.go new file mode 100644 index 0000000..e33c94c --- /dev/null +++ b/internal/edge/find/find_unix.go @@ -0,0 +1,12 @@ +//go:build !windows && !darwin && !plan9 && !android && !js && !aix + +package find + +import ( + "os" + "path/filepath" +) + +func edgeRoots() ([]string, error) { + return nil, errors.New(`not implemented`) +} diff --git a/internal/edge/find/find_windows.go b/internal/edge/find/find_windows.go new file mode 100644 index 0000000..a29bcec --- /dev/null +++ b/internal/edge/find/find_windows.go @@ -0,0 +1,24 @@ +//go:build windows +// +build windows + +package find + +import ( + "errors" + "os" + "path/filepath" +) + +func edgeRoots() ([]string, error) { + // AppData Local + locApp := os.Getenv(`LocalAppData`) + if len(locApp) == 0 { + return nil, errors.New(`%LocalAppData% is empty`) + } + + var ret = []string{ + filepath.Join(locApp, `Microsoft`, `Edge`, `User Data`), + } + + return ret, nil +}