Skip to content

Commit cefa7d7

Browse files
committed
Fixed various bugs, vulnerabilities...
1 parent 864fece commit cefa7d7

17 files changed

Lines changed: 1165 additions & 58 deletions

src/lufus/drives/formatting.py

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import re
2-
import shlex
32
import shutil
43
import subprocess
54
import sys
@@ -61,12 +60,14 @@ def unmount(drive: str = None) -> bool:
6160
log.info("Unmounting %s...", drive)
6261
for target in targets:
6362
try:
64-
subprocess.run(["umount", "-l", target])
63+
result = subprocess.run(["umount", "-l", target])
64+
# exit 32 = "not mounted" on Linux — acceptable when clearing a drive
65+
if result.returncode not in (0, 32):
66+
log.error("umount -l %s exited with code %d", target, result.returncode)
67+
unmount_fail()
68+
return False
6569
time.sleep(0.5)
6670
log.info("Unmounted %s successfully.", target)
67-
except subprocess.CalledProcessError:
68-
unmount_fail()
69-
return False
7071
except Exception as e:
7172
log.error("(UMNTFUNC) Unexpected error type: %s — %s", type(e).__name__, e)
7273
log_unexpected_error()
@@ -104,8 +105,6 @@ def remount(drive: str = None) -> bool:
104105
def volume_custom_label(target_partition: str = None) -> bool:
105106
newlabel = state.new_label
106107
# Sanitize label: allow only alphanumeric, spaces, hyphens, and underscores
107-
import re
108-
109108
newlabel = re.sub(r"[^a-zA-Z0-9 \-_]", "", newlabel).strip()
110109
if not newlabel:
111110
newlabel = "USB_DRIVE"
@@ -119,11 +118,8 @@ def volume_custom_label(target_partition: str = None) -> bool:
119118
log.error("No drive node found. Cannot relabel.")
120119
return False
121120

122-
# Sanitize label: strip characters that could be misinterpreted.
123-
# Since commands are passed as lists (shell=False), shell injection is not
124-
# possible, but we still quote each argument defensively.
125-
safe_drive = shlex.quote(drive)
126-
safe_label = shlex.quote(newlabel)
121+
# Commands are passed as lists (shell=False) so shell injection is not possible.
122+
# Label sanitization above ensures the string is safe for all labelling tools.
127123

128124
# 0 -> NTFS, 1 -> FAT32, 2 -> exFAT, 3 -> ext4, 4 -> UDF
129125
fs_type = state.filesystem_index
@@ -259,7 +255,7 @@ def check_device_bad_blocks() -> bool:
259255
bad_lines = [line for line in output.splitlines() if line.strip().isdigit()]
260256
if bad_lines:
261257
log.warning("%d bad block(s) found on %s!", len(bad_lines), drive)
262-
return True
258+
return False
263259
log.info("No bad blocks found on %s.", drive)
264260
return True
265261
except FileNotFoundError:

src/lufus/gui/gui.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ def _update_flashing_options(self):
903903

