Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ tar = { version = "0.4", default-features = false }
# Zstd (decompress ported-ROM `*.img.zst` payloads, e.g. `super.img.zst`).
# Already linked transitively via kptools, so this adds no new C build surface.
zstd = "0.13"
# LZMA-alone decoding for compressed ABL LinuxLoader images. This is already
# present transitively through kptools/magiskboot.
lzma-rust2 = "0.16.5"

# UTF-8-guaranteed paths. `camino::Utf8PathBuf` is a drop-in `PathBuf`
# replacement that rejects non-UTF-8 byte sequences at construction time,
Expand Down
15 changes: 15 additions & 0 deletions crates/ltbox-gui/lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
"family_skroot_desc": "SELinux-preserving stealth mode",
"firmware_menu_ota": "OTA Package",
"firmware_menu_qfil": "QFIL Firmware",
"flash_bootloader_analyzing": "Analyzing…",
"flash_bootloader_empty": "No bootloader selected",
"flash_bootloader_select": "Select bootloader file",
"flash_bootloader_subtitle": "(Optional) When flashing firmware signed with a new key, you can supply a bootloader that still trusts the existing key so the firmware can be re-signed and flashed.",
"flash_bootloader_title": "Select Bootloader",
"flash_confirm_country": "Country Code Change",
"flash_confirm_country_skip": "Do not change",
"flash_confirm_data": "Data Mode",
Expand All @@ -370,10 +375,19 @@
"flash_confirm_warning_wipe": "⚠ Data wipe: back up anything you need before starting.",
"flash_data_subtitle": "Keep or erase user data during flash?",
"flash_data_title": "Select Data Mode",
"flash_firmware_identity_error": "Could not inspect vbmeta_system.img: {error}",
"flash_firmware_identity_error_title": "Firmware Inspection Failed",
"flash_firmware_identity_key": "Signing Key",
"flash_firmware_identity_model": "Firmware Model",
"flash_firmware_identity_title": "Firmware Information",
"flash_firmware_model_unknown": "Unknown model",
"flash_folder_desc": "Folder containing firmware images and rawprogram XML",
"flash_folder_placeholder": "No folder selected",
"flash_folder_subtitle": "Select the extracted QFIL firmware folder.",
"flash_folder_title": "Select Firmware Folder",
"flash_key_lenovo": "Lenovo key",
"flash_key_testkey": "Test key",
"flash_key_unknown": "Unknown",
"flash_loader_browse": "Select loader file",
"flash_loader_change": "Change loader",
"flash_loader_missing": "This firmware folder has no EDL loader — provide one to continue.",
Expand All @@ -399,6 +413,7 @@
"flash_serial_prompt_skip": "Select manually",
"flash_serial_prompt_subtitle": "The serial couldn't be read from the device. Enter it to auto-detect the region.",
"flash_serial_prompt_title": "Enter Serial Number",
"flash_step_bootloader": "Bootloader",
"flash_step_confirm": "Confirm",
"flash_step_data": "Data",
"flash_step_flash": "Flash",
Expand Down
15 changes: 15 additions & 0 deletions crates/ltbox-gui/lang/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
"family_skroot_desc": "SELinux に触れない隠蔽方式",
"firmware_menu_ota": "OTA パッケージ",
"firmware_menu_qfil": "QFIL ファームウェア",
"flash_bootloader_analyzing": "確認中…",
"flash_bootloader_empty": "ファイルが選択されていません",
"flash_bootloader_select": "ブートローダーファイルを選択",
"flash_bootloader_subtitle": "(任意)新しいキーで署名されたファームウェアをフラッシュするとき、既存のキーを信じるブートローダーを指定すると、ファームウェアを再署名してフラッシュできます。",
"flash_bootloader_title": "ブートローダーの確認",
"flash_confirm_country": "国コード変更",
"flash_confirm_country_skip": "変更しない",
"flash_confirm_data": "データモード",
Expand All @@ -370,10 +375,19 @@
"flash_confirm_warning_wipe": "⚠ データを消去します: 開始する前に必要なものをすべてバックアップしてください。",
"flash_data_subtitle": "フラッシュ中にユーザーデータを保持しますか、それとも消去しますか?",
"flash_data_title": "データモードを選択",
"flash_firmware_identity_error": "vbmeta_system.img の確認に失敗: {error}",
"flash_firmware_identity_error_title": "ファームウェアの確認に失敗",
"flash_firmware_identity_key": "署名キー",
"flash_firmware_identity_model": "ファームウェアモデル",
"flash_firmware_identity_title": "ファームウェア情報",
"flash_firmware_model_unknown": "モデル不明",
"flash_folder_desc": "ファームウェアイメージと rawprogram XML を含むフォルダ",
"flash_folder_placeholder": "フォルダが選択されていません",
"flash_folder_subtitle": "展開済みの QFIL ファームウェアフォルダを選択してください。",
"flash_folder_title": "ファームウェアフォルダを選択",
"flash_key_lenovo": "Lenovo キー",
"flash_key_testkey": "テストキー",
"flash_key_unknown": "不明",
"flash_loader_browse": "ローダーファイルを選択",
"flash_loader_change": "ローダーを変更",
"flash_loader_missing": "このファームウェアフォルダに EDL ローダーがありません — 続行するにはローダーを指定してください。",
Expand All @@ -399,6 +413,7 @@
"flash_serial_prompt_skip": "手動で選択",
"flash_serial_prompt_subtitle": "デバイスからシリアル番号を読み取れませんでした。リージョンを自動判別するには入力してください。",
"flash_serial_prompt_title": "シリアル番号を入力",
"flash_step_bootloader": "ブートローダー",
"flash_step_confirm": "確認",
"flash_step_data": "データ",
"flash_step_flash": "フラッシュ",
Expand Down
15 changes: 15 additions & 0 deletions crates/ltbox-gui/lang/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
"family_skroot_desc": "SELinux 무변경 숨김 방식",
"firmware_menu_ota": "OTA 패키지",
"firmware_menu_qfil": "QFIL 펌웨어",
"flash_bootloader_analyzing": "검사 중…",
"flash_bootloader_empty": "파일 선택 없음",
"flash_bootloader_select": "부트로더 파일 선택",
"flash_bootloader_subtitle": "(선택사항) 새 키로 서명된 펌웨어를 플래싱할 때 기존 키를 사용하는 부트로더를 선택하면 펌웨어를 다시 서명해 플래싱할 수 있습니다.",
"flash_bootloader_title": "부트로더 선택",
"flash_confirm_country": "국가 코드 변경",
"flash_confirm_country_skip": "변경 안 함",
"flash_confirm_data": "데이터 모드",
Expand All @@ -370,10 +375,19 @@
"flash_confirm_warning_wipe": "⚠ 데이터 초기화: 시작하기 전에 필요한 자료를 백업하세요.",
"flash_data_subtitle": "플래싱 중 사용자 데이터를 유지할지 지울지 고르세요.",
"flash_data_title": "데이터 모드 선택",
"flash_firmware_identity_error": "vbmeta_system.img 검사 실패: {error}",
"flash_firmware_identity_error_title": "펌웨어 검사 실패",
"flash_firmware_identity_key": "서명 키",
"flash_firmware_identity_model": "펌웨어 모델",
"flash_firmware_identity_title": "펌웨어 정보",
"flash_firmware_model_unknown": "모델 알 수 없음",
"flash_folder_desc": "펌웨어 이미지와 rawprogram XML이 들어있는 폴더",
"flash_folder_placeholder": "선택된 폴더 없음",
"flash_folder_subtitle": "압축 해제된 QFIL 펌웨어 폴더를 선택하세요.",
"flash_folder_title": "펌웨어 폴더 선택",
"flash_key_lenovo": "레노버 키",
"flash_key_testkey": "테스트 키",
"flash_key_unknown": "알 수 없음",
"flash_loader_browse": "로더 파일 선택",
"flash_loader_change": "로더 변경",
"flash_loader_missing": "이 펌웨어 폴더에 EDL 로더가 없습니다 — 계속하려면 로더를 지정하세요.",
Expand All @@ -399,6 +413,7 @@
"flash_serial_prompt_skip": "직접 선택",
"flash_serial_prompt_subtitle": "기기에서 일련번호를 읽지 못했습니다. 지역 자동 선택을 위해 직접 입력하세요.",
"flash_serial_prompt_title": "일련번호 입력",
"flash_step_bootloader": "부트로더",
"flash_step_confirm": "확인",
"flash_step_data": "데이터",
"flash_step_flash": "플래싱",
Expand Down
15 changes: 15 additions & 0 deletions crates/ltbox-gui/lang/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
"family_skroot_desc": "Скрытый режим без изменений SELinux",
"firmware_menu_ota": "OTA-пакет",
"firmware_menu_qfil": "Прошивка QFIL",
"flash_bootloader_analyzing": "Проверка…",
"flash_bootloader_empty": "Файл не выбран",
"flash_bootloader_select": "Выбрать файл загрузчика",
"flash_bootloader_subtitle": "(Необязательно) При прошивке ПО, подписанного новым ключом, можно указать загрузчик, который доверяет прежнему ключу, чтобы переподписать и прошить ПО.",
"flash_bootloader_title": "Проверка загрузчика",
"flash_confirm_country": "Изменение кода страны",
"flash_confirm_country_skip": "Не изменять",
"flash_confirm_data": "Режим данных",
Expand All @@ -370,10 +375,19 @@
"flash_confirm_warning_wipe": "⚠ Очистка данных: перед началом сделайте резервную копию нужных данных.",
"flash_data_subtitle": "Сохранить или стереть пользовательские данные при прошивке?",
"flash_data_title": "Режим данных",
"flash_firmware_identity_error": "Не удалось проверить vbmeta_system.img: {error}",
"flash_firmware_identity_error_title": "Ошибка проверки прошивки",
"flash_firmware_identity_key": "Ключ подписи",
"flash_firmware_identity_model": "Модель прошивки",
"flash_firmware_identity_title": "Данные прошивки",
"flash_firmware_model_unknown": "Модель неизвестна",
"flash_folder_desc": "Папка с образами прошивки и rawprogram XML",
"flash_folder_placeholder": "Папка не выбрана",
"flash_folder_subtitle": "Выберите распакованную папку прошивки QFIL.",
"flash_folder_title": "Выбор папки прошивки",
"flash_key_lenovo": "Ключ Lenovo",
"flash_key_testkey": "Тестовый ключ",
"flash_key_unknown": "Неизвестно",
"flash_loader_browse": "Выбрать файл загрузчика",
"flash_loader_change": "Сменить загрузчик",
"flash_loader_missing": "В этой папке прошивки нет загрузчика EDL — укажите его, чтобы продолжить.",
Expand All @@ -399,6 +413,7 @@
"flash_serial_prompt_skip": "Выбрать вручную",
"flash_serial_prompt_subtitle": "Серийный номер не удалось считать с устройства. Введите его для автоопределения региона.",
"flash_serial_prompt_title": "Введите серийный номер",
"flash_step_bootloader": "Загрузчик",
"flash_step_confirm": "Подтверждение",
"flash_step_data": "Данные",
"flash_step_flash": "Прошивка",
Expand Down
15 changes: 15 additions & 0 deletions crates/ltbox-gui/lang/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
"family_skroot_desc": "SELinux 零触碰隐藏方案",
"firmware_menu_ota": "OTA 包",
"firmware_menu_qfil": "QFIL 固件",
"flash_bootloader_analyzing": "正在检查…",
"flash_bootloader_empty": "未选择文件",
"flash_bootloader_select": "选择引导加载程序文件",
"flash_bootloader_subtitle": "(可选)刷写使用新密钥签名的固件时,可以提供仍信任现有密钥的引导加载程序,以便重新签名并刷写固件。",
"flash_bootloader_title": "引导加载程序检查",
"flash_confirm_country": "国家码更改",
"flash_confirm_country_skip": "不更改",
"flash_confirm_data": "数据模式",
Expand All @@ -370,10 +375,19 @@
"flash_confirm_warning_wipe": "⚠ 清除数据:开始前请备份所需的资料。",
"flash_data_subtitle": "刷写时保留还是清除用户数据?",
"flash_data_title": "选择数据模式",
"flash_firmware_identity_error": "无法检查 vbmeta_system.img:{error}",
"flash_firmware_identity_error_title": "固件检查失败",
"flash_firmware_identity_key": "签名密钥",
"flash_firmware_identity_model": "固件型号",
"flash_firmware_identity_title": "固件信息",
"flash_firmware_model_unknown": "型号未知",
"flash_folder_desc": "包含固件镜像和 rawprogram XML 的文件夹",
"flash_folder_placeholder": "未选择文件夹",
"flash_folder_subtitle": "选择已解压的 QFIL 固件文件夹。",
"flash_folder_title": "选择固件文件夹",
"flash_key_lenovo": "联想密钥",
"flash_key_testkey": "测试密钥",
"flash_key_unknown": "未知",
"flash_loader_browse": "选择加载器文件",
"flash_loader_change": "更换加载器",
"flash_loader_missing": "此固件文件夹没有 EDL 加载器 — 请提供一个以继续。",
Expand All @@ -399,6 +413,7 @@
"flash_serial_prompt_skip": "手动选择",
"flash_serial_prompt_subtitle": "无法从设备读取序列号。请手动输入以自动判断区域。",
"flash_serial_prompt_title": "输入序列号",
"flash_step_bootloader": "引导加载程序",
"flash_step_confirm": "确认",
"flash_step_data": "数据",
"flash_step_flash": "刷写",
Expand Down
16 changes: 12 additions & 4 deletions crates/ltbox-gui/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2840,6 +2840,11 @@ impl App {
/// pre-fill a configured Settings default loader if it fits the model; the
/// folder step otherwise requires the user to pick one before advancing.
fn set_flash_firmware_folder(&mut self, path: String) {
let was_after_folder = matches!(
self.flash.current_step(),
FlashStep::Bootloader | FlashStep::Confirm
);
self.flash.reset_firmware_identity();
// Users frequently pick the extracted firmware ROOT instead of the
// `image` folder LTBox flashes; retarget to a direct `image/` child
// when one exists so the common mis-selection just works.
Expand All @@ -2855,11 +2860,9 @@ impl App {
self.flash.loader_error = None;
self.flash.firmware_folder = Some(path.clone());
self.flash.set_firmware_rollback_indices(&path);
if self.flash.step == 4
&& self.flash.loader_required
&& self.flash.loader_override.is_none()
if was_after_folder || (self.flash.loader_required && self.flash.loader_override.is_none())
{
self.flash.step = 3;
self.flash.set_step(FlashStep::Folder);
}
}

Expand Down Expand Up @@ -4175,6 +4178,11 @@ mod tests {
let mut w = FlashWizard {
step: 4,
firmware_folder: Some("firmware".to_string()),
firmware_identity: Some(FirmwareIdentity {
key_class: ltbox_patch::key_map::KeyClass::Testkey,
fingerprint: None,
model_token: None,
}),
loader_required: true,
..Default::default()
};
Expand Down
13 changes: 10 additions & 3 deletions crates/ltbox-gui/src/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@

use crate::{
AdvAction, ConfirmField, DataMode, DevicePollResult, DeviceRegion, DumpPartsScanResult, Family,
FlashPartsScanResult, FlashTarget, GpuCellKey, Language, ManualRollbackEditor, NightlySource,
PartsSortColumn, PickerTarget, Provider, RebootTarget, RescueRegion, RollbackSetting, RootMode,
SkrootFlavor, SysUpdateAction, ThemeChoice, ThemeSeed, UnrootType, VerChoice, View,
FirmwareIdentity, FlashPartsScanResult, FlashTarget, GpuCellKey, Language,
ManualRollbackEditor, NightlySource, PartsSortColumn, PickerTarget, Provider, RebootTarget,
RescueRegion, RollbackSetting, RootMode, SkrootFlavor, SysUpdateAction, ThemeChoice, ThemeSeed,
UnrootType, VerChoice, View,
};

#[derive(Debug, Clone)]
Expand Down Expand Up @@ -222,9 +223,15 @@ pub(crate) enum FlashMsg {
FlashNext,
FlashBack,
FlashSelectFolder,
FlashFirmwareIdentityInspected(String, Result<FirmwareIdentity, String>),
FlashFirmwareIdentityDialogAction,
/// Pick a standalone EDL loader when the firmware folder ships none.
FlashSelectLoader,
FlashLoaderChosen(Option<String>),
FlashSelectBootloader,
FlashBootloaderChosen(Option<String>),
FlashBootloaderAnalysed(String, ltbox_patch::key_map::KeyClass),
FlashClearBootloader,
/// Confirm-step "hidden dropdown": open the option editor for a row.
FlashConfirmOpen(ConfirmField),
/// Dismiss the confirm-step option editor without a change.
Expand Down
Loading
Loading