Implemented missing code sections

This commit is contained in:
Nicola 2024-11-14 11:54:33 +01:00
parent 4f5af0ecf3
commit 9e921ae5c8
3 changed files with 85 additions and 43 deletions

View File

@ -8,7 +8,6 @@ using LibHac.Tools.Fs;
using LibHac.Tools.FsSystem; using LibHac.Tools.FsSystem;
using LibHac.Tools.FsSystem.NcaUtils; using LibHac.Tools.FsSystem.NcaUtils;
using LibHac.Tools.Ncm; using LibHac.Tools.Ncm;
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using Ryujinx.Common.Utilities; using Ryujinx.Common.Utilities;
@ -22,6 +21,7 @@ using System.IO;
using System.IO.Compression; using System.IO.Compression;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using Path = System.IO.Path; using Path = System.IO.Path;
namespace Ryujinx.HLE.FileSystem namespace Ryujinx.HLE.FileSystem
@ -475,19 +475,14 @@ namespace Ryujinx.HLE.FileSystem
FinishInstallation(temporaryDirectory, registeredDirectory); FinishInstallation(temporaryDirectory, registeredDirectory);
} }
public void InstallKeys(string keysSource) public void InstallKeys(string keysSource, string installDirectory)
{ {
string systemDirectory = AppDataManager.KeysDirPath;
//if(AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile)
//{
// systemDirectory = AppDataManager.KeysDirPathUser;
//}
if (Directory.Exists(keysSource)) if (Directory.Exists(keysSource))
{ {
foreach (var filePath in Directory.EnumerateFiles(keysSource, "*.keys")) foreach (var filePath in Directory.EnumerateFiles(keysSource, "*.keys"))
{ {
File.Copy(filePath, Path.Combine(systemDirectory, Path.GetFileName(filePath)), true); VerifyKeysFile(filePath);
File.Copy(filePath, Path.Combine(installDirectory, Path.GetFileName(filePath)), true);
} }
return; return;
@ -507,24 +502,47 @@ namespace Ryujinx.HLE.FileSystem
case ".zip": case ".zip":
using (ZipArchive archive = ZipFile.OpenRead(keysSource)) using (ZipArchive archive = ZipFile.OpenRead(keysSource))
{ {
InstallKeysFromZip(archive, installDirectory);
foreach (var entry in archive.Entries)
{
if (Path.GetExtension(entry.FullName).Equals(".keys", StringComparison.OrdinalIgnoreCase))
{
entry.ExtractToFile(Path.Combine(systemDirectory, entry.Name), overwrite: true);
}
}
} }
break; break;
case ".keys": case ".keys":
File.Copy(keysSource, Path.Combine(systemDirectory, info.Name), true); VerifyKeysFile(keysSource);
File.Copy(keysSource, Path.Combine(installDirectory, info.Name), true);
break; break;
default: default:
throw new InvalidFirmwarePackageException("Input file is not a valid key package"); throw new InvalidFirmwarePackageException("Input file is not a valid key package");
} }
} }
private void InstallKeysFromZip(ZipArchive archive, string installDirectory)
{
string temporaryDirectory = Path.Combine(installDirectory, "temp");
if (Directory.Exists(temporaryDirectory))
{
Directory.Delete(temporaryDirectory, true);
}
Directory.CreateDirectory(temporaryDirectory);
foreach (var entry in archive.Entries)
{
if (Path.GetExtension(entry.FullName).Equals(".keys", StringComparison.OrdinalIgnoreCase))
{
string extractDestination = Path.Combine(temporaryDirectory, entry.Name);
entry.ExtractToFile(extractDestination, overwrite: true);
try
{
VerifyKeysFile(extractDestination);
File.Move(extractDestination, Path.Combine(installDirectory, entry.Name), true);
}
catch (Exception)
{
Directory.Delete(temporaryDirectory, true);
throw;
}
}
}
Directory.Delete(temporaryDirectory, true);
}
private void FinishInstallation(string temporaryDirectory, string registeredDirectory) private void FinishInstallation(string temporaryDirectory, string registeredDirectory)
{ {
if (Directory.Exists(registeredDirectory)) if (Directory.Exists(registeredDirectory))
@ -999,20 +1017,41 @@ namespace Ryujinx.HLE.FileSystem
return null; return null;
} }
public bool AreKeysAlredyPresent() public void VerifyKeysFile(string filePath)
{ {
if (!File.Exists(Path.Combine(AppDataManager.KeysDirPath, "prod.keys")) && !File.Exists(Path.Combine(AppDataManager.KeysDirPath, "title.keys"))) string schemaPattern = @"^[a-zA-Z0-9_]+ = [a-zA-Z0-9]+$";
if (File.Exists(filePath))
{ {
if (AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && (File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "prod.keys")) || File.Exists(Path.Combine(AppDataManager.KeysDirPathUser, "title.keys")))) // Read all lines from the file
string[] lines = File.ReadAllLines(filePath);
for (int i = 0; i < lines.Length; i++)
{ {
return true; string line = lines[i].Trim();
// Check if the line matches the schema
if (!Regex.IsMatch(line, schemaPattern))
{
throw new FormatException("Keys file doesn't have a correct schema.");
} }
} }
else } else
{ {
return true; throw new FileNotFoundException("Keys file not found at " + filePath);
}
} }
public bool AreKeysAlredyPresent(string pathToCheck)
{
string[] fileNames = { "prod.keys", "title.keys", "console.keys" };
foreach (var file in fileNames)
{
if (File.Exists(Path.Combine(pathToCheck, file)))
{
return true;
}
}
return false; return false;
} }
} }