904904
def _open_url(self):
905905
# open github url in browser :D
906-
url = "http://www.github.com/hog185/lufus"
906+
url = "https://github.com/Hog185/Lufus"
907907
pkexec_uid = os.environ.get("PKEXEC_UID")
908908
if pkexec_uid and os.geteuid() == 0:
909909
# when running as root via pkexec open as original user :3
@@ -1673,12 +1673,20 @@ def get_latest_release(self):
16731673
req = urllib.request.urlopen(url, timeout=5)
16741674
if req.status == 200:
16751675
data = json.loads(req.read().decode())
1676-
if version.parse(data["tag_name"]) > version.parse(current_version):
1677-
self.log_message(f"New version found: {data['tag_name']} > {current_version}", level="DEBUG")
1678-
pass
1676+
tag_name = data.get("tag_name", "")
1677+
if not tag_name:
1678+
self.log_message("Update check: missing tag_name in API response", level="WARNING")
1679+
return
1680+
try:
1681+
is_newer = version.parse(tag_name) > version.parse(current_version)
1682+
except Exception:
1683+
self.log_message(f"Update check: could not parse version tag {tag_name!r}", level="WARNING")
1684+
return
1685+
if is_newer:
1686+
self.log_message(f"New version found: {tag_name} > {current_version}", level="DEBUG")
16791687
else:
16801688
self.log_message(
1681-
f"Running latest release build: {data['tag_name']} <= {current_version}", level="INFO"
1689+
f"Running latest release build: {tag_name} <= {current_version}", level="INFO"
16821690
)
16831691
return
16841692
else:
@@ -1689,8 +1697,8 @@ def get_latest_release(self):
16891697
return
16901698
newupdate = QMessageBox(self)
16911699
newupdate.setWindowTitle("New Update Available!")
1692-
newupdate.setText(f"A new version ({data['tag_name']}) is available!")
1693-
newupdate.setInformativeText(f"Would you like to download {data['name']} now?")
1700+
newupdate.setText(f"A new version ({data.get('tag_name', '?')}) is available!")
1701+
newupdate.setInformativeText(f"Would you like to download {data.get('name', 'it')} now?")
16941702
download_btn = newupdate.addButton(QMessageBox.StandardButton.Apply)
16951703
download_btn.setText("Download Now")
16961704
later_btn = newupdate.addButton(QMessageBox.StandardButton.Discard)
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
key,value
2+
window_title,lufus
3+
log_window_title,lufus Логи
4+
about_window_title,О программе
5+
settings_window_title,Настройки
6+
btn_copy_log,Скопировать логи в буфер обмена
7+
btn_save_log,Сохранить логи…
8+
dlg_save_log_title,Сохранить логи
9+
save_failed_title,Не удалось сохранить
10+
save_failed_body,Не удалось сохранить логи:
11+
settings_label_language,Язык
12+
settings_no_languages,Языки не найдены
13+
header_drive_properties,Свойства диска
14+
header_format_options,Свойства форматирования
15+
header_status,Статус
16+
lbl_device,Устройство
17+
lbl_boot_selection,Загрузочный сектор
18+
lbl_image_option,Свойства образа
19+
lbl_partition_scheme,Схема разбиения на разделы
20+
lbl_target_system,Целевая система
21+
lbl_volume_label,Название тома
22+
lbl_file_system,Файловая система
23+
lbl_flash_option,Опции записи
24+
lbl_cluster_size,Размер кластера
25+
combo_image_windows,Стандартная установка Windows
26+
combo_image_linux,Стандартная установка Linux
27+
combo_image_other,Любая установка (режим DD)
28+
combo_image_format,Режим "Только форматирование"
29+
combo_partition_gpt,GPT
30+
combo_partition_mbr,MBR
31+
combo_target_uefi,UEFI (без CSM)
32+
combo_target_bios,BIOS (или UEFI-CSM)
33+
combo_cluster_4096,4096 байта (по умолчанию)
34+
combo_cluster_8192,8192 байта
35+
combo_badblocks_1pass,1 проход
36+
chk_quick_format,Быстрое форматирование
37+
chk_extended_label,Создание расширенных файлов меток и значков
38+
chk_bad_blocks,Проверка устройства на плохие блоки
39+
chk_verify_hash,Проверить контрольную сумму SHA256
40+
lbl_expected_hash,Ожидаемый SHA256:
41+
progress_verifying,Проверка контрольной суммы...
42+
msgbox_verify_fail_title,Проверка не удалась
43+
msgbox_verify_fail_body,Контрольная сумма SHA256 не совпадает! Файл может быть повреждён.
44+
msgbox_invalid_hash_title,Неверный хеш
45+
msgbox_invalid_hash_body,Указанный хеш SHA256 недействителен.
46+
combo_flash_iso,Режим ISO
47+
combo_flash_woe,Woe USB
48+
combo_flash_ventoy,Ventoy
49+
combo_flash_dd,DD
50+
combo_flash_none,Нет
51+
btn_select,ВЫБРАТЬ
52+
btn_start,НАЧАТЬ
53+
btn_cancel,ОТМЕНИТЬ
54+
tooltip_refresh,Обновить список устройств (Ctrl+R)
55+
tooltip_download,Скачать обновление
56+
tooltip_about,О программе
57+
tooltip_settings,Настройки
58+
tooltip_log,Логи
59+
status_ready,Готово
60+
status_scanning,Проверка на наличие USB устройств…
61+
status_scan_failed,Сканирование провалено
62+
status_flashing,Запись…
63+
progress_preparing,Подготовка…
64+
progress_complete,Успешно! 100%
65+
progress_failed,Провалено
66+
progress_starting,Начало.. 10%
67+
progress_unmounted,Размонтировка устройства.. 20%
68+
progress_formatted,Форматирование устройства.. 60%
69+
progress_label_changed,Изменение лейбла.. 80%
70+
progress_mount_done,Монтирование завершено.. Завершено! 100%
71+
msgbox_cancel_title,ОТМЕНИТЬ
72+
msgbox_cancel_body,Вы уверены, что хотите отменить процесс?
73+
msgbox_success_title,Успешно
74+
msgbox_success_body,Успешно записаны данные на USB устройство!
75+
msgbox_error_title,Ошибка
76+
msgbox_error_body,Не удалось записать данные на USB устройство.
77+
msgbox_no_image_title,Без образа
78+
msgbox_no_image_body,Пожалуйста, выберите сначала правильный установочный носитель.
79+
msgbox_no_device_title,Нет устройств
80+
msgbox_no_device_body,Пожалуйста, выберите сначала USB устройство.
81+
msgbox_usb_found_title,Обнаружено новое USB устройство
82+
msgbox_usb_found_body,USB устройство найдено
83+
msgbox_no_devices_title,Нет устройств
84+
msgbox_no_devices_body,"USB устройства не были обнаружены.
85+
Пожалуйста, подключите устройство."
86+
msgbox_scan_error_title,Ошибка сканирования
87+
msgbox_scan_error_body,Ошибка в ходе сканирования USB устройств:
88+
no_usb_found,USB устройства не обнаружены.
89+
dlg_select_image_title,Выберите образ для записи
90+
dlg_select_image_filter,"Образы дисков (*.iso *.dmg *.img *.bin *.raw);;Все файлы (*)"
91+
about_content,"Lufus - это программа для записи образов дисков, написанная на языке Python для Linux.
92+
Вдохновлено оригинальным инструментом Rufus для Windows.
93+
Версия: v1.0.0b1
94+
GitHub: github.com/hog185/lufus"
95+
about_subtitle,Инструмент для записи USB
96+
btn_close,Закрыть
97+
btn_ok,OK
98+
combo_boot_default,installation_media.iso
99+
tooltip_website,Сайт
100+
settings_label_theme,Тема
101+
input_hash_placeholder,Введите ожидаемый хеш SHA256 здесь...
102+
combo_badblocks_2pass,2 прохода
103+
combo_badblocks_3pass,3 прохода
104+
status_unmounting_all,Размонтирование всех разделов на {device}...
105+
status_unmounting,Размонтирование {part}...
106+
status_format_starting,Запуск операции форматирования...
107+
status_format_in_progress,Форматирование устройства...
108+
status_format_complete,Форматирование завершено!
109+
status_format_failed,Форматирование ПРОВАЛЕНО. Проверьте журнал выше для получения точной ошибки.
110+
status_flash_error,Ошибка записи: {error}
111+
acc_device,Выбор устройства
112+
acc_device_desc,Выберите USB-устройство, которое хотите использовать
113+
acc_refresh,Обновить устройства
114+
acc_refresh_desc,Сканировать подключённые USB-устройства
115+
acc_boot,Выбор загрузочного образа
116+
acc_boot_desc,Показывает текущий выбранный файл образа
117+
acc_select,Обзор файла образа
118+
acc_image_option,Выбор параметра образа
119+
acc_image_option_desc,Выберите тип образа для записи: Windows, Linux, Другое или Только форматирование
120+
acc_volume_label,Поле ввода метки тома
121+
acc_volume_label_desc,Введите имя для USB-тома
122+
acc_filesystem,Выбор файловой системы
123+
acc_cluster,Выбор размера кластера
124+
acc_flash_option,Выбор метода записи
125+
acc_quick_format,Флажок быстрого форматирования
126+
acc_extended_label,Флажок создания расширенной метки
127+
acc_bad_blocks,Флажок проверки на плохие блоки
128+
acc_bad_blocks_passes,Выбор количества проходов проверки
129+
acc_verify_hash,Флажок проверки контрольной суммы SHA256
130+
acc_hash_input,Поле ввода ожидаемого хеша SHA256
131+
acc_hash_input_desc,Вставьте сюда ожидаемый 64-символьный хеш SHA256
132+
acc_progress,Индикатор выполнения операции
133+
acc_start,Начать операцию
134+
acc_cancel,Отменить операцию
135+
acc_website,Открыть сайт Lufus
136+
acc_about,О Lufus
137+
acc_settings,Открыть настройки
138+
acc_log,Открыть окно журнала

0 commit comments

Comments
 (0)