diff --git a/.gitignore b/.gitignore index 7d7934a..85d4ac9 100644 --- a/.gitignore +++ b/.gitignore @@ -190,4 +190,4 @@ result/ results/ hack-browser-data -!/hack-browser-data \ No newline at end of file +!/cmd/hack-browser-data \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml index c549e50..83d753e 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -28,8 +28,6 @@ linters: - 'revive' - 'typecheck' - 'unconvert' -# The linter 'varcheck' 'deadcode' 'structcheck' is deprecated (since v1.49.0), use 'unused' instead. - - 'unused' - 'whitespace' disable: # unsupported lint with golang 1.18+ ref: https://github.com/golangci/golangci-lint/issues/2649 @@ -38,8 +36,12 @@ linters: - 'noctx' - 'sqlclosecheck' - 'staticcheck' + - 'structcheck' - 'stylecheck' + - 'unused' - 'errcheck' + - 'deadcode' + - 'varcheck' issues: exclude-use-default: false @@ -58,8 +60,8 @@ issues: - G502 - G505 exclude-rules: - - path: internal/browser/browser\.go + - path: internal/provider/provider\.go linters: - 'unused' max-issues-per-linter: 0 - max-same-issues: 0 + max-same-issues: 0 \ No newline at end of file diff --git a/CONTRIBUTORS.svg b/CONTRIBUTORS.svg index 7e60083..9728990 100644 --- a/CONTRIBUTORS.svg +++ b/CONTRIBUTORS.svg @@ -1,4 +1,4 @@ - + @@ -21,16 +21,13 @@ - - - - + - + - + \ No newline at end of file diff --git a/cmd/hack-browser-data/main.go b/cmd/hack-browser-data/main.go index 9aa0e35..16e4c86 100644 --- a/cmd/hack-browser-data/main.go +++ b/cmd/hack-browser-data/main.go @@ -4,8 +4,8 @@ import ( "os" "strings" - "hack-browser-data/internal/browser" "hack-browser-data/internal/log" + "hack-browser-data/internal/provider" "hack-browser-data/internal/utils/fileutil" "github.com/urfave/cli/v2" @@ -29,11 +29,11 @@ func Execute() { Name: "hack-browser-data", Usage: "Export passwords/cookies/history/bookmarks from browser", UsageText: "[hack-browser-data -b chrome -f json -dir results -cc]\nExport all browingdata(password/cookie/history/bookmark) from browser\nGithub Link: https://github.com/moonD4rk/HackBrowserData", - Version: "0.4.3", + Version: "0.4.4", Flags: []cli.Flag{ &cli.BoolFlag{Name: "verbose", Aliases: []string{"vv"}, Destination: &verbose, Value: false, Usage: "verbose"}, &cli.BoolFlag{Name: "compress", Aliases: []string{"zip"}, Destination: &compress, Value: false, Usage: "compress result to zip"}, - &cli.StringFlag{Name: "browser", Aliases: []string{"b"}, Destination: &browserName, Value: "all", Usage: "available browsers: all|" + strings.Join(browser.ListBrowser(), "|")}, + &cli.StringFlag{Name: "browser", Aliases: []string{"b"}, Destination: &browserName, Value: "all", Usage: "available browsers: all|" + strings.Join(provider.ListBrowsers(), "|")}, &cli.StringFlag{Name: "results-dir", Aliases: []string{"dir"}, Destination: &outputDir, Value: "results", Usage: "export dir"}, &cli.StringFlag{Name: "format", Aliases: []string{"f"}, Destination: &outputFormat, Value: "csv", Usage: "file name csv|json"}, &cli.StringFlag{Name: "profile-path", Aliases: []string{"p"}, Destination: &profilePath, Value: "", Usage: "custom profile dir path, get with chrome://version"}, @@ -45,11 +45,8 @@ func Execute() { } else { log.Init("notice") } - var ( - browsers []browser.Browser - err error - ) - browsers, err = browser.PickBrowser(browserName, profilePath) + + browsers, err := provider.PickBrowsers(browserName, profilePath) if err != nil { log.Error(err) } diff --git a/internal/browser/browser.go b/internal/browser/browser.go index a3476e9..18b3cc1 100644 --- a/internal/browser/browser.go +++ b/internal/browser/browser.go @@ -1,17 +1,7 @@ package browser import ( - "os" - "path/filepath" - "sort" - "strings" - "hack-browser-data/internal/browingdata" - "hack-browser-data/internal/browser/chromium" - "hack-browser-data/internal/browser/firefox" - "hack-browser-data/internal/log" - "hack-browser-data/internal/utils/fileutil" - "hack-browser-data/internal/utils/typeutil" ) type Browser interface { @@ -20,114 +10,3 @@ type Browser interface { // BrowsingData returns all browsing data in the browser. BrowsingData() (*browingdata.Data, error) } - -func PickBrowser(name, profile string) ([]Browser, error) { - var browsers []Browser - clist := pickChromium(name, profile) - for _, b := range clist { - if b != nil { - browsers = append(browsers, b) - } - } - flist := pickFirefox(name, profile) - for _, b := range flist { - if b != nil { - browsers = append(browsers, b) - } - } - return browsers, nil -} - -func pickChromium(name, profile string) []Browser { - var browsers []Browser - name = strings.ToLower(name) - if name == "all" { - for _, v := range chromiumList { - if !fileutil.FolderExists(filepath.Clean(v.profilePath)) { - log.Noticef("find browser %s failed, profile folder does not exist", v.name) - continue - } - if multiChromium, err := chromium.New(v.name, v.storage, v.profilePath, v.items); err == nil { - log.Noticef("find browser %s success", v.name) - for _, b := range multiChromium { - log.Noticef("find browser %s success", b.Name()) - browsers = append(browsers, b) - } - } else { - log.Errorf("new chromium error: %s", err.Error()) - } - } - } - if c, ok := chromiumList[name]; ok { - if profile == "" { - profile = c.profilePath - } - if !fileutil.FolderExists(filepath.Clean(profile)) { - log.Fatalf("find browser %s failed, profile folder does not exist", c.name) - } - chromiumList, err := chromium.New(c.name, c.storage, profile, c.items) - if err != nil { - log.Fatalf("new chromium error: %s", err) - } - for _, b := range chromiumList { - log.Noticef("find browser %s success", b.Name()) - browsers = append(browsers, b) - } - } - return browsers -} - -func pickFirefox(name, profile string) []Browser { - var browsers []Browser - name = strings.ToLower(name) - if name == "all" || name == "firefox" { - for _, v := range firefoxList { - if profile == "" { - profile = v.profilePath - } else { - profile = fileutil.ParentDir(profile) - } - if !fileutil.FolderExists(filepath.Clean(profile)) { - log.Noticef("find browser firefox %s failed, profile folder does not exist", v.name) - continue - } - if multiFirefox, err := firefox.New(v.name, v.storage, profile, v.items); err == nil { - for _, b := range multiFirefox { - log.Noticef("find browser firefox %s success", b.Name()) - browsers = append(browsers, b) - } - } else { - log.Error(err) - } - } - return browsers - } - return nil -} - -func ListBrowser() []string { - var l []string - l = append(l, typeutil.Keys(chromiumList)...) - l = append(l, typeutil.Keys(firefoxList)...) - sort.Strings(l) - return l -} - -// home dir path for all platforms -var homeDir, _ = os.UserHomeDir() - -const ( - chromeName = "Chrome" - chromeBetaName = "Chrome Beta" - chromiumName = "Chromium" - edgeName = "Microsoft Edge" - braveName = "Brave" - operaName = "Opera" - operaGXName = "OperaGX" - vivaldiName = "Vivaldi" - coccocName = "CocCoc" - yandexName = "Yandex" - firefoxName = "Firefox" - speed360Name = "360speed" - qqBrowserName = "QQ" -) diff --git a/internal/browser/chromium/chromium.go b/internal/provider/chromium/chromium.go similarity index 96% rename from internal/browser/chromium/chromium.go rename to internal/provider/chromium/chromium.go index 9a7319e..f1e2041 100644 --- a/internal/browser/chromium/chromium.go +++ b/internal/provider/chromium/chromium.go @@ -6,6 +6,7 @@ import ( "strings" "hack-browser-data/internal/browingdata" + "hack-browser-data/internal/browser" "hack-browser-data/internal/item" "hack-browser-data/internal/utils/fileutil" "hack-browser-data/internal/utils/typeutil" @@ -21,7 +22,7 @@ type chromium struct { } // New create instance of chromium browser, fill item's path if item is existed. -func New(name, storage, profilePath string, items []item.Item) ([]*chromium, error) { +func New(name, storage, profilePath string, items []item.Item) ([]browser.Browser, error) { c := &chromium{ name: name, storage: storage, @@ -32,7 +33,7 @@ func New(name, storage, profilePath string, items []item.Item) ([]*chromium, err if err != nil { return nil, err } - chromiumList := make([]*chromium, 0, len(multiItemPaths)) + chromiumList := make([]browser.Browser, 0, len(multiItemPaths)) for user, itemPaths := range multiItemPaths { chromiumList = append(chromiumList, &chromium{ name: fileutil.BrowserName(name, user), diff --git a/internal/browser/chromium/chromium_darwin.go b/internal/provider/chromium/chromium_darwin.go similarity index 100% rename from internal/browser/chromium/chromium_darwin.go rename to internal/provider/chromium/chromium_darwin.go diff --git a/internal/browser/chromium/chromium_linux.go b/internal/provider/chromium/chromium_linux.go similarity index 100% rename from internal/browser/chromium/chromium_linux.go rename to internal/provider/chromium/chromium_linux.go diff --git a/internal/browser/chromium/chromium_windows.go b/internal/provider/chromium/chromium_windows.go similarity index 100% rename from internal/browser/chromium/chromium_windows.go rename to internal/provider/chromium/chromium_windows.go diff --git a/internal/browser/firefox/firefox.go b/internal/provider/firefox/firefox.go similarity index 95% rename from internal/browser/firefox/firefox.go rename to internal/provider/firefox/firefox.go index fc0dcbd..268f342 100644 --- a/internal/browser/firefox/firefox.go +++ b/internal/provider/firefox/firefox.go @@ -7,6 +7,7 @@ import ( "path/filepath" "hack-browser-data/internal/browingdata" + "hack-browser-data/internal/browser" "hack-browser-data/internal/item" "hack-browser-data/internal/utils/fileutil" "hack-browser-data/internal/utils/typeutil" @@ -24,7 +25,7 @@ type firefox struct { var ErrProfilePathNotFound = errors.New("profile path not found") // New returns a new firefox instance. -func New(name, storage, profilePath string, items []item.Item) ([]*firefox, error) { +func New(name, storage, profilePath string, items []item.Item) ([]browser.Browser, error) { f := &firefox{ name: name, storage: storage, @@ -36,7 +37,7 @@ func New(name, storage, profilePath string, items []item.Item) ([]*firefox, erro return nil, err } - firefoxList := make([]*firefox, 0, len(multiItemPaths)) + firefoxList := make([]browser.Browser, 0, len(multiItemPaths)) for name, itemPaths := range multiItemPaths { firefoxList = append(firefoxList, &firefox{ name: fmt.Sprintf("firefox-%s", name), diff --git a/internal/provider/provider.go b/internal/provider/provider.go new file mode 100644 index 0000000..21177ce --- /dev/null +++ b/internal/provider/provider.go @@ -0,0 +1,126 @@ +package provider + +import ( + "os" + "path/filepath" + "sort" + "strings" + + "hack-browser-data/internal/browser" + "hack-browser-data/internal/log" + "hack-browser-data/internal/provider/chromium" + "hack-browser-data/internal/provider/firefox" + "hack-browser-data/internal/utils/fileutil" + "hack-browser-data/internal/utils/typeutil" +) + +func PickBrowsers(name, profile string) ([]browser.Browser, error) { + var browsers []browser.Browser + clist := pickChromium(name, profile) + for _, b := range clist { + if b != nil { + browsers = append(browsers, b) + } + } + flist := pickFirefox(name, profile) + for _, b := range flist { + if b != nil { + browsers = append(browsers, b) + } + } + return browsers, nil +} + +func pickChromium(name, profile string) []browser.Browser { + var browsers []browser.Browser + name = strings.ToLower(name) + if name == "all" { + for _, v := range chromiumList { + if !fileutil.FolderExists(filepath.Clean(v.profilePath)) { + log.Noticef("find browser %s failed, profile folder does not exist", v.name) + continue + } + if multiChromium, err := chromium.New(v.name, v.storage, v.profilePath, v.items); err == nil { + log.Noticef("find browser %s success", v.name) + for _, b := range multiChromium { + log.Noticef("find browser %s success", b.Name()) + browsers = append(browsers, b) + } + } else { + log.Errorf("new chromium error: %s", err.Error()) + } + } + } + if c, ok := chromiumList[name]; ok { + if profile == "" { + profile = c.profilePath + } + if !fileutil.FolderExists(filepath.Clean(profile)) { + log.Fatalf("find browser %s failed, profile folder does not exist", c.name) + } + chromiumList, err := chromium.New(c.name, c.storage, profile, c.items) + if err != nil { + log.Fatalf("new chromium error: %s", err) + } + for _, b := range chromiumList { + log.Noticef("find browser %s success", b.Name()) + browsers = append(browsers, b) + } + } + return browsers +} + +func pickFirefox(name, profile string) []browser.Browser { + var browsers []browser.Browser + name = strings.ToLower(name) + if name == "all" || name == "firefox" { + for _, v := range firefoxList { + if profile == "" { + profile = v.profilePath + } else { + profile = fileutil.ParentDir(profile) + } + if !fileutil.FolderExists(filepath.Clean(profile)) { + log.Noticef("find browser firefox %s failed, profile folder does not exist", v.name) + continue + } + if multiFirefox, err := firefox.New(v.name, v.storage, profile, v.items); err == nil { + for _, b := range multiFirefox { + log.Noticef("find browser firefox %s success", b.Name()) + browsers = append(browsers, b) + } + } else { + log.Error(err) + } + } + return browsers + } + return nil +} + +func ListBrowsers() []string { + var l []string + l = append(l, typeutil.Keys(chromiumList)...) + l = append(l, typeutil.Keys(firefoxList)...) + sort.Strings(l) + return l +} + +// home dir path for all platforms +var homeDir, _ = os.UserHomeDir() + +const ( + chromeName = "Chrome" + chromeBetaName = "Chrome Beta" + chromiumName = "Chromium" + edgeName = "Microsoft Edge" + braveName = "Brave" + operaName = "Opera" + operaGXName = "OperaGX" + vivaldiName = "Vivaldi" + coccocName = "CocCoc" + yandexName = "Yandex" + firefoxName = "Firefox" + speed360Name = "360speed" + qqBrowserName = "QQ" +) diff --git a/internal/browser/browser_darwin.go b/internal/provider/provider_darwin.go similarity index 99% rename from internal/browser/browser_darwin.go rename to internal/provider/provider_darwin.go index 55b0ba8..6356436 100644 --- a/internal/browser/browser_darwin.go +++ b/internal/provider/provider_darwin.go @@ -1,6 +1,6 @@ //go:build darwin -package browser +package provider import ( "hack-browser-data/internal/item" diff --git a/internal/browser/browser_linux.go b/internal/provider/provider_linux.go similarity index 99% rename from internal/browser/browser_linux.go rename to internal/provider/provider_linux.go index 08ca83f..3f4a3cc 100644 --- a/internal/browser/browser_linux.go +++ b/internal/provider/provider_linux.go @@ -1,6 +1,6 @@ //go:build linux -package browser +package provider import ( "hack-browser-data/internal/item" diff --git a/internal/browser/browser_windows.go b/internal/provider/provider_windows.go similarity index 99% rename from internal/browser/browser_windows.go rename to internal/provider/provider_windows.go index b4c964d..adb3507 100644 --- a/internal/browser/browser_windows.go +++ b/internal/provider/provider_windows.go @@ -1,6 +1,6 @@ //go:build windows -package browser +package provider import ( "hack-browser-data/internal/item"