From 0ab9df3209ee599f581532d05d331e6abe0f53f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Fr=C3=B6der?= Date: Mon, 1 Mar 2021 22:56:46 +0100 Subject: [PATCH] Opa fixes (#8) * Fix --exit-recovery, improve message that gets printed * Fix latest flags for models that have multiple boardconfigs (iPhone SE, iPhone 6S...) * Fix windows compilation (again...) --- futurerestore/futurerestore.cpp | 46 +++++++++++++++++---------------- futurerestore/futurerestore.hpp | 4 +-- futurerestore/main.cpp | 2 +- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/futurerestore/futurerestore.cpp b/futurerestore/futurerestore.cpp index f2c41fd4..afbab3a8 100644 --- a/futurerestore/futurerestore.cpp +++ b/futurerestore/futurerestore.cpp @@ -163,11 +163,13 @@ void futurerestore::setAutoboot(bool val){ retassure(_didInit, "did not init\n"); retassure(getDeviceMode(false) == MODE_RECOVERY, "can't set auto-boot, when device isn't in recovery mode\n"); - retassure(!_client->recovery && recovery_client_new(_client),"Could not connect to device in recovery mode.\n"); + if(!_client->recovery){ + retassure(!recovery_client_new(_client),"Could not connect to device in recovery mode.\n"); + } retassure(!recovery_set_autoboot(_client, val),"Setting auto-boot failed?!\n"); } -void futurerestore::exitRecovery() { +void futurerestore::exitRecovery(){ setAutoboot(true); recovery_send_reset(_client); recovery_client_free(_client); @@ -1321,7 +1323,7 @@ static void zip_directory(const std::string& inputdir, const std::string& output void futurerestore::downloadLatestRose(){ char * manifeststr = getLatestManifest(); - char *roseStr = (elemExists("Rap,RTKitOS", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Rap,RTKitOS", manifeststr, getDeviceModelNoCopy(), 0) : NULL); + char *roseStr = (elemExists("Rap,RTKitOS", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Rap,RTKitOS", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); if(roseStr) { info("downloading Rose firmware\n\n"); char roseStr1[PATH_MAX]; @@ -1339,7 +1341,7 @@ void futurerestore::downloadLatestRose(){ void futurerestore::downloadLatestSE(){ char * manifeststr = getLatestManifest(); - char *seStr = (elemExists("SE,UpdatePayload", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("SE,UpdatePayload", manifeststr, getDeviceModelNoCopy(), 0) : NULL); + char *seStr = (elemExists("SE,UpdatePayload", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("SE,UpdatePayload", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); if(seStr) { info("downloading SE firmware\n\n"); char seStr1[PATH_MAX]; @@ -1357,16 +1359,16 @@ void futurerestore::downloadLatestSE(){ void futurerestore::downloadLatestSavage(){ char * manifeststr = getLatestManifest(); - char *savageB0DevStr = (elemExists("Savage,B0-Dev-Patch", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Dev-Patch", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB0DevVTStr = (elemExists("Savage,B0-Dev-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Dev-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB0ProdStr = (elemExists("Savage,B0-Prod-Patch", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Prod-Patch", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB0ProdVTStr = (elemExists("Savage,B0-Prod-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Prod-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB2DevStr = (elemExists("Savage,B2-Dev-Patch", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Dev-Patch", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB2DevVTStr = (elemExists("Savage,B2-Dev-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Dev-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB2ProdStr = (elemExists("Savage,B2-Prod-Patch", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Prod-Patch", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageB2ProdVTStr = (elemExists("Savage,B2-Prod-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Prod-PatchVT", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageBADevStr = (elemExists("Savage,BA-Dev-Patch", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,BA-Dev-Patch", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *savageBAProdStr = (elemExists("Savage,BA-Prod-Patch", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("Savage,BA-Prod-Patch", manifeststr, getDeviceModelNoCopy(), 0) : NULL); + char *savageB0DevStr = (elemExists("Savage,B0-Dev-Patch", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Dev-Patch", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB0DevVTStr = (elemExists("Savage,B0-Dev-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Dev-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB0ProdStr = (elemExists("Savage,B0-Prod-Patch", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Prod-Patch", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB0ProdVTStr = (elemExists("Savage,B0-Prod-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B0-Prod-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB2DevStr = (elemExists("Savage,B2-Dev-Patch", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Dev-Patch", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB2DevVTStr = (elemExists("Savage,B2-Dev-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Dev-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB2ProdStr = (elemExists("Savage,B2-Prod-Patch", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Prod-Patch", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageB2ProdVTStr = (elemExists("Savage,B2-Prod-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,B2-Prod-PatchVT", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageBADevStr = (elemExists("Savage,BA-Dev-Patch", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,BA-Dev-Patch", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *savageBAProdStr = (elemExists("Savage,BA-Prod-Patch", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("Savage,BA-Prod-Patch", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); if(savageB0DevStr) { info("downloading Savage,B0-Dev-Patch\n\n"); char savageB0DevStr1[PATH_MAX]; @@ -1501,8 +1503,8 @@ void futurerestore::downloadLatestSavage(){ void futurerestore::downloadLatestVeridian(){ char * manifeststr = getLatestManifest(); - char *veridianStr = (elemExists("BMU,DigestMap", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("BMU,DigestMap", manifeststr, getDeviceModelNoCopy(), 0) : NULL); - char *veridianFWMStr = (elemExists("BMU,FirmwareMap", manifeststr, getDeviceModelNoCopy(), 0) ? getPathOfElementInManifest("BMU,FirmwareMap", manifeststr, getDeviceModelNoCopy(), 0) : NULL); + char *veridianStr = (elemExists("BMU,DigestMap", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("BMU,DigestMap", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); + char *veridianFWMStr = (elemExists("BMU,FirmwareMap", manifeststr, getDeviceBoardNoCopy(), 0) ? getPathOfElementInManifest("BMU,FirmwareMap", manifeststr, getDeviceBoardNoCopy(), 0) : NULL); if(veridianStr) { info("downloading Veridian DigestMap\n\n"); char veridianStr1[PATH_MAX]; @@ -1555,7 +1557,7 @@ void futurerestore::downloadLatestFirmwareComponents(){ void futurerestore::loadLatestBaseband(){ char * manifeststr = getLatestManifest(); - char *pathStr = getPathOfElementInManifest("BasebandFirmware", manifeststr, getDeviceModelNoCopy(), 0); + char *pathStr = getPathOfElementInManifest("BasebandFirmware", manifeststr, getDeviceBoardNoCopy(), 0); info("downloading Baseband\n\n"); retassure(!downloadPartialzip(getLatestFirmwareUrl(), pathStr, _basebandPath = BASEBAND_TMP_PATH), "could not download baseband\n"); saveStringToFile(manifeststr, BASEBAND_MANIFEST_TMP_PATH); @@ -1565,7 +1567,7 @@ void futurerestore::loadLatestBaseband(){ void futurerestore::loadLatestSep(){ char * manifeststr = getLatestManifest(); - char *pathStr = getPathOfElementInManifest("SEP", manifeststr, getDeviceModelNoCopy(), 0); + char *pathStr = getPathOfElementInManifest("SEP", manifeststr, getDeviceBoardNoCopy(), 0); info("downloading SEP\n\n"); retassure(!downloadPartialzip(getLatestFirmwareUrl(), pathStr, SEP_TMP_PATH), "could not download SEP\n"); loadSep(SEP_TMP_PATH); @@ -1722,13 +1724,13 @@ plist_t futurerestore::loadPlistFromFile(const char *path){ return ret; } -char *futurerestore::getPathOfElementInManifest(const char *element, const char *manifeststr, const char *model, int isUpdateInstall){ +char *futurerestore::getPathOfElementInManifest(const char *element, const char *manifeststr, const char *boardConfig, int isUpdateInstall){ char *pathStr = NULL; ptr_smart buildmanifest(NULL,plist_free); plist_from_xml(manifeststr, (uint32_t)strlen(manifeststr), &buildmanifest); - if (plist_t identity = getBuildidentity(buildmanifest._p, model, isUpdateInstall)) + if (plist_t identity = getBuildidentityWithBoardconfig(buildmanifest._p, boardConfig, isUpdateInstall)) if (plist_t manifest = plist_dict_get_item(identity, "Manifest")) if (plist_t elem = plist_dict_get_item(manifest, element)) if (plist_t info = plist_dict_get_item(elem, "Info")) @@ -1741,13 +1743,13 @@ noerror: return pathStr; } -bool futurerestore::elemExists(const char *element, const char *manifeststr, const char *model, int isUpdateInstall){ +bool futurerestore::elemExists(const char *element, const char *manifeststr, const char *boardConfig, int isUpdateInstall){ char *pathStr = NULL; ptr_smart buildmanifest(NULL,plist_free); plist_from_xml(manifeststr, (uint32_t)strlen(manifeststr), &buildmanifest); - if (plist_t identity = getBuildidentity(buildmanifest._p, model, isUpdateInstall)) + if (plist_t identity = getBuildidentityWithBoardconfig(buildmanifest._p, boardConfig, isUpdateInstall)) if (plist_t manifest = plist_dict_get_item(identity, "Manifest")) if (plist_t elem = plist_dict_get_item(manifest, element)) if (plist_t info = plist_dict_get_item(elem, "Info")) diff --git a/futurerestore/futurerestore.hpp b/futurerestore/futurerestore.hpp index cc801481..68d216db 100644 --- a/futurerestore/futurerestore.hpp +++ b/futurerestore/futurerestore.hpp @@ -128,8 +128,8 @@ public: static uint64_t getEcidFromSCAB(const char* scab, size_t scabSize); static plist_t loadPlistFromFile(const char *path); static void saveStringToFile(const char *str, const char *path); - static char *getPathOfElementInManifest(const char *element, const char *manifeststr, const char *model, int isUpdateInstall); - bool elemExists(const char *element, const char *manifeststr, const char *model, int isUpdateInstall); + static char *getPathOfElementInManifest(const char *element, const char *manifeststr, const char *boardConfig, int isUpdateInstall); + bool elemExists(const char *element, const char *manifeststr, const char *boardConfig, int isUpdateInstall); static std::string getGeneratorFromSHSH2(const plist_t shsh2); }; diff --git a/futurerestore/main.cpp b/futurerestore/main.cpp index 96906a88..00da2918 100644 --- a/futurerestore/main.cpp +++ b/futurerestore/main.cpp @@ -195,7 +195,7 @@ int main_r(int argc, const char * argv[]) { }else if (argc == optind && flags & FLAG_WAIT) { info("User requested to only wait for ApNonce to match, but not for actually restoring\n"); }else if (exitRecovery){ - info("Exiting to recovery mode\n"); + info("Exiting from recovery mode to normal mode\n"); }else{ error("argument parsing failed! agrc=%d optind=%d\n",argc,optind); if (idevicerestore_debug){