diff --git a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs index 97c15ec..fd83e45 100644 --- a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs +++ b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs @@ -181,8 +181,8 @@ namespace AM2RLauncher ProfileXML prof = Serializer.Deserialize(File.ReadAllText(dir.FullName + "/profile.xml")); if (prof.Installable == true || IsProfileInstalled(prof)) // Safety check for non-installable profiles { - profileList.Add(Serializer.Deserialize(File.ReadAllText(dir.FullName + "/profile.xml"))); - profileList[profileList.Count - 1].DataPath = "/Mods/" + dir.Name; + prof.DataPath = "/Mods/" + dir.Name; + profileList.Add(prof); } else if (!IsProfileInstalled(prof)) // if not installable and isn't installed, remove it { @@ -1077,6 +1077,7 @@ namespace AM2RLauncher { const string d3dHash = "86e39e9161c3d930d93822f1563c280d"; const string dataWinHash = "f2b84fe5ba64cb64e284be1066ca08ee"; + const string am2rHash = "15253f7a66d6ea3feef004ebbee9b438"; string tmpPath = Path.GetTempPath() + Path.GetFileNameWithoutExtension(zipPath); @@ -1084,24 +1085,38 @@ namespace AM2RLauncher if (Directory.Exists(tmpPath)) Directory.Delete(tmpPath, true); - //extract zip to tmp path first - ZipFile.ExtractToDirectory(zipPath, tmpPath); + Directory.CreateDirectory(tmpPath); - // If the game is packed into a subfolder, throw error for that - if (Directory.GetDirectories(tmpPath).Length == 1 && new DirectoryInfo(Directory.GetDirectories(tmpPath).First()).Name != "lang") - return IsZipAM2R11ReturnCodes.GameIsInASubfolder; + //open archive + ZipArchive am2rZip = ZipFile.OpenRead(zipPath); - // check if exe exists - if (!File.Exists(tmpPath + "/AM2R.exe")) - return IsZipAM2R11ReturnCodes.MissingAM2RExe; + // Check if exe exists anywhere + ZipArchiveEntry am2rExe = am2rZip.Entries.FirstOrDefault(x => x.FullName.Contains("AM2R.exe")); + if (am2rExe == null) + return IsZipAM2R11ReturnCodes.MissingOrInvalidAM2RExe; + // Check if it's not in a subfolder. if it'd be in a subfolder, fullname would be "folder/AM2R.exe" + if (am2rExe.FullName != "AM2R.exe") + return IsZipAM2R11ReturnCodes.GameIsInASubfolder; + // Check validity + am2rExe.ExtractToFile(tmpPath + "/" + am2rExe.FullName); + if (HelperMethods.CalculateMD5(tmpPath + "/" + am2rExe.FullName) != am2rHash) + return IsZipAM2R11ReturnCodes.MissingOrInvalidAM2RExe; + + // Check if data.win exists / is valid + ZipArchiveEntry dataWin = am2rZip.Entries.FirstOrDefault(x => x.FullName == "data.win"); + if (dataWin == null) + return IsZipAM2R11ReturnCodes.MissingOrInvalidDataWin; + dataWin.ExtractToFile(tmpPath + "/" + dataWin.FullName); + if (HelperMethods.CalculateMD5(tmpPath + "/" + dataWin.FullName) != dataWinHash) + return IsZipAM2R11ReturnCodes.MissingOrInvalidDataWin; - // check if d3d.dll exists, then check the hash of d3d.dll - if (HelperMethods.CalculateMD5(tmpPath + "/D3DX9_43.dll") != d3dHash) + // Check if d3d.dll exists / is valid + ZipArchiveEntry d3dx = am2rZip.Entries.FirstOrDefault(x => x.FullName == "D3DX9_43.dll"); + if (d3dx == null) + return IsZipAM2R11ReturnCodes.MissingOrInvalidD3DX9_43Dll; + d3dx.ExtractToFile(tmpPath + "/" + d3dx.FullName); + if (HelperMethods.CalculateMD5(tmpPath + "/" + d3dx.FullName) != d3dHash) return IsZipAM2R11ReturnCodes.MissingOrInvalidD3DX9_43Dll; - - // check if data.win exists and check its hash - if (HelperMethods.CalculateMD5(tmpPath + "/data.win") != dataWinHash) - return IsZipAM2R11ReturnCodes.MissingOrInvalidDataWin; // clean up Directory.Delete(tmpPath, true); diff --git a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs index ba2c65a..e540e48 100644 --- a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs +++ b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs @@ -55,7 +55,7 @@ namespace AM2RLauncher enum IsZipAM2R11ReturnCodes { Successful, - MissingAM2RExe, + MissingOrInvalidAM2RExe, MissingOrInvalidD3DX9_43Dll, MissingOrInvalidDataWin, GameIsInASubfolder @@ -138,8 +138,7 @@ namespace AM2RLauncher // Log distro and version (if it exists) if (Platform.IsGtk) { - string osRelease = ""; - osRelease = File.ReadAllText("/etc/os-release"); + string osRelease = File.ReadAllText("/etc/os-release"); Regex lineRegex = new Regex(".*=.*"); var results = lineRegex.Matches(osRelease).Cast(); var version = results.FirstOrDefault(x => x.Value.Contains("VERSION"));