Skip to content

Commit e623041

Browse files
committed
refactor
1 parent 25699b0 commit e623041

File tree

19 files changed

+207
-310
lines changed

19 files changed

+207
-310
lines changed

browser/browser.go

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,41 +7,28 @@ import (
77

88
"github.com/moond4rk/hackbrowserdata/browser/chromium"
99
"github.com/moond4rk/hackbrowserdata/browser/firefox"
10-
"github.com/moond4rk/hackbrowserdata/browsingdata"
10+
"github.com/moond4rk/hackbrowserdata/browser/model"
1111
"github.com/moond4rk/hackbrowserdata/log"
1212
"github.com/moond4rk/hackbrowserdata/utils/fileutil"
1313
"github.com/moond4rk/hackbrowserdata/utils/typeutil"
1414
)
1515

16-
type Browser interface {
17-
// Name is browser's name
18-
Name() string
19-
// BrowsingData returns all browsing data in the browser.
20-
BrowsingData(isFullExport bool) (*browsingdata.Data, error)
21-
}
16+
type Browser = model.Browser
2217

2318
// PickBrowsers returns a list of browsers that match the name and profile.
2419
func PickBrowsers(name, profile string) ([]Browser, error) {
2520
var browsers []Browser
2621
clist := pickChromium(name, profile)
27-
for _, b := range clist {
28-
if b != nil {
29-
browsers = append(browsers, b)
30-
}
31-
}
22+
browsers = append(browsers, clist...)
3223
flist := pickFirefox(name, profile)
33-
for _, b := range flist {
34-
if b != nil {
35-
browsers = append(browsers, b)
36-
}
37-
}
24+
browsers = append(browsers, flist...)
3825
return browsers, nil
3926
}
4027

