diff --git a/browser/all/import.go b/browser/all/import.go index 3e3c2df..b99e027 100644 --- a/browser/all/import.go +++ b/browser/all/import.go @@ -2,10 +2,12 @@ package all import ( + _ "github.com/browserutils/kooky/browser/arc" _ "github.com/browserutils/kooky/browser/brave" _ "github.com/browserutils/kooky/browser/browsh" _ "github.com/browserutils/kooky/browser/chrome" _ "github.com/browserutils/kooky/browser/chromium" + _ "github.com/browserutils/kooky/browser/dia" _ "github.com/browserutils/kooky/browser/dillo" _ "github.com/browserutils/kooky/browser/edge" _ "github.com/browserutils/kooky/browser/elinks" diff --git a/browser/arc/arc.go b/browser/arc/arc.go new file mode 100644 index 0000000..34e1538 --- /dev/null +++ b/browser/arc/arc.go @@ -0,0 +1,31 @@ +package arc + +import ( + "context" + + "github.com/browserutils/kooky" + "github.com/browserutils/kooky/internal/chrome" + "github.com/browserutils/kooky/internal/cookies" +) + +func ReadCookies(ctx context.Context, filename string, filters ...kooky.Filter) ([]*kooky.Cookie, error) { + return cookies.SingleRead(cookieStore, filename, filters...).ReadAllCookies(ctx) +} + +func TraverseCookies(filename string, filters ...kooky.Filter) kooky.CookieSeq { + return cookies.SingleRead(cookieStore, filename, filters...) +} + +// CookieStore has to be closed with CookieStore.Close() after use. +func CookieStore(filename string, filters ...kooky.Filter) (kooky.CookieStore, error) { + return cookieStore(filename, filters...) +} + +func cookieStore(filename string, filters ...kooky.Filter) (*cookies.CookieJar, error) { + s := &chrome.CookieStore{} + s.FileNameStr = filename + s.BrowserStr = `arc` + s.SetSafeStorage(`Arc`, ``, ``) + + return cookies.NewCookieJar(s, filters...), nil +} diff --git a/browser/arc/find.go b/browser/arc/find.go new file mode 100644 index 0000000..5e2198e --- /dev/null +++ b/browser/arc/find.go @@ -0,0 +1,58 @@ +//go:build darwin && !ios + +package arc + +import ( + "os" + + "github.com/browserutils/kooky" + "github.com/browserutils/kooky/internal/chrome" + chromefind "github.com/browserutils/kooky/internal/chrome/find" + "github.com/browserutils/kooky/internal/cookies" +) + +type arcFinder struct{} + +var _ kooky.CookieStoreFinder = (*arcFinder)(nil) + +func init() { + kooky.RegisterFinder(`arc`, &arcFinder{}) +} + +func (f *arcFinder) FindCookieStores() kooky.CookieStoreSeq { + return func(yield func(kooky.CookieStore, error) bool) { + for file, err := range chromefind.FindCookieStoreFiles(arcChromiumRoots, `arc`) { + if err != nil { + if !yield(nil, err) { + return + } + continue + } + if file == nil { + continue + } + if _, err := os.Stat(file.Path); err != nil { + if os.IsNotExist(err) { + continue + } + if !yield(nil, err) { + return + } + continue + } + cookieStore := &chrome.CookieStore{ + DefaultCookieStore: cookies.DefaultCookieStore{ + BrowserStr: file.Browser, + ProfileStr: file.Profile, + OSStr: file.OS, + IsDefaultProfileBool: file.IsDefaultProfile, + FileNameStr: file.Path, + }, + } + cookieStore.SetSafeStorage(`Arc`, ``, ``) + if !yield(&cookies.CookieJar{CookieStore: cookieStore}, nil) { + return + } + } + } +} diff --git a/browser/arc/find_darwin.go b/browser/arc/find_darwin.go new file mode 100644 index 0000000..e9b71f2 --- /dev/null +++ b/browser/arc/find_darwin.go @@ -0,0 +1,17 @@ +//go:build darwin && !ios + +package arc + +import ( + "os" + "path/filepath" +) + +func arcChromiumRoots(yield func(string, error) bool) { + cfgDir, err := os.UserConfigDir() + if err != nil { + _ = yield(``, err) + return + } + _ = yield(filepath.Join(cfgDir, `Arc`, `User Data`), nil) +} diff --git a/browser/dia/dia.go b/browser/dia/dia.go new file mode 100644 index 0000000..75ffc65 --- /dev/null +++ b/browser/dia/dia.go @@ -0,0 +1,31 @@ +package dia + +import ( + "context" + + "github.com/browserutils/kooky" + "github.com/browserutils/kooky/internal/chrome" + "github.com/browserutils/kooky/internal/cookies" +) + +func ReadCookies(ctx context.Context, filename string, filters ...kooky.Filter) ([]*kooky.Cookie, error) { + return cookies.SingleRead(cookieStore, filename, filters...).ReadAllCookies(ctx) +} + +func TraverseCookies(filename string, filters ...kooky.Filter) kooky.CookieSeq { + return cookies.SingleRead(cookieStore, filename, filters...) +} + +// CookieStore has to be closed with CookieStore.Close() after use. +func CookieStore(filename string, filters ...kooky.Filter) (kooky.CookieStore, error) { + return cookieStore(filename, filters...) +} + +func cookieStore(filename string, filters ...kooky.Filter) (*cookies.CookieJar, error) { + s := &chrome.CookieStore{} + s.FileNameStr = filename + s.BrowserStr = `dia` + s.SetSafeStorage(`Dia`, ``, ``) + + return cookies.NewCookieJar(s, filters...), nil +} diff --git a/browser/dia/find.go b/browser/dia/find.go new file mode 100644 index 0000000..ce32d8e --- /dev/null +++ b/browser/dia/find.go @@ -0,0 +1,47 @@ +//go:build darwin && !ios + +package dia + +import ( + "github.com/browserutils/kooky" + "github.com/browserutils/kooky/internal/chrome" + chromefind "github.com/browserutils/kooky/internal/chrome/find" + "github.com/browserutils/kooky/internal/cookies" +) + +type diaFinder struct{} + +var _ kooky.CookieStoreFinder = (*diaFinder)(nil) + +func init() { + kooky.RegisterFinder(`dia`, &diaFinder{}) +} + +func (f *diaFinder) FindCookieStores() kooky.CookieStoreSeq { + return func(yield func(kooky.CookieStore, error) bool) { + for file, err := range chromefind.FindCookieStoreFiles(diaChromiumRoots, `dia`) { + if err != nil { + if !yield(nil, err) { + return + } + continue + } + if file == nil { + continue + } + cookieStore := &chrome.CookieStore{ + DefaultCookieStore: cookies.DefaultCookieStore{ + BrowserStr: file.Browser, + ProfileStr: file.Profile, + OSStr: file.OS, + IsDefaultProfileBool: file.IsDefaultProfile, + FileNameStr: file.Path, + }, + } + cookieStore.SetSafeStorage(`Dia`, ``, ``) + if !yield(&cookies.CookieJar{CookieStore: cookieStore}, nil) { + return + } + } + } +} diff --git a/browser/dia/find_darwin.go b/browser/dia/find_darwin.go new file mode 100644 index 0000000..8823d9d --- /dev/null +++ b/browser/dia/find_darwin.go @@ -0,0 +1,17 @@ +//go:build darwin && !ios + +package dia + +import ( + "os" + "path/filepath" +) + +func diaChromiumRoots(yield func(string, error) bool) { + cfgDir, err := os.UserConfigDir() + if err != nil { + _ = yield(``, err) + return + } + _ = yield(filepath.Join(cfgDir, `Dia`, `User Data`), nil) +} diff --git a/internal/chrome/README.md b/internal/chrome/README.md index f3034cb..1dc3b77 100644 --- a/internal/chrome/README.md +++ b/internal/chrome/README.md @@ -6,11 +6,12 @@ |----------------|-----------------------------|-------------------|-----------------------| | Chrome | Chrome Safe Storage | chrome | com.google.Chrome | | Chromium | Chromium Safe Storage | chromium | org.chromium.Chromium | +| Dia | Dia Safe Storage | dia | | +| Arc | Arc Safe Storage | arc | | | Brave | Brave Safe Storage | brave | | | Microsoft Edge | Microsoft Edge Safe Storage | chromium (shared) | | | Opera | uses Chromium Safe Storage | chromium (shared) | | | Vivaldi | (portal only) | vivaldi | com.vivaldi.Vivaldi | -| Arc | Arc Safe Storage | arc | | ## SQL schemes of file Cookies, table cookies