diff --git a/src/Picocrypt.py b/src/Picocrypt.py index 9c52d44..c557b5a 100644 --- a/src/Picocrypt.py +++ b/src/Picocrypt.py @@ -3,7 +3,7 @@ """ -Picocrypt v1.12 +Picocrypt v1.12.1 Copyright (c) Evan Su (https://evansu.cc) Released under a GNU GPL v3 License https://github.com/HACKERALERT/Picocrypt @@ -28,6 +28,7 @@ from os.path import basename,dirname,abspath,realpath from os.path import join as pathJoin,split as pathSplit from pathlib import Path from zipfile import ZipFile +from shutil import rmtree from tkinterdnd2 import TkinterDnD,DND_FILES from tkinter.filedialog import asksaveasfilename from ttkthemes import ThemedStyle @@ -523,6 +524,7 @@ startBtn["state"] = "disabled" def cancel(): global working working = False + dummy.focus() # Cancel button cancelBtn = tkinter.ttk.Button( @@ -571,7 +573,7 @@ creditsLabel["state"] = "disabled" # Version versionString = tkinter.StringVar(tk) -versionString.set("v1.12") +versionString.set("v1.12.1") version = tkinter.ttk.Label( tk, textvariable=versionString @@ -1143,10 +1145,14 @@ def work(): if shouldErase: if onlyFolders: for i in onlyFolders: + if not working: + break secureWipe(i) if onlyFiles: for i in range(len(onlyFiles)): - statusString.set(strings[12]+f" ({i}/{len(onlyFiles)}") + if not working: + break + statusString.set(strings[12]+f" ({i}/{len(onlyFiles)})") progress["value"] = i/len(onlyFiles) secureWipe(onlyFiles[i]) secureWipe(inputFile) @@ -1156,25 +1162,35 @@ def work(): # Remove temporary zip file if created if allFiles or onlyFiles: remove(inputFile) - - # Show appropriate notice if file corrupted or modified + + # Prevent Unicode nonsense on MacOS arrow = "" if platform.system()=="Darwin" else "🡪" - if not kept: - statusString.set(f"Completed. (Click here to show output {arrow})") - # Show Reed-Solomon stats if it fixed corrupted bytes - if mode=="decrypt" and reedsoloFixed: - tmp = "s" if reedsoloFixed!=1 else "" - statusString.set( - f"Completed with {reedsoloFixed} byte{tmp}"+ - f" fixed. (Click here to show output {arrow})" - ) - else: - if kept=="modified": - statusString.set(strings[7]) - elif kept=="corrupted": - statusString.set(strings[6]) + + # If user hit 'Cancel' during secure wiping... + if not working: + fin.close() + fout.close() + resetUI() + statusString.set(f"Secure wipe canceled, but encryption was successful. (Output {arrow})") + else: + # Show appropriate notice if file corrupted or modified + + if not kept: + statusString.set(f"Completed. (Click here to show output {arrow})") + # Show Reed-Solomon stats if it fixed corrupted bytes + if mode=="decrypt" and reedsoloFixed: + tmp = "s" if reedsoloFixed!=1 else "" + statusString.set( + f"Completed with {reedsoloFixed} byte{tmp}"+ + f" fixed. (Click here to show output {arrow})" + ) else: - statusString.set(strings[8]) + if kept=="modified": + statusString.set(strings[7]) + elif kept=="corrupted": + statusString.set(strings[6]) + else: + statusString.set(strings[8]) status.config(cursor="hand2") @@ -1262,8 +1278,9 @@ def updateStats(total): # Securely wipe file(s) via system internals def secureWipe(fin): + global working statusString.set(strings[12]) - + progress["value"] = 100 # Check platform, erase accordingly if platform.system()=="Windows": # Recursively delete folders @@ -1273,14 +1290,14 @@ def secureWipe(fin): if dirname(i) not in paths: paths.append(dirname(i)) for i in range(len(paths)): + if not working: + return statusString.set(strings[12]+f" ({i}/{len(paths)})") progress["value"] = 100*i/len(paths) - system(f'cd "{paths[i]}" && "{rootDir}/sdelete64.exe" * -p 4 -s -nobanner') + system(f'cd "{paths[i]}" && "{rootDir}/sdelete64.exe" * -p 4 -nobanner') system(f'cd "{rootDir}"') rmtree(fin) else: - statusString.set(strings[12]) - progress["value"] = 100 system(f'sdelete64.exe "{fin}" -p 4 -nobanner') # MacOS