From cc50d526c0fd95342ea48c416d15a0eb99f08984 Mon Sep 17 00:00:00 2001 From: flb Date: Tue, 19 Oct 2021 14:07:14 +0200 Subject: [PATCH] Better archive detection --- resources/i18n/de/menus.json | 5 +- resources/i18n/en-US/menus.json | 6 +- resources/i18n/es/menus.json | 5 +- resources/i18n/fr/menus.json | 6 +- resources/i18n/it/menus.json | 5 +- resources/i18n/ja/menus.json | 5 +- resources/i18n/pl/menus.json | 5 +- resources/i18n/pt-BR/menus.json | 5 +- resources/i18n/zh-CN/menus.json | 5 +- resources/i18n/zh-TW/menus.json | 5 +- source/app_page.cpp | 2 +- source/utils.cpp | 107 +++++++++++++++++--------------- 12 files changed, 70 insertions(+), 91 deletions(-) diff --git a/resources/i18n/de/menus.json b/resources/i18n/de/menus.json index b25e41e..f43cb4a 100644 --- a/resources/i18n/de/menus.json +++ b/resources/i18n/de/menus.json @@ -138,10 +138,7 @@ "utils": { "fw_warning": "Wegen der größe der Firmwarearchive werden downloads im Applet Mode nicht unterstützt. Bitte öffne die App mit vollem RAM Zugriff.", "overwrite": " Möchtest du folgende Datei überschreiben: ", - "wrong_type_sigpatches": "Die heruntergeladene Datei ist kein Sigpatches Archive. Dies kommt vermutlich durch einen kaputten Link. Wenn der Download nach 30 Minuten weiterhin nicht funktioniert, eröffne bitte ein Github issue.", - "wrong_type_fw": "Die heruntergeladene Datei ist kein firmware Archive. Dies kommt vermutlich durch einen kaputten Link. Wenn der Download nach 30 Minuten weiterhin nicht funktioniert, eröffne bitte ein Github issue.", - "overwrite_inis": "Möchtestet du vorhandene .ini Konfigurationsdateien überschreiben?", - "wrong_type_cfw": "Die heruntergeladene Datei ist kein CFW Archive. Dies kommt vermutlich durch einen kaputten Link. Wenn der Download nach 30 Minuten weiterhin nicht funktioniert, eröffne bitte ein Github issue." + "overwrite_inis": "Möchtestet du vorhandene .ini Konfigurationsdateien überschreiben?" }, "ams_update": { "reboot_rcm": "Die switch wird nun zu einem Speziellem Payload rebooten um den Installationsprozess ab zu schließen.", diff --git a/resources/i18n/en-US/menus.json b/resources/i18n/en-US/menus.json index 0235eda..7c861b6 100644 --- a/resources/i18n/en-US/menus.json +++ b/resources/i18n/en-US/menus.json @@ -164,10 +164,8 @@ "utils": { "fw_warning": "Because of the size of the FW archive, downloading firmwares in Applet Mode is not supported. Please launch the app with full RAM access.", "overwrite": " Do you want to overwrite existing ", - "wrong_type_sigpatches": "The downloaded file is not a sigpatches archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github.", - "wrong_type_fw": "The downloaded file is not a firmware archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github.", - "overwrite_inis": "Do you want to overwrite existing .ini config files?", - "wrong_type_cfw": "The downloaded file is not a CFW archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github." + "not_an_archive": "The downloaded file is not a zip archive. This is most likely due to a broken link. If the problem persists after more than 30 minutes, please open an issue on Github.", + "overwrite_inis": "Do you want to overwrite existing .ini config files?" }, "ams_update": { "reboot_rcm": "The Switch will now reboot to a special payload in order to finalise the install.", diff --git a/resources/i18n/es/menus.json b/resources/i18n/es/menus.json index df84cef..1d34dee 100644 --- a/resources/i18n/es/menus.json +++ b/resources/i18n/es/menus.json @@ -93,9 +93,6 @@ "utils": { "fw_warning": "Debido al tamaño de los FW, descargar firmwares en modo Applet no está soportado. Por favor, ejecuta la aplicación con acceso a toda la RAM.", "overwrite": " ¿Quieres sobrescribir el fichero existente ", - "wrong_type_sigpatches": "El fichero descargado no es un paquete de sigpatches. Esto se debe probablemente a un enlace roto. Si el problema persiste durante más de 3 horas, por favor abre un issue en Github.", - "wrong_type_fw": "El fichero descargado no es un firmware. Esto se debe probablemente a un enlace roto. Si el problema persiste durante más de 3 horas, por favor abre un issue en Github.", - "overwrite_inis": "¿Quieres sobrescribir los ficheros de configuración .ini existentes?", - "wrong_type_cfw": "El fichero descargado no es un CFW. Esto se debe probablemente a un enlace roto. Si el problema persiste durante más de 3 horas, por favor abre un issue en Github." + "overwrite_inis": "¿Quieres sobrescribir los ficheros de configuración .ini existentes?" } } \ No newline at end of file diff --git a/resources/i18n/fr/menus.json b/resources/i18n/fr/menus.json index 385187f..d367a2f 100644 --- a/resources/i18n/fr/menus.json +++ b/resources/i18n/fr/menus.json @@ -94,9 +94,7 @@ "utils": { "fw_warning": "En raison de la taille de l'archive FW, le téléchargement de firmwares en mode Applet n'est pas pris en charge. Veuillez lancer l'application avec un accès total à la RAM.", "overwrite": " Voulez-vous écraser le fichier l'existant ", - "wrong_type_sigpatches": "Le fichier téléchargé n'est pas une archive de sigpatches. Cela est probablement dû à un lien brisé. Si le problème persiste après plus de 3 heures, veuillez ouvrir une issue sur GitHub.", - "wrong_type_fw": "Le fichier téléchargé n'est pas une archive de firmare. Cela est probablement dû à un lien rompu. Si le problème persiste après plus de 3 heures, veuillez ouvrir une issue sur GitHub.", - "overwrite_inis": "Voulez-vous écraser les fichiers de configuration .ini déja présents ?", - "wrong_type_cfw": "Le fichier téléchargé n'est pas une archive de CFW. Cela est probablement dû à un lien rompu. Si le problème persiste après plus de 3 heures, veuillez ouvrir une issue sur GitHub." + "not_an_archive": "Le fichier téléchargé n'est pas une archive zip. Cela est probablement dû à un lien brisé. Si le problème persiste après plus de 3 heures, veuillez ouvrir une issue sur GitHub.", + "overwrite_inis": "Voulez-vous écraser les fichiers de configuration .ini déja présents ?" } } \ No newline at end of file diff --git a/resources/i18n/it/menus.json b/resources/i18n/it/menus.json index fa823ae..a65b34e 100644 --- a/resources/i18n/it/menus.json +++ b/resources/i18n/it/menus.json @@ -93,9 +93,6 @@ "utils": { "fw_warning": "A causa della dimensione del FW, lo scaricamento dei firmwares in Applet Mode non è supportato. Avvia l'applicazione con pieno accesso alla RAM.", "overwrite": " Do you want to overwrite existing ", - "wrong_type_sigpatches": "Il file scaricato non è un archivio di sigpatches. Ciò è probabilmente causato da un link non funzionante. Se il problema persiste dopo più di 3 ore, apri una issue su Github.", - "wrong_type_fw": "Il file scaricato non è un firmware. Ciò è probabilmente causato da un link non funzionante. Se il problema persiste dopo più di 3 ore, apri una issue su Github.", - "overwrite_inis": "Vuoi sovrascrivere i file di configurazione .ini esistenti?", - "wrong_type_cfw": "Il file scaricato non è un CFW. Ciò è probabilmente causato da un link non funzionante. Se il problema persiste dopo più di 3 ore, apri una issue su Github." + "overwrite_inis": "Vuoi sovrascrivere i file di configurazione .ini esistenti?" } } \ No newline at end of file diff --git a/resources/i18n/ja/menus.json b/resources/i18n/ja/menus.json index c3c703b..cfb28f2 100644 --- a/resources/i18n/ja/menus.json +++ b/resources/i18n/ja/menus.json @@ -159,10 +159,7 @@ "utils": { "fw_warning": "FWアーカイブのサイズが大きいため、アプレットモードでのファームウェアのダウンロードはサポートされていません。フルRAMアクセスでアプリを起動してください。", "overwrite": " 既存のものを上書きしますか ", - "wrong_type_sigpatches": "ダウンロードされたファイルはsigpatchはアーカイブではありません。これは、リンクが壊れていることが原因である可能性があります。 3時間以上経過しても問題が解決しない場合は、Githubで問題を開いてください。", - "wrong_type_fw": "ダウンロードしたファイルはファームウェアアーカイブではありません。これは、リンクが壊れていることが原因である可能性があります。 3時間以上経過しても問題が解決しない場合は、Githubで問題を開いてください。", - "overwrite_inis": "既存の.ini構成ファイルを上書きしますか?", - "wrong_type_cfw": "ダウンロードしたファイルはCFWアーカイブではありません。これは、リンクが壊れていることが原因である可能性があります。 3時間以上経過しても問題が解決しない場合は、Githubで問題を開いてください。" + "overwrite_inis": "既存の.ini構成ファイルを上書きしますか?" }, "ams_update": { "reboot_rcm": "これで、インストールを完了するために、スイッチが特別なペイロードで再起動します。", diff --git a/resources/i18n/pl/menus.json b/resources/i18n/pl/menus.json index b4e03c6..2cfc838 100644 --- a/resources/i18n/pl/menus.json +++ b/resources/i18n/pl/menus.json @@ -142,10 +142,7 @@ "utils": { "fw_warning": "Z powodu rozmiarów archiwów z firmwarem, ich pobieranie w trybie appletu nie jest wspierane. Uruchom aplikację z pełnym dostępem do pamięci RAM.", "overwrite": " Czy chcesz nadpisać istniejący ", - "wrong_type_sigpatches": "Pobrany plik nie jest archiwum z sigpatchami. Jest to najprawdopodobniej spowodowane wadliwym linkiem. Jeśli problem nie ustanie po więcej niż 30 minutach, utwórz nowy problem na Githubie.", - "wrong_type_fw": "Pobrany plik nie jest archiwum z firmwarem. Jest to najprawdopodobniej spowodowane wadliwym linkiem. Jeśli problem nie ustanie po więcej niż 30 minutach, utwórz nowy problem na Githubie.", - "overwrite_inis": "Czy chcesz nadpisać istniejące pliki konfiguracyjne .ini?", - "wrong_type_cfw": "Pobrany plik nie jest archiwum z CFW. Jest to najprawdopodobniej spowodowane wadliwym linkiem. Jeśli problem nie ustanie po więcej niż 30 minutach, utwórz nowy problem na Githubie." + "overwrite_inis": "Czy chcesz nadpisać istniejące pliki konfiguracyjne .ini?" }, "ams_update": { "reboot_rcm": "Switch uruchomi się teraz ponownie do specjalnego payloadu aby ukończyć instalację.", diff --git a/resources/i18n/pt-BR/menus.json b/resources/i18n/pt-BR/menus.json index 79e4ce1..b4ec9ea 100644 --- a/resources/i18n/pt-BR/menus.json +++ b/resources/i18n/pt-BR/menus.json @@ -93,9 +93,6 @@ "utils": { "fw_warning": "Devido ao tamanho dos FWs, o download do firmware no modo Applet não é compatível. Execute o aplicativo com acesso a toda a RAM.", "overwrite": " Você quer sobrescrever o arquivo existente? ", - "wrong_type_sigpatches": "O arquivo baixado não é um pacote sigpatches. Isso provavelmente se deve a um link quebrado. Se o problema persistir por mais de 3 horas, abra um 'issue' no Github.", - "wrong_type_fw": "O arquivo baixado não é um firmware. Isso provavelmente se deve a um link quebrado. Se o problema persistir por mais de 3 horas, abra um 'issue' no Github.", - "overwrite_inis": "Você deseja sobrescrever os arquivos de configuração .ini existentes?", - "wrong_type_cfw": "O arquivo baixado não é um CFW. Isso provavelmente se deve a um link quebrado. Se o problema persistir por mais de 3 horas, abra um 'issue' no Github." + "overwrite_inis": "Você deseja sobrescrever os arquivos de configuração .ini existentes?" } } \ No newline at end of file diff --git a/resources/i18n/zh-CN/menus.json b/resources/i18n/zh-CN/menus.json index 0dd72cb..b13bde1 100644 --- a/resources/i18n/zh-CN/menus.json +++ b/resources/i18n/zh-CN/menus.json @@ -95,9 +95,6 @@ "utils": { "fw_warning": "由于 FW archive的文件大小, 仅支持在 Applet Mode 模式下更新固件. (百度查询进入applet Mode模式方法)请让程序在Applet Mode下启动", "overwrite": "你想要覆盖已经存在的", - "wrong_type_sigpatches": "下载的文件没有数字签名认证. 可能是由于链接出问题了.如果3个小时还有类似的问题, 请到github上给作者提出issue.", - "wrong_type_fw": "下载的文件没有数字签名认证. 可能是由于链接出问题了.如果3个小时还有类似的问题, 请到github上给作者提出issue", - "overwrite_inis": "你想要覆盖已经存在的.ini 设置文件吗?", - "wrong_type_cfw": "下载的文件CFW出现问题. 可能是由于链接出问题了.如果3个小时还有类似的问题, 请到github上给作者提出issue." + "overwrite_inis": "你想要覆盖已经存在的.ini 设置文件吗?" } } \ No newline at end of file diff --git a/resources/i18n/zh-TW/menus.json b/resources/i18n/zh-TW/menus.json index 54e909e..a4d6570 100644 --- a/resources/i18n/zh-TW/menus.json +++ b/resources/i18n/zh-TW/menus.json @@ -164,10 +164,7 @@ "utils": { "fw_warning": "由於FW壓縮檔太大,在applet模式下無法下載韌體。請在能存取完整記憶體的一般模式下執行下載程序", "overwrite": " 是否要覆蓋現有的檔案 ", - "wrong_type_sigpatches": "下載的檔案並不是正確的sigpatches壓縮檔。可能是檔案連結發生錯誤。如果下載錯誤持續超過30分鐘,請使用Github提出問題來進行回報", - "wrong_type_fw": "下載的檔案並不是正確的韌體壓縮檔。可能是檔案連結發生錯誤。如果下載錯誤持續超過30分鐘,請使用Github提出問題來進行回報", - "overwrite_inis": "是否要覆蓋現有的 .ini 系統配置檔案?", - "wrong_type_cfw": "下載的檔案並不是正確的CFW壓縮檔。可能是檔案連結發生錯誤。如果下載錯誤持續超過30分鐘,請使用Github提出問題來進行回報" + "overwrite_inis": "是否要覆蓋現有的 .ini 系統配置檔案?" }, "ams_update": { "reboot_rcm": "Switch將會重新啟動,並載入特定的注入檔案來完成安裝。", diff --git a/source/app_page.cpp b/source/app_page.cpp index 1257f31..728289a 100644 --- a/source/app_page.cpp +++ b/source/app_page.cpp @@ -43,7 +43,7 @@ void AppPage::PopulatePage() tid = records[i].application_id; - if R_FAILED (GetControlData(tid, controlData, controlSize, name)) continue; + if R_FAILED(GetControlData(tid, controlData, controlSize, name)) continue; listItem = new brls::ListItem(name, "", util::formatApplicationId(tid)); this->DeclareGameListItem(name, tid, &controlData); diff --git a/source/utils.cpp b/source/utils.cpp index 2145ae4..c71af21 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -21,13 +21,16 @@ namespace util { bool isArchive(const std::string& path) { - std::fstream file; - std::string fileContent; if (std::filesystem::exists(path)) { - file.open(path, std::fstream::in); - file >> fileContent; + std::ifstream is(path, std::ifstream::binary); + char zip_signature[4] = {0x50, 0x4B, 0x03, 0x04}; // zip signature header PK\3\4 + char signature[4]; + is.read(signature, 4); + if (is.good() && std::equal(std::begin(signature), std::end(signature), std::begin(zip_signature), std::end(zip_signature))) { + return true; + } } - return fileContent.find("DOCTYPE") == std::string::npos; + return false; } void downloadArchive(const std::string& url, contentType type) @@ -107,29 +110,43 @@ namespace util { return result; } - void extractArchive(contentType type, const std::string& tag) + void crashIfNotArchive(contentType type) { - int overwriteInis = 0; - chdir(ROOT_PATH); + std::string filename; switch (type) { case contentType::sigpatches: - if (isArchive(SIGPATCHES_FILENAME)) { - /* if(std::filesystem::exists(HEKATE_IPL_PATH)){ - overwriteInis = showDialogBox("menus/utils/overwrite"_i18n + std::string(HEKATE_IPL_PATH) +"?", "menus/common/no"_i18n, "menus/common/yes"_i18n); - if(overwriteInis == 0){ - extract::extract(SIGPATCHES_FILENAME, ROOT_PATH, HEKATE_IPL_PATH); - } - else{ - extract::extract(SIGPATCHES_FILENAME); - } - } */ - //else{ - extract::extract(SIGPATCHES_FILENAME); - //} - } - else { - brls::Application::crash("menus/utils/wrong_type_sigpatches"_i18n); - } + filename = SIGPATCHES_FILENAME; + break; + case contentType::cheats: + filename = CHEATS_FILENAME; + break; + case contentType::fw: + filename = FIRMWARE_FILENAME; + break; + case contentType::app: + filename = APP_FILENAME; + break; + case contentType::bootloaders: + filename = CFW_FILENAME; + break; + case contentType::ams_cfw: + filename = AMS_FILENAME; + break; + default: + return; + } + if (!isArchive(filename)) { + brls::Application::crash("menus/utils/not_an_archive"_i18n); + } + } + + void extractArchive(contentType type, const std::string& tag) + { + chdir(ROOT_PATH); + crashIfNotArchive(type); + switch (type) { + case contentType::sigpatches: + extract::extract(SIGPATCHES_FILENAME); break; case contentType::cheats: { std::vector titles = extract::getInstalledTitlesNs(); @@ -138,14 +155,9 @@ namespace util { break; } case contentType::fw: - if (std::filesystem::file_size(FIRMWARE_FILENAME) < 200000) { - brls::Application::crash("menus/utils/wrong_type_sigpatches_downloaded"_i18n); - } - else { - if (std::filesystem::exists(FIRMWARE_PATH)) std::filesystem::remove_all(FIRMWARE_PATH); - fs::createTree(FIRMWARE_PATH); - extract::extract(FIRMWARE_FILENAME, FIRMWARE_PATH); - } + if (std::filesystem::exists(FIRMWARE_PATH)) std::filesystem::remove_all(FIRMWARE_PATH); + fs::createTree(FIRMWARE_PATH); + extract::extract(FIRMWARE_FILENAME, FIRMWARE_PATH); break; case contentType::app: extract::extract(APP_FILENAME, CONFIG_PATH); @@ -154,25 +166,20 @@ namespace util { romfsExit(); brls::Application::quit(); break; - case contentType::bootloaders: - if (isArchive(CFW_FILENAME)) { - overwriteInis = showDialogBox("menus/utils/overwrite_inis"_i18n, "menus/common/no"_i18n, "menus/common/yes"_i18n); - extract::extract(CFW_FILENAME, ROOT_PATH, overwriteInis); - } - else { - brls::Application::crash("menus/utils/wrong_type_cfw"_i18n); - } + case contentType::bootloaders: { + int overwriteInis = showDialogBox("menus/utils/overwrite_inis"_i18n, "menus/common/no"_i18n, "menus/common/yes"_i18n); + extract::extract(CFW_FILENAME, ROOT_PATH, overwriteInis); break; - case contentType::ams_cfw: - if (isArchive(AMS_FILENAME)) { - overwriteInis = showDialogBox("menus/utils/overwrite_inis"_i18n, "menus/common/no"_i18n, "menus/common/yes"_i18n); - usleep(800000); - int deleteContents = showDialogBox("menus/ams_update/delete_sysmodules_flags"_i18n, "menus/common/no"_i18n, "menus/common/yes"_i18n); - if (deleteContents == 1) - removeSysmodulesFlags(AMS_CONTENTS); - extract::extract(AMS_FILENAME, ROOT_PATH, overwriteInis); - } + } + case contentType::ams_cfw: { + int overwriteInis = showDialogBox("menus/utils/overwrite_inis"_i18n, "menus/common/no"_i18n, "menus/common/yes"_i18n); + usleep(800000); + int deleteContents = showDialogBox("menus/ams_update/delete_sysmodules_flags"_i18n, "menus/common/no"_i18n, "menus/common/yes"_i18n); + if (deleteContents == 1) + removeSysmodulesFlags(AMS_CONTENTS); + extract::extract(AMS_FILENAME, ROOT_PATH, overwriteInis); break; + } default: break; }