From 76c8f462e725c8e5e386111e393151ce1baa64a6 Mon Sep 17 00:00:00 2001 From: XorTroll Date: Wed, 2 Oct 2019 19:45:20 +0200 Subject: [PATCH] 0.7.3 - 9.0.1 support --- Goldleaf/Icon.jpg | Bin 14029 -> 14029 bytes Goldleaf/Include/Types.hpp | 1 + Goldleaf/Include/fs/fs_Common.hpp | 2 ++ Goldleaf/Include/hos/hos_Content.hpp | 10 +++++- Goldleaf/Makefile | 2 +- Goldleaf/RomFs/MenuBanner.png | Bin 9750 -> 9747 bytes Goldleaf/Source/Main.cpp | 10 +++++- Goldleaf/Source/fs/fs_Common.cpp | 12 +++++++ Goldleaf/Source/hos/hos_Common.cpp | 25 ++++++--------- Goldleaf/Source/hos/hos_Content.cpp | 39 +++++++++++++++++++---- Goldleaf/Source/ui/ui_SettingsLayout.cpp | 14 ++++---- Goldleaf/Source/ui/ui_UpdateLayout.cpp | 8 +++-- 12 files changed, 89 insertions(+), 34 deletions(-) diff --git a/Goldleaf/Icon.jpg b/Goldleaf/Icon.jpg index 819ea633fd2bfc805b1e2204932bf6e651393230..9de59d868e19dd0327ffc128b936ce4d21758645 100644 GIT binary patch delta 12766 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 delta 12755 zcmbt)XH=8hx^7%77gl1ShyqbjX#z?S6iAi@5fCFa6d?;yib!vvgwIBimL*k+L@CmV zfbqSDs{}iwBWLNbP4cRwGSH6>l?1=V9CPfyvFL>~^V5kBLZ-VC(OiomH2fl6 z2i$6iiJb6-opN8QCX)h*6RI|XO88np`OH3#-SitmnIqKdR`5&YmxvCXAmmZD_ORdN zT8*3a{1Zi=6FK%t-c}@mqJ1&H#y-s5y*U?g!q`%R<_B#wDT>u3e2@_WEGq*})!>3N z_gr;LlW%BdOSYwkOoyDnl*O1Pgw$!(FHh5|zLV3H!?8yjZnN}eLaretnzQI`>fO;O zKf_v$&;`j?`99m5&;L?A*07YhkJhV7^W(%cDXiYeYr%y{$q#2yuBE%Lrwke@5TvE| zJM75n3t!teS$%c^wOB_7WL||_?`x`z=(%cyD6#XsG7udQo8VcXplJ5hFn!v;YGZpL z!%5=iYnr*N>E5{mec3Lq0Zt+lll87RH?HN_S6AZEwdy9x;UwMmu&Ly+eLgRi+if6` z>L&PuZN>%RxErc7ig~LaQfbts(}}~Qy~r)7MizcqmIso##Sa+Zzl4q8WW&|Ia=2jX zDUS~#Rq@cuQCQ1P$%f34ZcdXz86p!|?&nvqP6 zbmh7%7GiPc1P@fUR8u_71NBIqZhXpBdTj8M6-$U?j z9)4&)$=sY1Mrwnk2a2I2<=2^b_u_oD!| z6oQ=r^l$4Og z0qgldJ{pmt5Wj1^9QtnV0iXmSJ->*m*UJR1dej9;rOtZ@E^`$sSV{%%8v8j@E3F-9 z40Xj0HotY?S*Fl%Q)|A`@??5&7&7@L7n+672#w`lFpEY#*n!& zL2 zF%&>coF^tMAnXdJVQRs8-@uc9u;yf5=h5v+Fo8)_daJjpnuW%ZLi?!z754Y8Wt+tb zz26fuy^Og(@Rfa^C@C#8ybxOfnC(U$rF)O+rmTzhiRV7;+c!~I_#)o_3hVEuy0<_6thrhC$5fbBoXzB783j)RGI*e{ifk0J zrB3e!Y2YjJaABlx_3+WIN5={a8X`%v=aW|YXiI6^JMa^-q(aB|Pp@K?O9|kk7oQ#& zSXi`Jc+{001-INT(OD`O2%DQov^cF=ys&PoS4hv;atdDQ2DF+wI6Tls#9V6Abr
&*+Z6GdTtS~N+291pZ#jEs#`65X-mr24L{BwZ^` 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 Callback); void DeleteFile(pu::String Path); void DeleteDirectory(pu::String Path); + void RenameFile(pu::String Old, pu::String New); + void RenameDirectory(pu::String Old, pu::String New); bool IsFileBinary(pu::String Path); void WriteFile(pu::String Path, std::vector Data); u64 GetFileSize(pu::String Path); diff --git a/Goldleaf/Include/hos/hos_Content.hpp b/Goldleaf/Include/hos/hos_Content.hpp index ef4c7910..78c5e966 100644 --- a/Goldleaf/Include/hos/hos_Content.hpp +++ b/Goldleaf/Include/hos/hos_Content.hpp @@ -29,9 +29,17 @@ namespace hos { + struct PendingUpdateVersion + { + u32 Major; + u32 Minor; + u32 Micro; + }; + pu::String ContentIdAsString(const NcmNcaId &ContentId); NcmNcaId StringAsContentId(pu::String ContentId); - SetSysFirmwareVersion GetPendingUpdateInfo(); + bool GetPendingUpdateInfo(PendingUpdateVersion *out); + SetSysFirmwareVersion ConvertPendingUpdateVersion(PendingUpdateVersion ver); void CleanPendingUpdate(); } \ No newline at end of file diff --git a/Goldleaf/Makefile b/Goldleaf/Makefile index 2c21b93b..3fa9fd6e 100644 --- a/Goldleaf/Makefile +++ b/Goldleaf/Makefile @@ -9,7 +9,7 @@ include $(DEVKITPRO)/libnx/switch_rules VER_MAJOR := 0 VER_MINOR := 7 -VER_MICRO := 2 +VER_MICRO := 3 APP_TITLE := Goldleaf APP_AUTHOR := XorTroll diff --git a/Goldleaf/RomFs/MenuBanner.png b/Goldleaf/RomFs/MenuBanner.png index c65d18f31463a208ebc36e2f3c8788e6217ab47e..1321b2baadd0ef68ab244ff47468c873fdbf6c22 100644 GIT binary patch literal 9747 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 + if(gupdated) + { + romfsExit(); + fs::DeleteFile(argv[0]); + fs::RenameFile(TempGoldleafUpdateNro, argv[0]); + } Finalize(); return 0; } \ No newline at end of file diff --git a/Goldleaf/Source/fs/fs_Common.cpp b/Goldleaf/Source/fs/fs_Common.cpp index 54a22022..e42b9548 100644 --- a/Goldleaf/Source/fs/fs_Common.cpp +++ b/Goldleaf/Source/fs/fs_Common.cpp @@ -121,6 +121,18 @@ namespace fs if(exp != NULL) exp->DeleteDirectory(Path); } + void RenameFile(pu::String Old, pu::String New) + { + auto exp = GetExplorerForPath(Old); + if(exp != NULL) exp->RenameFile(Old, New); + } + + void RenameDirectory(pu::String Old, pu::String New) + { + auto exp = GetExplorerForPath(Old); + if(exp != NULL) exp->RenameDirectory(Old, New); + } + bool IsFileBinary(pu::String Path) { if(GetFileSize(Path) == 0) return true; diff --git a/Goldleaf/Source/hos/hos_Common.cpp b/Goldleaf/Source/hos/hos_Common.cpp index 057517c7..38aa45b6 100644 --- a/Goldleaf/Source/hos/hos_Common.cpp +++ b/Goldleaf/Source/hos/hos_Common.cpp @@ -191,20 +191,15 @@ namespace hos u8 ComputeSystemKeyGeneration() { - u8 masterkey = 0; - - MKEY_SET_IF(VERSION_BETWEEN(1,0,0,2,3,0), 0) - MKEY_SET_IF(VERSION_EXACT(3,0,0), 1) - MKEY_SET_IF(VERSION_BETWEEN(3,0,1,3,0,2), 2) - MKEY_SET_IF(VERSION_BETWEEN(4,0,0,4,1,0), 3) - MKEY_SET_IF(VERSION_BETWEEN(5,0,0,5,1,0), 4) - MKEY_SET_IF(VERSION_BETWEEN(6,0,0,6,1,0), 5) - MKEY_SET_IF(VERSION_EXACT(6,2,0), 6) - MKEY_SET_IF(VERSION_BETWEEN(7,0,0,8,0,1), 7) - MKEY_SET_IF(VERSION_EXACT(8,1,0), 8) - MKEY_SET_IF(VERSION_EXACT(9,0,0), 9) - - // KeyGen = MasterKey + 1! - return masterkey + 1; + FsStorage boot0; + auto rc = fsOpenBisStorage(&boot0, FsBisStorageId_Boot0); + if(R_SUCCEEDED(rc)) + { + u32 keygen_ver = 0; + fsStorageRead(&boot0, 0x2330, &keygen_ver, sizeof(u32)); + fsStorageClose(&boot0); + return (u8)keygen_ver; + } + return 0; } } \ No newline at end of file diff --git a/Goldleaf/Source/hos/hos_Content.cpp b/Goldleaf/Source/hos/hos_Content.cpp index d6430007..715567e4 100644 --- a/Goldleaf/Source/hos/hos_Content.cpp +++ b/Goldleaf/Source/hos/hos_Content.cpp @@ -22,6 +22,13 @@ #include #include +#include + +namespace ui +{ + extern MainApplication::Ref mainapp; +} + namespace hos { pu::String ContentIdAsString(const NcmNcaId &NCAId) @@ -45,24 +52,44 @@ namespace hos return nid; } - SetSysFirmwareVersion GetPendingUpdateInfo() + bool GetPendingUpdateInfo(PendingUpdateVersion *out) { auto sys = fs::GetNANDSystemExplorer(); auto ncas = sys->GetFiles("Contents/placehld"); - SetSysFirmwareVersion fwver = {0}; + bool found = false; for(auto &nca: ncas) { std::string path = "@SystemContent://placehld/" + nca.AsUTF8(); path.reserve(FS_MAX_PATH); FsFileSystem ncafs; - auto rc = fsOpenFileSystemWithId(&ncafs, 0x0100000000000809, FsFileSystemType_ContentData, path.c_str()); + auto rc = fsOpenFileSystemWithId(&ncafs, 0, FsFileSystemType_ContentMeta, path.c_str()); if(R_SUCCEEDED(rc)) { - fs::FileSystemExplorer fwfs("gncafwver", "...", &ncafs); - fwfs.ReadFileBlock("file", 0, sizeof(fwver), (u8*)&fwver); - break; + fs::FileSystemExplorer fwfs("gpendupd", "...", &ncafs); + auto fs = fwfs.GetContents(); + for(auto &f: fs) + { + u32 rawver = 0; + fwfs.ReadFileBlock(f, 8, sizeof(u32), (u8*)&rawver); + out->Major = (u8)((rawver >> 26) & 0x3f); + out->Minor = (u8)((rawver >> 20) & 0x3f); + out->Micro = (u8)((rawver >> 16) & 0x3f); + found = true; + break; // We just want to read the first CNMT NCA we succeed mounting :P + } + if(found) break; } } + return found; + } + + SetSysFirmwareVersion ConvertPendingUpdateVersion(PendingUpdateVersion ver) + { + SetSysFirmwareVersion fwver = {}; + fwver.major = ver.Major; + fwver.minor = ver.Minor; + fwver.micro = ver.Micro; + sprintf(fwver.display_version, "%d.%d.%d", ver.Major, ver.Minor, ver.Micro); return fwver; } diff --git a/Goldleaf/Source/ui/ui_SettingsLayout.cpp b/Goldleaf/Source/ui/ui_SettingsLayout.cpp index 7cab0dd9..64f9eed0 100644 --- a/Goldleaf/Source/ui/ui_SettingsLayout.cpp +++ b/Goldleaf/Source/ui/ui_SettingsLayout.cpp @@ -116,14 +116,14 @@ namespace ui pu::String msg = set::GetDictionaryEntry(362) + ":\n"; msg += pu::String("\n" + set::GetDictionaryEntry(363) + ": ") + fwver.display_version + " (" + fwver.display_title + ")"; msg += pu::String("\n" + set::GetDictionaryEntry(364) + ": '") + fwver.version_hash + "'"; + msg += pu::String("\n" + set::GetDictionaryEntry(95) + " ") + std::to_string(hos::ComputeSystemKeyGeneration()); msg += "\n\n" + set::GetDictionaryEntry(365) + ":\n"; - auto basefw = fwver; - fwver = hos::GetPendingUpdateInfo(); - bool pendingpresent = ((fwver.major != 0) && (fwver.display_title[0] != '\0')); + hos::PendingUpdateVersion pupd = {}; + bool pendingpresent = hos::GetPendingUpdateInfo(&pupd); + auto pendfwver = hos::ConvertPendingUpdateVersion(pupd); if(pendingpresent) { - msg += pu::String("\n" + set::GetDictionaryEntry(363) + ": ") + fwver.display_version + " (" + fwver.display_title + ")"; - msg += pu::String("\n" + set::GetDictionaryEntry(364) + ": '") + fwver.version_hash + "'"; + msg += pu::String("\n" + set::GetDictionaryEntry(363) + ": ") + std::to_string(pupd.Major) + "." + std::to_string(pupd.Minor) + "." + std::to_string(pupd.Micro); msg += "\n" + set::GetDictionaryEntry(366); } else msg += "\n" + set::GetDictionaryEntry(367); @@ -137,7 +137,7 @@ namespace ui auto sopt = mainapp->CreateShowDialog(set::GetDictionaryEntry(360), msg, opts, false); if(sopt == 0) return; - else if(sopt == 1) this->HandleUpdate("Contents/registered", basefw); + else if(sopt == 1) this->HandleUpdate("Contents/registered", fwver); else if(sopt == 2) { auto sopt = mainapp->CreateShowDialog(set::GetDictionaryEntry(371), set::GetDictionaryEntry(372) + "\n" + set::GetDictionaryEntry(373), { set::GetDictionaryEntry(111), set::GetDictionaryEntry(18) }, true); @@ -147,7 +147,7 @@ namespace ui mainapp->ShowNotification(set::GetDictionaryEntry(374)); } } - else if(sopt == 3) this->HandleUpdate("Contents/placehld", fwver); + else if(sopt == 3) this->HandleUpdate("Contents/placehld", pendfwver); } void SettingsLayout::optsMemory_Click() diff --git a/Goldleaf/Source/ui/ui_UpdateLayout.cpp b/Goldleaf/Source/ui/ui_UpdateLayout.cpp index 93c651da..47edf65c 100644 --- a/Goldleaf/Source/ui/ui_UpdateLayout.cpp +++ b/Goldleaf/Source/ui/ui_UpdateLayout.cpp @@ -23,6 +23,7 @@ #include extern set::Settings gsets; +extern bool gupdated; namespace ui { @@ -41,7 +42,7 @@ namespace ui void UpdateLayout::StartUpdateSearch() { - if(!net::HasConnection()) + if((!net::HasConnection()) || gupdated) { mainapp->CreateShowDialog(set::GetDictionaryEntry(284), set::GetDictionaryEntry(304), { set::GetDictionaryEntry(234) }, true); mainapp->UnloadMenuData(); @@ -69,16 +70,17 @@ namespace ui { std::string baseurl = "https://github.com/XorTroll/Goldleaf/releases/download/" + latestid + "/Goldleaf"; fs::CreateDirectory("sdmc:/switch/Goldleaf"); - fs::DeleteFile("sdmc:/switch/Goldleaf/Goldleaf.nro"); + fs::DeleteFile(TempGoldleafUpdateNro); this->infoText->SetText(set::GetDictionaryEntry(309)); mainapp->CallForRender(); this->downloadBar->SetVisible(true); - net::RetrieveToFile(baseurl + ".nro", "sdmc:/switch/Goldleaf/Goldleaf.nro", [&](double Done, double Total) + net::RetrieveToFile(baseurl + ".nro", TempGoldleafUpdateNro, [&](double Done, double Total) { this->downloadBar->SetMaxValue(Total); this->downloadBar->SetProgress(Done); mainapp->CallForRender(); }); + if(fs::IsFile(TempGoldleafUpdateNro)) gupdated = true; this->downloadBar->SetVisible(false); mainapp->CallForRender(); sopt = mainapp->CreateShowDialog(set::GetDictionaryEntry(284), set::GetDictionaryEntry(310), { set::GetDictionaryEntry(111), set::GetDictionaryEntry(18) }, true);