package cmd
import (
"fmt"
"os"
"strings"
"github.com/urfave/cli/v2"
"hack-browser-data/internal/browser"
"hack-browser-data/internal/log"
"hack-browser-data/internal/outputter"
)
var (
browserName string
exportDir string
outputFormat string
verbose bool
compress bool
customProfilePath string
)
func Execute ( ) {
app := & cli . App {
Name : "hack-browser-browingdata" ,
Usage : "Export passwords/cookies/history/bookmarks from browser" ,
UsageText : "[hack-browser-browingdata -b chrome -f json -dir results -cc]\n Get all browingdata(password/cookie/history/bookmark) from chrome" ,
Version : "0.4.0" ,
Flags : [ ] cli . Flag {
& cli . BoolFlag { Name : "verbose" , Aliases : [ ] string { "vv" } , Destination : & verbose , Value : false , Usage : "verbose" } ,
& cli . BoolFlag { Name : "compress" , Aliases : [ ] string { "cc" } , 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 : "results-dir" , Aliases : [ ] string { "dir" } , Destination : & exportDir , Value : "results" , Usage : "export dir" } ,
& cli . StringFlag { Name : "format" , Aliases : [ ] string { "f" } , Destination : & outputFormat , Value : "csv" , Usage : "format, csv|json|console" } ,
& cli . StringFlag { Name : "profile-dir-path" , Aliases : [ ] string { "p" } , Destination : & customProfilePath , Value : "" , Usage : "custom profile dir path, get with chrome://version" } ,
} ,
HideHelpCommand : true ,
Action : func ( ctx * cli . Context ) error {
var (
browsers [ ] browser . Browser
err error
)
if verbose {
log . InitLog ( "debug" )
} else {
log . InitLog ( "error" )
}
browsers = browser . PickBrowser ( browserName )
output := outputter . NewOutPutter ( outputFormat )
if err := output . MakeDir ( exportDir ) ; err != nil {
panic ( err )
}
for _ , b := range browsers {
fmt . Printf ( "%+v\n" , b )
if err := b . CopyItemFileToLocal ( ) ; err != nil {
panic ( err )
}
masterKey , err := b . GetMasterKey ( )
if err != nil {
fmt . Println ( err )
}
browserName := b . GetName ( )
multiData := b . GetBrowsingData ( )
for _ , data := range multiData {
if err := data . Parse ( masterKey ) ; err != nil {
fmt . Println ( err )
}
filename := fmt . Sprintf ( "%s_%s.%s" , browserName , data . Name ( ) , outputFormat )
file , err := output . CreateFile ( exportDir , filename )
if err != nil {
panic ( err )
}
if err := output . Write ( data , file ) ; err != nil {
panic ( err )
}
}
}
return err
} ,
}
err := app . Run ( os . Args )
if err != nil {
log . Error ( err )
}
}
// func Execute() {
// app := &cli.App{
// Name: "hack-browser-browingdata",
// Usage: "Export passwords/cookies/history/bookmarks from browser",
// UsageText: "[hack-browser-browingdata -b chrome -f json -dir results -cc]\n Get all browingdata(password/cookie/history/bookmark) from chrome",
// Version: "0.3.7",
// Flags: []cli.Flag{
// &cli.BoolFlag{Name: "verbose", Aliases: []string{"vv"}, Destination: &verbose, Value: false, Usage: "verbose"},
// &cli.BoolFlag{Name: "compress", Aliases: []string{"cc"}, 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(core.ListBrowser(), "|")},
// &cli.StringFlag{Name: "results-dir", Aliases: []string{"dir"}, Destination: &exportDir, Value: "results", Usage: "export dir"},
// &cli.StringFlag{Name: "format", Aliases: []string{"f"}, Destination: &outputFormat, Value: "csv", Usage: "format, csv|json|console"},
// &cli.StringFlag{Name: "profile-dir-path", Aliases: []string{"p"}, Destination: &customProfilePath, Value: "", Usage: "custom profile dir path, get with chrome://version"},
// },
// HideHelpCommand: true,
// Action: func(c *cli.Context) error {
// var (
// browsers []core.Browser
// err error
// )
// if verbose {
// log.InitLog("debug")
// } else {
// log.InitLog("error")
// }
// if customProfilePath != "" {
// browsers, err = core.PickCustomBrowser(browserName, customProfilePath, customKeyPath)
// if err != nil {
// log.Error(err)
// }
// } else {
// // default select all browsers
// browsers, err = core.PickBrowser(browserName)
// if err != nil {
// log.Error(err)
// }
// }
// err = utils.MakeDir(exportDir)
// if err != nil {
// log.Error(err)
// }
// for _, browser := range browsers {
// err := browser.InitSecretKey()
// if err != nil {
// log.Error(err)
// }
// // default select all items
// // you can get single item with browser.GetItem(itemName)
// items, err := browser.GetAllItems()
// if err != nil {
// log.Error(err)
// }
// name := browser.GetName()
// key := browser.GetSecretKey()
// for _, item := range items {
// err := item.CopyDB()
// if err != nil {
// log.Error(err)
// }
// switch browser.(type) {
// case *core.Chromium:
// err := item.ChromeParse(key)
// if err != nil {
// log.Error(err)
// }
// case *core.Firefox:
// err := item.FirefoxParse()
// if err != nil {
// log.Error(err)
// }
// }
// err = item.Release()
// if err != nil {
// log.Error(err)
// }
// err = item.OutPut(outputFormat, name, exportDir)
// if err != nil {
// log.Error(err)
// }
// }
// }
// if compress {
// err = utils.Compress(exportDir)
// if err != nil {
// log.Error(err)
// }
// }
// return nil
// },
// }
// err := app.Run(os.Args)
// if err != nil {
// log.Error(err)
// }
// }