-
Notifications
You must be signed in to change notification settings - Fork 0
/
checksum_tool.py
445 lines (382 loc) · 58.9 KB
/
checksum_tool.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
import sys
import hashlib
import base64
import json
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QLabel, QLineEdit, QPushButton, QFileDialog, QCheckBox, QMessageBox, QProgressBar, QTabWidget, QVBoxLayout, QHBoxLayout, QTableWidget,
QTableWidgetItem, QHeaderView, QSpacerItem, QSizePolicy, QDesktopWidget)
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import Qt
from io import BytesIO
from PIL import Image
import os
# Base64 encoded icon (example, replace with your actual base64 data)
icon_base64 = """
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
"""
def get_icon_from_base64(icon_base64):
image_data = base64.b64decode(icon_base64)
image = Image.open(BytesIO(image_data))
bytes_io = BytesIO()
image.save(bytes_io, format='PNG')
qpixmap = QPixmap()
qpixmap.loadFromData(bytes_io.getvalue())
return QIcon(qpixmap)
def calculate_checksum(file_path, algorithm='md5'):
hash_func = getattr(hashlib, algorithm)()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b''):
hash_func.update(chunk)
return hash_func.hexdigest()
class ChecksumApp(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
self.files_data = []
def init_ui(self):
self.setWindowTitle("MD5 & SHA Checksum Tool v2.1")
self.setWindowIcon(get_icon_from_base64(icon_base64))
self.resize(1000, 500) # Set the size of the window (width: 800, height: 600)
self.center_window() # Center the window on the screen
def center_window(self):
"""
Centers the application window on the screen.
"""
frame_geometry = self.frameGeometry() # Get the window's geometry
screen_center = QDesktopWidget().availableGeometry().center() # Get the center point of the screen
frame_geometry.moveCenter(screen_center) # Move the window's center to the screen's center
self.move(frame_geometry.topLeft()) # Reposition the window's top-left corner
# Modern dark theme
self.setStyleSheet("""
QWidget {
background-color: #2b2b2b;
color: #ffffff;
font-size: 10pt;
}
QTabWidget::pane {
border: 1px solid #444;
background: #2b2b2b;
}
QTabBar::tab {
background: #1e1e1e;
color: #ffffff;
padding: 8px 20px;
border: 1px solid #444;
margin-right: 2px;
}
QTabBar::tab:selected {
background: #183ac5;
border-bottom: none;
}
QLabel {
color: #ffffff;
}
QLineEdit {
padding: 5px;
background-color: #3b3b3b;
border: 1px solid #666;
border-radius: 3px;
color: #ffffff;
}
QPushButton {
background-color: #183ac5;
color: white;
border: none;
padding: 8px 15px;
border-radius: 3px;
}
QPushButton:hover {
background-color: #1c45eb;
}
QPushButton:pressed {
background-color: #0e2378;
}
QCheckBox {
spacing: 8px;
}
QCheckBox::indicator {
width: 18px;
height: 18px;
}
QProgressBar {
border: 1px solid #444;
border-radius: 3px;
text-align: center;
}
QProgressBar::chunk {
background-color: #0078d7;
}
QTableWidget {
background-color: #2b2b2b;
gridline-color: #444;
border: 1px solid #444;
}
QTableWidget::item {
padding: 5px;
}
QHeaderView::section {
background-color: #1e1e1e;
padding: 5px;
border: 1px solid #444;
}
""")
# Main layout
main_layout = QVBoxLayout()
# Create tab widget
tab_widget = QTabWidget()
# Single File Tab
single_file_tab = QWidget()
single_file_layout = QVBoxLayout()
# File selection area
file_layout = QHBoxLayout()
file_label = QLabel("File:")
self.file_entry = QLineEdit()
self.browse_button = QPushButton("Browse")
self.browse_button.clicked.connect(self.open_file)
file_layout.addWidget(file_label)
file_layout.addWidget(self.file_entry)
file_layout.addWidget(self.browse_button)
single_file_layout.addLayout(file_layout)
# Checksum options and results
for hash_type in [('MD5', 'md5'), ('SHA-1', 'sha1'),
('SHA-256', 'sha256'), ('SHA-512', 'sha512')]:
hash_layout = QHBoxLayout()
checkbox = QCheckBox(hash_type[0])
checkbox.setChecked(True)
setattr(self, f"{hash_type[1]}_var", checkbox)
result_field = QLineEdit()
result_field.setReadOnly(True)
setattr(self, f"{hash_type[1]}_result", result_field)
copy_button = QPushButton(f"Copy {hash_type[0]}")
copy_button.clicked.connect(
lambda x, field=result_field: self.copy_to_clipboard(field.text())
)
hash_layout.addWidget(checkbox)
hash_layout.addWidget(result_field)
hash_layout.addWidget(copy_button)
single_file_layout.addLayout(hash_layout)
# Verify hash section
verify_layout = QVBoxLayout()
verify_label = QLabel("Verify Hash:")
self.expected_hash_entry = QLineEdit()
self.expected_hash_entry.setPlaceholderText("Paste hash to verify")
self.verify_button = QPushButton("Verify")
self.verify_button.clicked.connect(self.verify_hash)
verify_layout.addWidget(verify_label)
verify_layout.addWidget(self.expected_hash_entry)
verify_layout.addWidget(self.verify_button)
single_file_layout.addLayout(verify_layout)
# Save report button
self.save_button = QPushButton("Save Report")
self.save_button.clicked.connect(self.save_report)
single_file_layout.addWidget(self.save_button)
single_file_tab.setLayout(single_file_layout)
# Folder Tab
folder_tab = QWidget()
folder_layout = QVBoxLayout()
# Folder selection
folder_header = QHBoxLayout()
folder_label = QLabel("Folder:")
self.folder_entry = QLineEdit()
self.browse_folder_button = QPushButton("Browse Folder")
self.browse_folder_button.clicked.connect(self.open_folder)
folder_header.addWidget(folder_label)
folder_header.addWidget(self.folder_entry)
folder_header.addWidget(self.browse_folder_button)
folder_layout.addLayout(folder_header)
# Options
options_layout = QHBoxLayout()
self.include_subfolders = QCheckBox("Include Subfolders")
self.include_subfolders.setChecked(True)
self.include_hidden = QCheckBox("Include Hidden Files")
options_layout.addWidget(self.include_subfolders)
options_layout.addWidget(self.include_hidden)
options_layout.addStretch()
folder_layout.addLayout(options_layout)
# Results table
self.results_table = QTableWidget()
self.results_table.setColumnCount(6)
self.results_table.setHorizontalHeaderLabels(
['File Name', 'Path', 'MD5', 'SHA-1', 'SHA-256', 'SHA-512']
)
self.results_table.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
folder_layout.addWidget(self.results_table)
# Save folder results button
self.save_folder_results = QPushButton("Save Folder Results")
self.save_folder_results.clicked.connect(self.save_folder_report)
folder_layout.addWidget(self.save_folder_results)
folder_tab.setLayout(folder_layout)
# Add tabs to widget
tab_widget.addTab(single_file_tab, "Single File")
tab_widget.addTab(folder_tab, "Folder Scan")
# Progress bar
self.progress_bar = QProgressBar()
self.progress_bar.setVisible(False)
# Add everything to main layout
main_layout.addWidget(tab_widget)
main_layout.addWidget(self.progress_bar)
self.setLayout(main_layout)
# Enable drag and drop
self.setAcceptDrops(True)
# Function to open file dialog and calculate checksums
def open_file(self):
file_path, _ = QFileDialog.getOpenFileName(self, 'Open File')
if file_path:
self.file_entry.setText(file_path)
self.display_checksums(file_path)
# Function to display checksums
def display_checksums(self, file_path):
self.progress_bar.setVisible(True)
self.progress_bar.setValue(0)
try:
if self.md5_var.isChecked():
md5_checksum = calculate_checksum(file_path, 'md5')
self.md5_result.setText(md5_checksum)
if self.sha1_var.isChecked():
sha1_checksum = calculate_checksum(file_path, 'sha1')
self.sha1_result.setText(sha1_checksum)
if self.sha256_var.isChecked():
sha256_checksum = calculate_checksum(file_path, 'sha256')
self.sha256_result.setText(sha256_checksum)
if self.sha512_var.isChecked():
sha512_checksum = calculate_checksum(file_path, 'sha512')
self.sha512_result.setText(sha512_checksum)
self.progress_bar.setValue(100)
except Exception as e:
QMessageBox.critical(self, "Error", f"An error occurred: {e}")
finally:
self.progress_bar.setVisible(False)
# Function to copy checksum to clipboard
def copy_to_clipboard(self, checksum):
clipboard = QApplication.clipboard()
clipboard.setText(checksum)
QMessageBox.information(self, "Copied", "Checksum copied to clipboard!")
# Function to save report to a file
def save_report(self):
report_data = {
"File": self.file_entry.text(),
"MD5": self.md5_result.text(),
"SHA1": self.sha1_result.text(),
"SHA256": self.sha256_result.text(),
"SHA512": self.sha512_result.text()
}
file_path, _ = QFileDialog.getSaveFileName(self, 'Save Report', '', 'Text files (*.txt);;JSON files (*.json)')
if file_path:
if file_path.endswith('.json'):
with open(file_path, 'w') as f:
json.dump(report_data, f, indent=4)
else:
with open(file_path, 'w') as f:
for key, value in report_data.items():
f.write(f"{key}: {value}\n")
QMessageBox.information(self, "Saved", "Report saved to file!")
# Function to verify the hash
def verify_hash(self):
expected_hash = self.expected_hash_entry.text().strip()
if not expected_hash:
QMessageBox.warning(self, "Warning", "Please enter an expected hash.")
return
computed_hashes = {
"MD5": self.md5_result.text(),
"SHA1": self.sha1_result.text(),
"SHA256": self.sha256_result.text(),
"SHA512": self.sha512_result.text()
}
if expected_hash in computed_hashes.values():
QMessageBox.information(self, "Success", "The input hash matches one of the computed hashes.")
else:
QMessageBox.critical(self, "Mismatch", "The input hash does not match any computed hash.")
# Enable drag and drop functionality
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
def dropEvent(self, event):
urls = event.mimeData().urls()
if urls:
file_path = urls[0].toLocalFile()
self.file_entry.setText(file_path)
self.display_checksums(file_path)
def open_folder(self):
folder_path = QFileDialog.getExistingDirectory(self, 'Select Folder')
if folder_path:
self.folder_entry.setText(folder_path)
self.scan_folder(folder_path)
def scan_folder(self, folder_path):
self.files_data = []
self.progress_bar.setVisible(True)
self.results_table.setRowCount(0)
files_to_scan = []
for root, dirs, files in os.walk(folder_path):
if not self.include_subfolders.isChecked() and root != folder_path:
continue
for file in files:
if not self.include_hidden.isChecked() and file.startswith('.'):
continue
full_path = os.path.join(root, file)
files_to_scan.append(full_path)
total_files = len(files_to_scan)
for i, file_path in enumerate(files_to_scan):
try:
relative_path = os.path.relpath(file_path, folder_path)
file_data = {
'name': os.path.basename(file_path),
'path': relative_path,
'md5': calculate_checksum(file_path, 'md5') if self.md5_var.isChecked() else '',
'sha1': calculate_checksum(file_path, 'sha1') if self.sha1_var.isChecked() else '',
'sha256': calculate_checksum(file_path, 'sha256') if self.sha256_var.isChecked() else '',
'sha512': calculate_checksum(file_path, 'sha512') if self.sha512_var.isChecked() else ''
}
self.files_data.append(file_data)
# Add to table
row = self.results_table.rowCount()
self.results_table.insertRow(row)
self.results_table.setItem(row, 0, QTableWidgetItem(file_data['name']))
self.results_table.setItem(row, 1, QTableWidgetItem(file_data['path']))
self.results_table.setItem(row, 2, QTableWidgetItem(file_data['md5']))
self.results_table.setItem(row, 3, QTableWidgetItem(file_data['sha1']))
self.results_table.setItem(row, 4, QTableWidgetItem(file_data['sha256']))
self.results_table.setItem(row, 5, QTableWidgetItem(file_data['sha512']))
progress = int((i + 1) / total_files * 100)
self.progress_bar.setValue(progress)
QApplication.processEvents()
except Exception as e:
print(f"Error processing {file_path}: {e}")
self.progress_bar.setVisible(False)
def save_folder_report(self):
if not self.files_data:
QMessageBox.warning(self, "Warning", "No files have been scanned yet.")
return
file_path, _ = QFileDialog.getSaveFileName(
self, 'Save Folder Report', '',
'CSV files (*.csv);;JSON files (*.json);;Text files (*.txt)'
)
if not file_path:
return
try:
if file_path.endswith('.json'):
with open(file_path, 'w') as f:
json.dump(self.files_data, f, indent=4)
elif file_path.endswith('.csv'):
import csv
with open(file_path, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=['name', 'path', 'md5', 'sha1', 'sha256', 'sha512'])
writer.writeheader()
writer.writerows(self.files_data)
else: # .txt
with open(file_path, 'w') as f:
for data in self.files_data:
f.write(f"File: {data['name']}\n")
f.write(f"Path: {data['path']}\n")
if data['md5']: f.write(f"MD5: {data['md5']}\n")
if data['sha1']: f.write(f"SHA1: {data['sha1']}\n")
if data['sha256']: f.write(f"SHA256: {data['sha256']}\n")
if data['sha512']: f.write(f"SHA512: {data['sha512']}\n")
f.write("\n")
QMessageBox.information(self, "Success", "Folder report saved successfully!")
except Exception as e:
QMessageBox.critical(self, "Error", f"Failed to save report: {e}")
# Run the application
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ChecksumApp()
window.show()
sys.exit(app.exec_())