4128
func pickChromium(name, profile string) []Browser {
42-
var browsers []Browser
4329
name = strings.ToLower(name)
4430
if name == "all" {
31+
var browsers []Browser
4532
for _, v := range chromiumList {
4633
if !fileutil.IsDirExists(filepath.Clean(v.profilePath)) {
4734
log.Noticef("find browser %s failed, profile folder does not exist", v.name)
@@ -53,10 +40,11 @@ func pickChromium(name, profile string) []Browser {
5340
continue
5441
}
5542
for _, b := range multiChromium {
56-
log.Noticef("find browser %s success", b.Name())
57-
browsers = append(browsers, b)
43+
log.Noticef("find browser %s success", b.Name)
5844
}
45+
browsers = append(browsers, multiChromium...)
5946
}
47+
return browsers
6048
}
6149
if c, ok := chromiumList[name]; ok {
6250
if profile == "" {
@@ -70,15 +58,14 @@ func pickChromium(name, profile string) []Browser {
7058
log.Fatalf("new chromium error: %s", err)
7159
}
7260
for _, b := range chromiumList {
73-
log.Noticef("find browser %s success", b.Name())
74-
browsers = append(browsers, b)
61+
log.Noticef("find browser %s success", b.Name)
7562
}
63+
return chromiumList
7664
}
77-
return browsers
65+
return nil
7866
}
7967

8068
func pickFirefox(name, profile string) []Browser {
81-
var browsers []Browser
8269
name = strings.ToLower(name)
8370
if name == "all" || name == "firefox" {
8471
for _, v := range firefoxList {
@@ -95,15 +82,13 @@ func pickFirefox(name, profile string) []Browser {
9582

9683
if multiFirefox, err := firefox.New(profile, v.items); err == nil {
9784
for _, b := range multiFirefox {
98-
log.Noticef("find browser firefox %s success", b.Name())
99-
browsers = append(browsers, b)
85+
log.Noticef("find browser firefox %s success", b.Name)
10086
}
87+
return multiFirefox
10188
} else {
10289
log.Error(err)
10390
}
10491
}
105-
106-
return browsers
10792
}
10893

10994
return nil

browser/chromium/chromium.go

Lines changed: 10 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -5,101 +5,32 @@ import (
55
"path/filepath"
66
"strings"
77

8-
"github.com/moond4rk/hackbrowserdata/browsingdata"
8+
"github.com/moond4rk/hackbrowserdata/browser/model"
99
"github.com/moond4rk/hackbrowserdata/item"
1010
"github.com/moond4rk/hackbrowserdata/utils/fileutil"
11-
"github.com/moond4rk/hackbrowserdata/utils/typeutil"
1211
)
1312

14-
type Chromium struct {
15-
name string
16-
storage string
17-
profilePath string
18-
masterKey []byte
19-
items []item.Item
20-
itemPaths map[item.Item]string
21-
}
13+
type Browser = model.Browser
2214

2315
// New create instance of Chromium browser, fill item's path if item is existed.
24-
func New(name, storage, profilePath string, items []item.Item) ([]*Chromium, error) {
25-
c := &Chromium{
26-
name: name,
27-
storage: storage,
28-
profilePath: profilePath,
29-
items: items,
30-
}
31-
multiItemPaths, err := c.userItemPaths(c.profilePath, c.items)
16+
func New(name, storage, profilePath string, items []item.Item) ([]Browser, error) {
17+
multiItemPaths, err := userItemPaths(profilePath, items)
3218
if err != nil {
3319
return nil, err
3420
}
35-
chromiumList := make([]*Chromium, 0, len(multiItemPaths))
21+
chromiumList := make([]Browser, 0, len(multiItemPaths))
3622
for user, itemPaths := range multiItemPaths {
37-
chromiumList = append(chromiumList, &Chromium{
38-
name: fileutil.BrowserName(name, user),
39-
items: typeutil.Keys(itemPaths),
40-
itemPaths: itemPaths,
41-
storage: storage,
23+
chromiumList = append(chromiumList, Browser{
24+
Name: fileutil.BrowserName(name, user),
25+
MasterKey: GetMasterKey(),
26+
ItemPaths: itemPaths,
4227
})
4328
}
4429
return chromiumList, nil
4530
}
4631

47-
func (c *Chromium) Name() string {
48-
return c.name
49-
}
50-
51-
func (c *Chromium) BrowsingData(isFullExport bool) (*browsingdata.Data, error) {
52-
items := c.items
53-
if !isFullExport {
54-
items = item.FilterSensitiveItems(c.items)
55-
}
56-
57-
data := browsingdata.New(items)
58-
59-
if err := c.copyItemToLocal(); err != nil {
60-
return nil, err
61-
}
62-
63-
masterKey, err := c.GetMasterKey()
64-
if err != nil {
65-
return nil, err
66-
}
67-
68-
c.masterKey = masterKey
69-
if err := data.Recovery(c.masterKey); err != nil {
70-
return nil, err
71-
}
72-
73-
return data, nil
74-
}
75-
76-
func (c *Chromium) copyItemToLocal() error {
77-
for i, path := range c.itemPaths {
78-
filename := i.String()
79-
var err error
80-
switch {
81-
case fileutil.IsDirExists(path):
82-
if i == item.ChromiumLocalStorage {
83-
err = fileutil.CopyDir(path, filename, "lock")
84-
}
85-
if i == item.ChromiumSessionStorage {
86-
err = fileutil.CopyDir(path, filename, "lock")
87-
}
88-
if i == item.ChromiumExtension {
89-
err = fileutil.CopyDirHasSuffix(path, filename, "manifest.json")
90-
}
91-
default:
92-
err = fileutil.CopyFile(path, filename)
93-
}
94-
if err != nil {
95-
return err
96-
}
97-
}
98-
return nil
99-
}
100-
10132
// userItemPaths return a map of user to item path, map[profile 1][item's name & path key pair]
102-
func (c *Chromium) userItemPaths(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) {
33+
func userItemPaths(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) {
10334
multiItemPaths := make(map[string]map[item.Item]string)
10435
parentDir := fileutil.ParentDir(profilePath)
10536
err := filepath.Walk(parentDir, chromiumWalkFunc(items, multiItemPaths))

browser/chromium/chromium_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/moond4rk/hackbrowserdata/log"
1616
)
1717

18-
func (c *Chromium) GetMasterKey() ([]byte, error) {
18+
func GetMasterKey(name, storage string) ([]byte, error) {
1919
// what is d-bus @https://dbus.freedesktop.org/
2020
// don't need chromium key file for Linux
2121
defer os.Remove(item.TempChromiumKey)

browser/chromium/chromium_windows.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package chromium
55
import (
66
"encoding/base64"
77
"errors"
8-
"os"
98

109
"github.com/tidwall/gjson"
1110

@@ -17,12 +16,11 @@ import (
1716

1817
var errDecodeMasterKeyFailed = errors.New("decode master key failed")
1918

20-
func (c *Chromium) GetMasterKey() ([]byte, error) {
21-
b, err := fileutil.ReadFile(item.TempChromiumKey)
19+
func GetMasterKey(name, _ string) ([]byte, error) {
20+
b, err := fileutil.ReadFile(item.ChromiumKey.FileName())
2221
if err != nil {
2322
return nil, err
2423
}
25-
defer os.Remove(item.TempChromiumKey)
2624

2725
encryptedKey := gjson.Get(b, "os_crypt.encrypted_key")
2826
if !encryptedKey.Exists() {
@@ -33,7 +31,11 @@ func (c *Chromium) GetMasterKey() ([]byte, error) {
3331
if err != nil {
3432
return nil, errDecodeMasterKeyFailed
3533
}
36-
c.masterKey, err = crypto.DPAPI(key[5:])
37-
log.Infof("%s initialized master key success", c.name)
38-
return c.masterKey, err
34+
masterKey, err := crypto.DPAPI(key[5:])
35+
if err != nil {
36+
log.Errorf("%s failed to decrypt master key, maybe this profile was created on a different OS installation", name)
37+
return nil, err
38+
}
39+
log.Infof("%s initialized master key success", name)
40+
return masterKey, nil
3941
}

browser/firefox/firefox.go

Lines changed: 8 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,51 +6,33 @@ import (
66
"io/fs"
77
"path/filepath"
88

9-
"github.com/moond4rk/hackbrowserdata/browsingdata"
9+
"github.com/moond4rk/hackbrowserdata/browser/model"
1010
"github.com/moond4rk/hackbrowserdata/item"
1111
"github.com/moond4rk/hackbrowserdata/utils/fileutil"
12-
"github.com/moond4rk/hackbrowserdata/utils/typeutil"
1312
)
1413

15-
type Firefox struct {
16-
name string
17-
storage string
18-
profilePath string
19-
masterKey []byte
20-
items []item.Item
21-
itemPaths map[item.Item]string
22-
}
14+
type Browser = model.Browser
2315

2416
var ErrProfilePathNotFound = errors.New("profile path not found")
2517

2618
// New returns new Firefox instances.
27-
func New(profilePath string, items []item.Item) ([]*Firefox, error) {
19+
func New(profilePath string, items []item.Item) ([]Browser, error) {
2820
multiItemPaths := make(map[string]map[item.Item]string)
2921
// ignore walk dir error since it can be produced by a single entry
3022
_ = filepath.WalkDir(profilePath, firefoxWalkFunc(items, multiItemPaths))
3123

32-
firefoxList := make([]*Firefox, 0, len(multiItemPaths))
24+
firefoxList := make([]Browser, 0, len(multiItemPaths))
3325
for name, itemPaths := range multiItemPaths {
34-
firefoxList = append(firefoxList, &Firefox{
35-
name: fmt.Sprintf("firefox-%s", name),
36-
items: typeutil.Keys(itemPaths),
37-
itemPaths: itemPaths,
26+
firefoxList = append(firefoxList, Browser{
27+
Name: fmt.Sprintf("firefox-%s", name),
28+
MasterKey: nil,
29+
ItemPaths: itemPaths,
3830
})
3931
}
4032

4133
return firefoxList, nil
4234
}
4335

44-
func (f *Firefox) copyItemToLocal() error {
45-
for i, path := range f.itemPaths {
46-
filename := i.String()
47-
if err := fileutil.CopyFile(path, filename); err != nil {
48-
return err
49-
}
50-
}
51-
return nil
52-
}
53-
5436
func firefoxWalkFunc(items []item.Item, multiItemPaths map[string]map[item.Item]string) fs.WalkDirFunc {
5537
return func(path string, info fs.DirEntry, err error) error {
5638
for _, v := range items {
@@ -67,35 +49,3 @@ func firefoxWalkFunc(items []item.Item, multiItemPaths map[string]map[item.Item]
6749
return err
6850
}
6951
}
70-
71-
func (f *Firefox) GetMasterKey() ([]byte, error) {
72-
return f.masterKey, nil
73-
}
74-
75-
func (f *Firefox) Name() string {
76-
return f.name
77-
}
78-
79-
func (f *Firefox) BrowsingData(isFullExport bool) (*browsingdata.Data, error) {
80-
items := f.items
81-
if !isFullExport {
82-
items = item.FilterSensitiveItems(f.items)
83-
}
84-
85-
b := browsingdata.New(items)
86-
87-
if err := f.copyItemToLocal(); err != nil {
88-
return nil, err
89-
}
90-
91-
masterKey, err := f.GetMasterKey()
92-
if err != nil {
93-
return nil, err
94-
}
95-
96-
f.masterKey = masterKey
97-
if err := b.Recovery(f.masterKey); err != nil {
98-
return nil, err
99-
}
100-
return b, nil
101-
}

browser/model/model.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package model
2+
3+
import (
4+
"strings"
5+
6+
"github.com/moond4rk/hackbrowserdata/item"
7+
)
8+
9+
type Browser struct {
10+
Name string
11+
MasterKey []byte
12+
ItemPaths map[item.Item]string
13+
}
14+
15+
func (b *Browser) IsYandex() bool {
16+
return strings.HasPrefix(b.Name, "yandex")
17+
}

0 commit comments

Comments
 (0)