From 433e095dc7a9f6d1af9ee720f6eeee73c14f55c6 Mon Sep 17 00:00:00 2001 From: Evan Su <48808396+HACKERALERT@users.noreply.github.com> Date: Tue, 28 Sep 2021 20:34:52 -0400 Subject: [PATCH] Revert "Update Picocrypt.go" This reverts commit a4ebbb5da957b1fbad43c172aed93e4e29739b44. --- src/unstable/Picocrypt.go | 159 +++++++++++++++++++++++++++++++++++--- 1 file changed, 150 insertions(+), 9 deletions(-) diff --git a/src/unstable/Picocrypt.go b/src/unstable/Picocrypt.go index 75ad819..e68c38e 100644 --- a/src/unstable/Picocrypt.go +++ b/src/unstable/Picocrypt.go @@ -25,16 +25,20 @@ import ( "image/color" "image/png" "io" + "io/ioutil" "math" "math/big" "net/http" "os" + "os/exec" "path/filepath" "regexp" "runtime" "runtime/debug" "strconv" "strings" + "sync" + "syscall" "time" // Cryptography @@ -73,6 +77,9 @@ var icon []byte //go:embed font.ttf var font []byte +//go:embed sdelete64.exe +var sdelete64bytes []byte + //go:embed strings.json var localeBytes []byte @@ -100,6 +107,7 @@ var mode string var working bool var recombine bool var fill float32 = -0.0000001 +var sdelete64path string // Three variables store the input files var onlyFiles []string @@ -949,9 +957,7 @@ func onDrop(names []string) { return } if tab == 2 { - namesCopy := make([]string, len(names)) - copy(namesCopy, names) - go doShred(namesCopy, true) + go shred(names, true) return } @@ -1888,7 +1894,7 @@ func work() { if shredTemp { progressInfo = "" popupStatus = s("Shredding temporary files...") - doShred([]string{inputFile + ".pcv"}, false) + shred([]string{inputFile + ".pcv"}, false) } else { os.Remove(inputFile + ".pcv") } @@ -1905,7 +1911,7 @@ func work() { progressInfo = "" popupStatus = s("Shredding temporary files...") giu.Update() - doShred([]string{inputFile}, false) + shred([]string{inputFile}, false) } else { os.Remove(inputFile) } @@ -2074,7 +2080,7 @@ func generateChecksums(file string) { } // Recursively shred all file(s) and folder(s) passed in as 'names' -func doShred(names []string, separate bool) { +func shred(names []string, separate bool) { stopShredding = false shredTotal = 0 shredDone = 0 @@ -2100,7 +2106,133 @@ func doShred(names []string, separate bool) { for _, name := range names { shredding = name - shred(1, false, name, &shredding) + + // Linux and macOS need a command with similar syntax and usage, so they're combined + if runtime.GOOS == "linux" || runtime.GOOS == "darwin" { + stat, _ := os.Stat(name) + if stat.IsDir() { + var coming []string + + // Walk the folder recursively + filepath.Walk(name, func(path string, _ os.FileInfo, err error) error { + if err != nil { + return nil + } + if stopShredding { + return nil + } + stat, _ := os.Stat(path) + if !stat.IsDir() { + if len(coming) == 128 { + // Use a WaitGroup to parallelize shredding + var wg sync.WaitGroup + for i, j := range coming { + wg.Add(1) + go func(wg *sync.WaitGroup, id int, j string) { + defer wg.Done() + shredding = j + var cmd *exec.Cmd + if runtime.GOOS == "linux" { + cmd = exec.Command("shred", "-ufvz", "-n", strconv.Itoa(int(shredPasses)), j) + } else { + cmd = exec.Command("rm", "-rfP", j) + } + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Run() + shredDone++ + shredUpdate(separate) + giu.Update() + }(&wg, i, j) + } + wg.Wait() + coming = nil + } else { + coming = append(coming, path) + } + } + return nil + }) + for _, i := range coming { + if stopShredding { + break + } + go func(i string) { + shredding = i + var cmd *exec.Cmd + if runtime.GOOS == "linux" { + cmd = exec.Command("shred", "-ufvz", "-n", strconv.Itoa(int(shredPasses)), i) + } else { + cmd = exec.Command("rm", "-rfP", i) + } + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Run() + shredDone++ + shredUpdate(separate) + giu.Update() + }(i) + } + if !stopShredding { + os.RemoveAll(name) + } + } else { // The path is a file, not a directory, so just shred it + shredding = name + var cmd *exec.Cmd + if runtime.GOOS == "linux" { + cmd = exec.Command("shred", "-ufvz", "-n", strconv.Itoa(int(shredPasses)), name) + } else { + cmd = exec.Command("rm", "-rfP", name) + } + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Run() + shredDone++ + shredUpdate(separate) + } + } else if runtime.GOOS == "windows" { + stat, _ := os.Stat(name) + if stat.IsDir() { + // Walk the folder recursively + filepath.Walk(name, func(path string, _ os.FileInfo, err error) error { + if err != nil { + return nil + } + stat, _ := os.Stat(path) + if stat.IsDir() { + if stopShredding { + return nil + } + + t := 0 + files, _ := ioutil.ReadDir(path) + for _, f := range files { + if !f.IsDir() { + t++ + } + } + shredDone += float32(t) + shredUpdate(separate) + shredding = strings.ReplaceAll(path, "\\", "/") + "/*" + cmd := exec.Command(sdelete64path, "*", "-p", strconv.Itoa(int(shredPasses))) + cmd.Dir = path + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Run() + giu.Update() + } + return nil + }) + + if !stopShredding { + // sdelete64 doesn't delete the empty folder, so I'll do it manually + os.RemoveAll(name) + } + } else { + shredding = name + cmd := exec.Command(sdelete64path, name, "-p", strconv.Itoa(int(shredPasses))) + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Run() + shredDone++ + shredUpdate(separate) + } + } giu.Update() if stopShredding { return @@ -2289,8 +2421,14 @@ func main() { } } - cleanup := initializeShred() - defer cleanup() + // Create a temporary file to store sdelete64.exe + sdelete64, _ := os.CreateTemp("", "sdelete64.*.exe") + sdelete64path = sdelete64.Name() + sdelete64.Write(sdelete64bytes) + sdelete64.Close() + cmd := exec.Command(sdelete64path, "/accepteula") + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + cmd.Run() // Set a universal font giu.SetDefaultFontFromBytes(font, 18) @@ -2330,4 +2468,7 @@ func main() { // Start the UI window.Run(draw) + + // Window closed, clean up + os.Remove(sdelete64path) }