feat: rename item name

This commit is contained in:
ᴍᴏᴏɴD4ʀᴋ
2022-04-02 14:47:12 +08:00
parent 05659822b7
commit 303e00cd28
14 changed files with 387 additions and 465 deletions
-221
View File
@@ -1,16 +1,10 @@
package browser
import (
"fmt"
"io/fs"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"hack-browser-data/internal/browser/data"
"hack-browser-data/internal/browser/item"
)
type Browser interface {
@@ -90,185 +84,6 @@ func pickFirefox(name string) []Browser {
return nil
}
type chromium struct {
browserInfo *browserInfo
items []item.Item
itemPaths map[item.Item]string
}
// newChromium 根据浏览器信息生成 Browser Interface
func newChromium(info *browserInfo, items []item.Item) (*chromium, error) {
c := &chromium{
browserInfo: info,
items: items,
}
absProfilePath := path.Join(homeDir, filepath.Clean(c.browserInfo.profilePath))
// TODO: Handle file path is not exist
if !isFileExist(absProfilePath) {
return nil, fmt.Errorf("%s profile path is not exist", absProfilePath)
}
itemsPaths, err := getChromiumItemPath(absProfilePath, c.items)
if err != nil {
return nil, err
}
c.itemPaths = itemsPaths
return c, err
}
func (c *chromium) GetName() string {
return c.browserInfo.name
}
func (c *chromium) GetBrowsingData() []data.BrowsingData {
var browsingData []data.BrowsingData
for item := range c.itemPaths {
d := item.NewBrowsingData()
if d != nil {
browsingData = append(browsingData, d)
}
}
return browsingData
}
func (c *chromium) CopyItemFileToLocal() error {
for item, sourcePath := range c.itemPaths {
var dstFilename = item.FileName()
locals, _ := filepath.Glob("*")
for _, v := range locals {
if v == dstFilename {
err := os.Remove(dstFilename)
// TODO: Should Continue all iteration error
if err != nil {
return err
}
}
}
// TODO: Handle read file error
sourceFile, err := ioutil.ReadFile(sourcePath)
if err != nil {
fmt.Println(err.Error())
}
err = ioutil.WriteFile(dstFilename, sourceFile, 0777)
if err != nil {
return err
}
}
return nil
}
type firefox struct {
browserInfo *browserInfo
items []item.Item
itemPaths map[item.Item]string
multiItemPaths map[string]map[item.Item]string
}
// newFirefox
func newMultiFirefox(info *browserInfo, items []item.Item) ([]*firefox, error) {
f := &firefox{
browserInfo: info,
items: items,
}
multiItemPaths, err := getFirefoxItemAbsPath(f.browserInfo.profilePath, f.items)
if err != nil {
if strings.Contains(err.Error(), "profile path is not exist") {
fmt.Println(err)
return nil, nil
}
panic(err)
}
var firefoxList []*firefox
for name, value := range multiItemPaths {
firefoxList = append(firefoxList, &firefox{
browserInfo: &browserInfo{
name: name,
masterKey: nil,
},
items: items,
itemPaths: value,
})
}
return firefoxList, nil
}
func getFirefoxItemAbsPath(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) {
var multiItemPaths = make(map[string]map[item.Item]string)
absProfilePath := path.Join(homeDir, filepath.Clean(profilePath))
// TODO: Handle read file error
if !isFileExist(absProfilePath) {
return nil, fmt.Errorf("%s profile path is not exist", absProfilePath)
}
err := filepath.Walk(absProfilePath, firefoxWalkFunc(items, multiItemPaths))
return multiItemPaths, err
}
func (f *firefox) CopyItemFileToLocal() error {
for item, sourcePath := range f.itemPaths {
var dstFilename = item.FileName()
locals, _ := filepath.Glob("*")
for _, v := range locals {
if v == dstFilename {
err := os.Remove(dstFilename)
// TODO: Should Continue all iteration error
if err != nil {
return err
}
}
}
// TODO: Handle read file name error
sourceFile, err := ioutil.ReadFile(sourcePath)
if err != nil {
fmt.Println(err.Error())
}
err = ioutil.WriteFile(dstFilename, sourceFile, 0777)
if err != nil {
return err
}
}
return nil
}
func firefoxWalkFunc(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.DefaultName() {
parentDir := getParentDir(path)
if _, exist := multiItemPaths[parentDir]; exist {
multiItemPaths[parentDir][v] = path
} else {
multiItemPaths[parentDir] = map[item.Item]string{v: path}
}
}
}
return err
}
}
func getParentDir(absPath string) string {
return filepath.Base(filepath.Dir(absPath))
}
func (f *firefox) GetMasterKey() ([]byte, error) {
return f.browserInfo.masterKey, nil
}
func (f *firefox) GetName() string {
return f.browserInfo.name
}
func (f *firefox) GetBrowsingData() []data.BrowsingData {
var browsingData []data.BrowsingData
for item := range f.itemPaths {
d := item.NewBrowsingData()
if d != nil {
browsingData = append(browsingData, d)
}
}
return browsingData
}
func ListBrowser() []string {
var l []string
for c := range chromiumList {
@@ -313,39 +128,3 @@ const (
coccocName = "CocCoc"
yandexName = "Yandex"
)
var defaultFirefoxItems = []item.Item{
item.firefoxKey4,
item.firefoxPassword,
item.firefoxCookie,
item.firefoxBookmark,
item.firefoxHistory,
item.firefoxDownload,
item.firefoxCreditCard,
item.firefoxLocalStorage,
item.firefoxExtension,
}
var defaultYandexItems = []item.Item{
item.chromiumKey,
item.yandexPassword,
item.chromiumCookie,
item.chromiumBookmark,
item.chromiumHistory,
item.chromiumDownload,
item.yandexCreditCard,
item.chromiumLocalStorage,
item.chromiumExtension,
}
var defaultChromiumItems = []item.Item{
item.chromiumKey,
item.chromiumPassword,
item.chromiumCookie,
item.chromiumBookmark,
item.chromiumHistory,
item.chromiumDownload,
item.chromiumCreditCard,
item.chromiumLocalStorage,
item.chromiumExtension,
}
+11 -11
View File
@@ -8,7 +8,7 @@ import (
"golang.org/x/crypto/pbkdf2"
"hack-browser-data/internal/browser/item"
"hack-browser-data/internal/item"
)
var (
@@ -18,43 +18,43 @@ var (
}{
"chrome": {
browserInfo: chromeInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"edge": {
browserInfo: edgeInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"chromium": {
browserInfo: chromiumInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"chrome-beta": {
browserInfo: chromeBetaInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"opera": {
browserInfo: operaInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"opera-gx": {
browserInfo: operaGXInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"vivaldi": {
browserInfo: vivaldiInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"coccoc": {
browserInfo: coccocInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"brave": {
browserInfo: braveInfo,
items: defaultChromiumItems,
items: item.DefaultChromium,
},
"yandex": {
browserInfo: yandexInfo,
items: defaultYandexItems,
items: item.DefaultYandex,
},
}
firefoxList = map[string]struct {
+4 -2
View File
@@ -7,14 +7,16 @@ import (
"github.com/tidwall/gjson"
"hack-browser-data/internal/browser/item"
"hack-browser-data/internal/decrypter"
item2 "hack-browser-data/internal/item"
"hack-browser-data/internal/utils"
)
var (
chromiumList = map[string]struct {
browserInfo *browserInfo
items []item.Item
items []item2.Item
}{
"chrome": {
browserInfo: chromeInfo,
@@ -31,7 +33,7 @@ var (
}
firefoxList = map[string]struct {
browserInfo *browserInfo
items []item.Item
items []item2.Item
}{
"firefox": {
browserInfo: firefoxInfo,
+6 -6
View File
@@ -9,7 +9,7 @@ import (
"strings"
"hack-browser-data/internal/browser/data"
"hack-browser-data/internal/browser/item"
"hack-browser-data/internal/item"
)
type chromium struct {
@@ -21,15 +21,15 @@ type chromium struct {
itemPaths map[item.Item]string
}
// newChromium 根据浏览器信息生成 Browser Interface
func newChromium(name, storage, profilePath string, items []item.Item) (*chromium, error) {
// New 根据浏览器信息生成 Browser Interface
func New(name, storage, profilePath string, items []item.Item) (*chromium, error) {
c := &chromium{
name: name,
storage: storage,
profilePath: profilePath,
items: items,
}
absProfilePath := path.Join(homeDir, filepath.Clean(c.browserInfo.profilePath))
absProfilePath := path.Join(homeDir, filepath.Clean(c.ProfilePath))
// TODO: Handle file path is not exist
if !isFileExist(absProfilePath) {
return nil, fmt.Errorf("%s profile path is not exist", absProfilePath)
@@ -59,7 +59,7 @@ func (c *chromium) GetBrowsingData() []data.BrowsingData {
func (c *chromium) CopyItemFileToLocal() error {
for item, sourcePath := range c.itemPaths {
var dstFilename = item.FileName()
var dstFilename = item.TempName()
locals, _ := filepath.Glob("*")
for _, v := range locals {
if v == dstFilename {
@@ -94,7 +94,7 @@ func chromiumWalkFunc(items []item.Item, itemPaths map[item.Item]string) filepat
return func(path string, info os.FileInfo, err error) error {
for _, it := range items {
switch {
case it.DefaultName() == info.Name():
case it.FileName() == info.Name():
if it == it.chromiumKey {
itemPaths[it] = path
}
+8 -3
View File
@@ -8,10 +8,15 @@ import (
"github.com/tidwall/gjson"
"hack-browser-data/internal/browser/item"
item2 "hack-browser-data/internal/item"
"hack-browser-data/internal/utils"
)
type ChromiumBookmark []bookmark
type ChromiumBookmark struct {
bookmarks []bookmark
item item2.Item
}
func (c *ChromiumBookmark) Parse(masterKey []byte) error {
bookmarks, err := utils.ReadFile(item.ChromiumBookmarkFilename)
@@ -27,8 +32,8 @@ func (c *ChromiumBookmark) Parse(masterKey []byte) error {
})
}
// TODO: 使用泛型重构
sort.Slice(*c, func(i, j int) bool {
return (*c)[i].DateAdded.After((*c)[j].DateAdded)
sort.Slice(c.bookmarks, func(i, j int) bool {
return (c.bookmarks)[i].DateAdded.After((c.bookmarks)[j].DateAdded)
})
return nil
}
+3 -1
View File
@@ -1,6 +1,8 @@
package data
import "time"
import (
"time"
)
type BrowsingData interface {
Parse(masterKey []byte) error
+128
View File
@@ -1 +1,129 @@
package firefox
import (
"fmt"
"io/fs"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"hack-browser-data/internal/browser/data"
"hack-browser-data/internal/item"
)
type firefox struct {
name string
storage string
profilePath string
masterKey []byte
items []item.Item
itemPaths map[item.Item]string
multiItemPaths map[string]map[item.Item]string
}
// New
func New(info *browserInfo, items []item.Item) ([]*firefox, error) {
f := &firefox{
browserInfo: info,
items: items,
}
multiItemPaths, err := getFirefoxItemAbsPath(f.browserInfo.profilePath, f.items)
if err != nil {
if strings.Contains(err.Error(), "profile path is not exist") {
fmt.Println(err)
return nil, nil
}
panic(err)
}
var firefoxList []*firefox
for name, value := range multiItemPaths {
firefoxList = append(firefoxList, &firefox{
browserInfo: &browserInfo{
name: name,
masterKey: nil,
},
items: items,
itemPaths: value,
})
}
return firefoxList, nil
}
func getFirefoxItemAbsPath(profilePath string, items []item.Item) (map[string]map[item.Item]string, error) {
var multiItemPaths = make(map[string]map[item.Item]string)
absProfilePath := path.Join(homeDir, filepath.Clean(profilePath))
// TODO: Handle read file error
if !isFileExist(absProfilePath) {
return nil, fmt.Errorf("%s profile path is not exist", absProfilePath)
}
err := filepath.Walk(absProfilePath, firefoxWalkFunc(items, multiItemPaths))
return multiItemPaths, err
}
func (f *firefox) CopyItemFileToLocal() error {
for item, sourcePath := range f.itemPaths {
var dstFilename = item.TempName()
locals, _ := filepath.Glob("*")
for _, v := range locals {
if v == dstFilename {
err := os.Remove(dstFilename)
// TODO: Should Continue all iteration error
if err != nil {
return err
}
}
}
// TODO: Handle read file name error
sourceFile, err := ioutil.ReadFile(sourcePath)
if err != nil {
fmt.Println(err.Error())
}
err = ioutil.WriteFile(dstFilename, sourceFile, 0777)
if err != nil {
return err
}
}
return nil
}
func firefoxWalkFunc(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() {
parentDir := getParentDir(path)
if _, exist := multiItemPaths[parentDir]; exist {
multiItemPaths[parentDir][v] = path
} else {
multiItemPaths[parentDir] = map[item.Item]string{v: path}
}
}
}
return err
}
}
func getParentDir(absPath string) string {
return filepath.Base(filepath.Dir(absPath))
}
func (f *firefox) GetMasterKey() ([]byte, error) {
return f.masterKey, nil
}
func (f *firefox) GetName() string {
return f.name
}
func (f *firefox) GetBrowsingData() []data.BrowsingData {
var browsingData []data.BrowsingData
for item := range f.itemPaths {
d := item.NewBrowsingData()
if d != nil {
browsingData = append(browsingData, d)
}
}
return browsingData
}
-47
View File
@@ -1,47 +0,0 @@
package item
// item's default filename
const (
FileChromiumKey = "Local State"
FileChromiumCredit = "Web Data"
FileChromiumPassword = "Login Data"
FileChromiumHistory = "History"
FileChromiumDownload = "History"
FileChromiumCookie = "Cookies"
FileChromiumBookmark = "Bookmarks"
FileChromiumLocalStorage = "chromiumLocalStorage"
FileYandexPassword = "Ya PassMan Data"
FileYandexCredit = "Ya Credit Cards"
FileFirefoxKey4 = "key4.db"
FileFirefoxCookie = "cookies.sqlite"
FileFirefoxPassword = "logins.json"
FileFirefoxData = "places.sqlite"
FileUnknownItem = "unknown item"
FileUnsupportedItem = "unsupported item"
)
// item's renamed filename
const (
TempChromiumKey = "TempChromiumKey"
TempChromiumCredit = "TempChromiumCredit"
TempChromiumPassword = "TempChromiumPassword"
TempChromiumHistory = "TempChromiumHistory"
TempChromiumDownload = "TempChromiumDownload"
TempChromiumCookie = "TempChromiumCookie"
TempChromiumBookmark = "TempChromiumBookmark"
TempChromiumLocalStorage = "TempChromiumLocalStorage"
TempYandexPassword = "TempYandexPassword"
TempYandexCredit = "TempYandexCredit"
TempFirefoxKey4 = "TempFirefoxKey4"
TempFirefoxCookie = "TempFirefoxCookie"
TempFirefoxPassword = "TempFirefoxPassword"
TempFirefoxDownload = "TempFirefoxDownload"
TempFirefoxHistory = "TempFirefoxHistory"
TempFirefoxBookmark = "TempFirefoxBookmark"
TempFirefoxData = "TempFirefoxData"
)
-165
View File
@@ -1,165 +0,0 @@
package item
import (
data2 "hack-browser-data/internal/browser/data"
)
type Item int
const (
ItemChromiumKey Item = iota
ItemChromiumPassword
ItemChromiumCookie
ItemChromiumBookmark
ItemChromiumHistory
ItemChromiumDownload
ItemChromiumCreditCard
ItemChromiumLocalStorage
ItemChromiumExtension
ItemYandexPassword
ItemYandexCreditCard
ItemFirefoxKey4
ItemFirefoxPassword
ItemFirefoxCookie
ItemFirefoxBookmark
ItemFirefoxHistory
ItemFirefoxDownload
ItemFirefoxCreditCard
ItemFirefoxLocalStorage
ItemFirefoxExtension
)
func (i Item) DefaultName() string {
switch i {
case ItemChromiumKey:
return ChromiumKey
case ItemChromiumPassword:
return ChromiumPassword
case ItemChromiumCookie:
return ChromiumCookie
case ItemChromiumBookmark:
return ChromiumBookmark
case ItemChromiumDownload:
return ChromiumDownload
case ItemChromiumLocalStorage:
return ChromiumLocalStorage
case ItemChromiumCreditCard:
return ChromiumCredit
case ItemChromiumExtension:
return UnknownItem
case ItemChromiumHistory:
return ChromiumHistory
case ItemYandexPassword:
return YandexPassword
case ItemYandexCreditCard:
return YandexCredit
case ItemFirefoxKey4:
return FirefoxKey4
case ItemFirefoxPassword:
return FirefoxPassword
case ItemFirefoxCookie:
return FirefoxCookie
case ItemFirefoxBookmark:
return FirefoxData
case ItemFirefoxDownload:
return FirefoxData
case ItemFirefoxLocalStorage:
return UnsupportedItem
case ItemFirefoxCreditCard:
return UnsupportedItem
case ItemFirefoxHistory:
return FirefoxData
case ItemFirefoxExtension:
return UnsupportedItem
default:
return UnknownItem
}
}
func (i Item) FileName() string {
switch i {
case chromiumKey:
return TempChromiumKey
case chromiumPassword:
return TempChromiumPassword
case chromiumCookie:
return ChromiumCookieFilename
case chromiumBookmark:
return ChromiumBookmarkFilename
case chromiumDownload:
return ChromiumDownloadFilename
case chromiumLocalStorage:
return ChromiumLocalStorageFilename
case chromiumCreditCard:
return TempChromiumCredit
case chromiumHistory:
return TempChromiumHistory
case chromiumExtension:
return UnsupportedItem
case yandexPassword:
return TempChromiumPassword
case yandexCreditCard:
return TempChromiumCredit
case firefoxKey4:
return FirefoxKey4Filename
case firefoxPassword:
return FirefoxPasswordFilename
case firefoxCookie:
return FirefoxCookieFilename
case firefoxBookmark:
return FirefoxBookmarkFilename
case firefoxDownload:
return FirefoxDownloadFilename
case firefoxLocalStorage:
return UnsupportedItem
case firefoxCreditCard:
return UnsupportedItem
case firefoxHistory:
return FirefoxHistoryFilename
case firefoxExtension:
return UnsupportedItem
default:
return UnknownItem
}
}
func (i Item) NewBrowsingData() data2.BrowsingData {
switch i {
case chromiumKey:
return nil
case chromiumPassword:
return &data2.ChromiumPassword{}
case chromiumCookie:
return &data2.ChromiumCookie{}
case chromiumBookmark:
return &data2.ChromiumBookmark{}
case chromiumDownload:
return &data2.ChromiumDownload{}
case chromiumLocalStorage:
return nil
case chromiumCreditCard:
return &data2.ChromiumCreditCard{}
case chromiumExtension:
return nil
case chromiumHistory:
return &data2.ChromiumHistory{}
case yandexPassword:
return &data2.ChromiumPassword{}
case yandexCreditCard:
return &data2.ChromiumCreditCard{}
case firefoxPassword:
return &data2.FirefoxPassword{}
case firefoxCookie:
return &data2.FirefoxCookie{}
case firefoxBookmark:
return &data2.FirefoxBookmark{}
case firefoxDownload:
return &data2.FirefoxDownload{}
case firefoxHistory:
return &data2.FirefoxHistory{}
default:
return nil
}
}
-1
View File
@@ -1 +0,0 @@
package item