View File

@ -507,10 +507,10 @@
"DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDo you want to continue?", "DialogFirmwareInstallerFirmwareInstallConfirmMessage": "\n\nDo you want to continue?",
"DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installing firmware...", "DialogFirmwareInstallerFirmwareInstallWaitMessage": "Installing firmware...",
"DialogFirmwareInstallerFirmwareInstallSuccessMessage": "System version {0} successfully installed.", "DialogFirmwareInstallerFirmwareInstallSuccessMessage": "System version {0} successfully installed.",
"DialogKeysInstallerKeysNotFoundErrorMessage": "A valid Keys file was not found in {0}.", "DialogKeysInstallerKeysNotFoundErrorMessage": "An invalid Keys file was found in {0}",
"DialogKeysInstallerKeysInstallTitle": "Install Keys", "DialogKeysInstallerKeysInstallTitle": "Install Keys",
"DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.", "DialogKeysInstallerKeysInstallMessage": "New Keys file will be installed.",
"DialogKeysInstallerKeysInstallSubMessage": "\n\nThis will replace some of the current installed Keys.", "DialogKeysInstallerKeysInstallSubMessage": "\n\nThis may replace some of the current installed Keys.",
"DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?", "DialogKeysInstallerKeysInstallConfirmMessage": "\n\nDo you want to continue?",
"DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...", "DialogKeysInstallerKeysInstallWaitMessage": "Installing Keys...",
"DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.", "DialogKeysInstallerKeysInstallSuccessMessage": "New Keys file successfully installed.",

View File

@ -1184,19 +1184,16 @@ namespace Ryujinx.Ava.UI.ViewModels
{ {
try try
{ {
//bool isValidKeysFilke = true; string systemDirectory = AppDataManager.KeysDirPath;
if (AppDataManager.Mode == AppDataManager.LaunchMode.UserProfile && Directory.Exists(AppDataManager.KeysDirPathUser))
//if (!isValidKeysFilke) {
//{ systemDirectory = AppDataManager.KeysDirPathUser;
// await ContentDialogHelper.CreateErrorDialog(LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysNotFoundErrorMessage, filename)); }
// return;
//}
string dialogTitle = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallTitle); string dialogTitle = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallTitle);
string dialogMessage = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallMessage); string dialogMessage = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallMessage);
bool alreadyKesyInstalled = ContentManager.AreKeysAlredyPresent(); bool alreadyKesyInstalled = ContentManager.AreKeysAlredyPresent(systemDirectory);
if (alreadyKesyInstalled) if (alreadyKesyInstalled)
{ {
dialogMessage += LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallSubMessage); dialogMessage += LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysInstallSubMessage);
@ -1226,7 +1223,7 @@ namespace Ryujinx.Ava.UI.ViewModels
try try
{ {
ContentManager.InstallKeys(filename); ContentManager.InstallKeys(filename, systemDirectory);
Dispatcher.UIThread.InvokeAsync(async delegate Dispatcher.UIThread.InvokeAsync(async delegate
{ {
@ -1250,7 +1247,13 @@ namespace Ryujinx.Ava.UI.ViewModels
{ {
waitingDialog.Close(); waitingDialog.Close();
await ContentDialogHelper.CreateErrorDialog(ex.Message); string message = ex.Message;
if(ex is FormatException)
{
message = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.DialogKeysInstallerKeysNotFoundErrorMessage, filename);
}
await ContentDialogHelper.CreateErrorDialog(message);
}); });
} }
finally finally