From 406eb8c1663de1e4466e5f627f61166933891f6e Mon Sep 17 00:00:00 2001 From: vadzik Date: Tue, 27 Feb 2024 14:33:54 +0300 Subject: [PATCH] [ADD\FIX] Added new windows and fixes slow work of wiper --- app/__init__.py | 46 +++++++++++++++++++++++++++++++++++++-------- app/utils_drive.py | 47 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 74 insertions(+), 19 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index d6d070b..84f94f2 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -2,6 +2,7 @@ import platform from tkinter import ttk from customtkinter import * from CTkMenuBar import * +from CTkMessagebox import * from typing import List from app.utils_drive import * @@ -23,8 +24,8 @@ class App: self.root = CTk() self.root.title("Disk Eraser") - self.root.geometry("700x300") - self.root.minsize(700, 300) + self.root.geometry("800x300") + self.root.minsize(800, 300) self.__load_menus() self.__init_table() self.__update_drives() @@ -38,9 +39,9 @@ class App: help_menu = main_menu.add_cascade("Справка") dropdown1 = CustomDropdownMenu(widget=help_menu) - dropdown1.add_option(option="Содержание") + dropdown1.add_option(option="Помощь") dropdown1.add_separator() - dropdown1.add_option(option="О программе") + dropdown1.add_option(option="О программе", command=self.__open_about_window) self.root.config(menu=main_menu) @@ -68,6 +69,7 @@ class App: for drive in self.drives: self.drive_tree.insert("", END, values=( drive.index, drive.name, drive.disk_type, self.__human_size(drive.capacity), drive.serial_num)) + self.selected = None def __load_drives(self): @@ -138,23 +140,38 @@ class App: self.selected = item["values"] def __erase_drive(self): - if self.selected is not None: + method = self.method_box.get() + if self.selected is None: + self.__show_warning("Выберете носитель информации для стирания!") + elif method == "": + self.__show_warning("Выберете метод стирания данных!") + elif self.__ask_question(): self.erase_button.configure(state='disabled') + self.drive_tree.configure(selectmode="none") + thread = None - self.progressbar = CTkProgressBar(master=self.bottom_frame, orientation="horizontal", width=250) + self.progressbar = CTkProgressBar(master=self.bottom_frame, orientation="horizontal", width=200) self.progressbar.pack(side=LEFT, padx=6, pady=6) + self.progress_label = CTkLabel(self.bottom_frame, text="0 %") + self.progress_label.pack(side=LEFT, padx=5, pady=5) + for drive in self.drives: if drive.index == self.selected[0]: - thread = drive.erase(self.method_box.get(), progress=self.progressbar) + thread = drive.erase(self.method_box.get(), progressbar=self.progressbar, progress_label=self.progress_label) self.__check_thread(thread) def __check_thread(self, thread): if thread.is_alive(): self.root.after(1000, lambda: self.__check_thread(thread)) else: + self.progress_label.pack_forget() self.progressbar.pack_forget() + self.drive_tree.configure(selectmode="browse") self.erase_button.configure(state='active') + CTkMessagebox(title="Успешно", message=f"{self.selected[1]} стёрт!") + def __show_warning(self, text): + CTkMessagebox(title="Ошибка", message=text) def __sort(self, col, reverse): # получаем все значения столбцов в виде отдельного списка @@ -165,4 +182,17 @@ class App: for index, (_, k) in enumerate(l): self.drive_tree.move(k, "", index) # в следующий раз выполняем сортировку в обратном порядке - self.drive_tree.heading(col, command=lambda: self.__sort(col, not reverse)) \ No newline at end of file + self.drive_tree.heading(col, command=lambda: self.__sort(col, not reverse)) + + def __ask_question(self): + msg = CTkMessagebox(title="Стереть", message=f"Вы уверены, что хотите стереть {self.selected[1]}?", + icon="question", option_1="Отмена", option_2="Нет", option_3="Да") + response = msg.get() + + if response == "Да": + return True + else: + return False + + def __open_about_window(self): + CTkMessagebox(title="О программе", message="Программа для гарантированного стирания машинных носителей информации\n(c) Romanko M.I., Russia, 2024") \ No newline at end of file diff --git a/app/utils_drive.py b/app/utils_drive.py index fc739a5..dc7d822 100644 --- a/app/utils_drive.py +++ b/app/utils_drive.py @@ -1,4 +1,8 @@ -from threading import * +import threading +import os + +from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes +from cryptography.hazmat.backends import default_backend erasing_methods = { "2 прохода": { @@ -10,7 +14,7 @@ erasing_methods = { "data": ["random"] }, "Гутмана": { - "num_passes": 35, + "num_passes": 0, "data": [] }, "3 прохода": { @@ -23,6 +27,14 @@ erasing_methods = { } } +def get_random_bytes(size): + seed=os.urandom(32) + backend = default_backend() + cipher = Cipher(algorithms.AES(seed), modes.CTR(b'\0'*16), backend=backend) + encryptor = cipher.encryptor() + + nulls=b'\0'*(size) + return encryptor.update(nulls) class Drive(): @@ -52,16 +64,29 @@ class Drive(): self.serial_num = dev_id self.index = index - def erase(self, method, progress=0) -> Thread: - t = Thread(target=self.__erasing, args=(progress,)) + def erase(self, method, progressbar, progress_label) -> threading.Thread: + t = threading.Thread(target=self.__erasing, args=(method, progressbar,progress_label)) t.start() return t - def __erasing(self, progress): - len_write = 0 - write_size = self.block_size*256 + def __erasing(self, method, progressbar, progress_label): + write_size = self.block_size*32 with open(self.path, "wb") as drive: - while len_write < self.capacity: - # drive.write(b"\x00"*self.block_size) - len_write += write_size - progress.set(len_write/self.capacity) + for i in range(erasing_methods[method]["num_passes"]): + drive.seek(0) + prev_percent = 0 + len_write = 0 + progressbar.set(prev_percent) + print(i) + while len_write < self.capacity: + if erasing_methods[method]["data"][i] == "random": + data = get_random_bytes(write_size) + else: + data = erasing_methods[method]["data"][i] * write_size + drive.write(data) + len_write += write_size + cur_percent = len_write/self.capacity + if cur_percent - prev_percent > 0.01: + progressbar.set(cur_percent) + progress_label.configure(text=f"{int(cur_percent*100)} %") + prev_percent = cur_percent