|
|
@ -1,6 +1,7 @@ |
|
|
|
package chromium |
|
|
|
package chromium |
|
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
import ( |
|
|
|
|
|
|
|
"io/fs" |
|
|
|
"os" |
|
|
|
"os" |
|
|
|
"path/filepath" |
|
|
|
"path/filepath" |
|
|
|
"strings" |
|
|
|
"strings" |
|
|
@ -21,19 +22,26 @@ type chromium struct { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// New create instance of chromium browser, fill item's path if item is existed.
|
|
|
|
// 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) ([]*chromium, error) { |
|
|
|
c := &chromium{ |
|
|
|
c := &chromium{ |
|
|
|
name: name, |
|
|
|
name: name, |
|
|
|
storage: storage, |
|
|
|
storage: storage, |
|
|
|
|
|
|
|
profilePath: profilePath, |
|
|
|
|
|
|
|
items: items, |
|
|
|
} |
|
|
|
} |
|
|
|
itemsPaths, err := c.getItemPath(profilePath, items) |
|
|
|
multiItemPaths, err := c.getMultiItemPath(c.profilePath, c.items) |
|
|
|
if err != nil { |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
} |
|
|
|
c.profilePath = profilePath |
|
|
|
var chromiumList []*chromium |
|
|
|
c.itemPaths = itemsPaths |
|
|
|
for user, itemPaths := range multiItemPaths { |
|
|
|
c.items = typeutil.Keys(itemsPaths) |
|
|
|
chromiumList = append(chromiumList, &chromium{ |
|
|
|
return c, err |
|
|
|
name: fileutil.BrowserName(name, user), |
|
|
|
|
|
|
|
items: typeutil.Keys(itemPaths), |
|
|
|
|
|
|
|
itemPaths: itemPaths, |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return chromiumList, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (c *chromium) Name() string { |
|
|
|
func (c *chromium) Name() string { |
|
|
@ -93,6 +101,54 @@ func (c *chromium) getItemPath(profilePath string, items []item.Item) (map[item. |
|
|
|
return itemPaths, nil |
|
|
|
return itemPaths, nil |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (c *chromium) getMultiItemPath(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) { |
|
|
|
|
|
|
|
var multiItemPaths = make(map[string]map[item.Item]string) |
|
|
|
|
|
|
|
parentDir := fileutil.ParentDir(profilePath) |
|
|
|
|
|
|
|
err := filepath.Walk(parentDir, chromiumWalkFunc2(items, multiItemPaths)) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
|
|
|
|
return nil, err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
var keyPath string |
|
|
|
|
|
|
|
var dir string |
|
|
|
|
|
|
|
for userDir, v := range multiItemPaths { |
|
|
|
|
|
|
|
for _, p := range v { |
|
|
|
|
|
|
|
if strings.HasSuffix(p, item.ChromiumKey.FileName()) { |
|
|
|
|
|
|
|
keyPath = p |
|
|
|
|
|
|
|
dir = userDir |
|
|
|
|
|
|
|
break |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
t := make(map[string]map[item.Item]string) |
|
|
|
|
|
|
|
for userDir, v := range multiItemPaths { |
|
|
|
|
|
|
|
if userDir == dir { |
|
|
|
|
|
|
|
continue |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
t[userDir] = v |
|
|
|
|
|
|
|
t[userDir][item.ChromiumKey] = keyPath |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return t, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func chromiumWalkFunc2(items []item.Item, multiItemPaths map[string]map[item.Item]string) filepath.WalkFunc { |
|
|
|
|
|
|
|
return func(path string, info fs.FileInfo, err error) error { |
|
|
|
|
|
|
|
for _, v := range items { |
|
|
|
|
|
|
|
if info.Name() == v.FileName() { |
|
|
|
|
|
|
|
parentBaseDir := fileutil.ParentBaseDir(path) |
|
|
|
|
|
|
|
if parentBaseDir == "System Profile" { |
|
|
|
|
|
|
|
continue |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if _, exist := multiItemPaths[parentBaseDir]; exist { |
|
|
|
|
|
|
|
multiItemPaths[parentBaseDir][v] = path |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
multiItemPaths[parentBaseDir] = map[item.Item]string{v: path} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return err |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func chromiumWalkFunc(items []item.Item, itemPaths map[item.Item]string, baseDir string) filepath.WalkFunc { |
|
|
|
func chromiumWalkFunc(items []item.Item, itemPaths map[item.Item]string, baseDir string) filepath.WalkFunc { |
|
|
|
return func(path string, info os.FileInfo, err error) error { |
|
|
|
return func(path string, info os.FileInfo, err error) error { |
|
|
|
for _, it := range items { |
|
|
|
for _, it := range items { |
|
|
|