diff --git a/UpTool2/DownloadDialog.cs b/UpTool2/DownloadDialog.cs index 2c724c6..9571619 100644 --- a/UpTool2/DownloadDialog.cs +++ b/UpTool2/DownloadDialog.cs @@ -41,6 +41,5 @@ namespace UpTool2 private void progressChanged(object sender, DownloadProgressChangedEventArgs e) => progressBar.Value = e.ProgressPercentage; private void DownloadDialog_FormClosing(object sender, FormClosingEventArgs e) => e.Cancel = !close; - } } diff --git a/UpTool2/Program.cs b/UpTool2/Program.cs index bf46aaf..62e94ac 100644 --- a/UpTool2/Program.cs +++ b/UpTool2/Program.cs @@ -13,43 +13,20 @@ using System.Xml.Linq; using System.Drawing; using System.Linq; using System.Collections.Generic; +using System.Xml; namespace UpTool2 { static class Program { public static Form splash; + public static bool online; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - splash = new Form - { - StartPosition = FormStartPosition.CenterScreen, - FormBorderStyle = FormBorderStyle.None, - ControlBox = false, - MaximizeBox = false, - MinimizeBox = false, - ShowIcon = false, - ShowInTaskbar = false, - Size = new Size(700, 400), - ForeColor = Color.Green, - TopMost = true - }; - splash.MaximumSize = splash.Size; - splash.MinimumSize = splash.Size; - Label splashL = new Label - { - AutoSize = false, - Dock = DockStyle.Fill, - TextAlign = ContentAlignment.MiddleCenter, - Text = "Loading", - Font = new Font(FontFamily.GenericSansSerif, 40) - }; - splash.Controls.Add(splashL); - splash.Show(); - splash.BringToFront(); + showSplash(); string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString(); string mutexId = string.Format("Global\\{{{0}}}", appGuid); bool createdNew; @@ -80,49 +57,10 @@ namespace UpTool2 if (!Directory.Exists(dir + @"\Apps")) Directory.CreateDirectory(dir + @"\Apps"); string xml = dir + @"\info.xml"; + fixXML(xml); string metaXml = "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Meta.xml"; - if ((!File.Exists(xml)) || XDocument.Load(xml).Element("meta") == null) - new XElement("meta", new XElement("Version", 0), new XElement("Repos", new XElement("Repo", new XElement("Name", "UpTool2 official Repo"), new XElement("Link", "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml"))), new XElement("LocalRepo")).Save(xml); - else - { - XDocument x = XDocument.Load(xml); - XElement meta = x.Element("meta"); - if (XDocument.Load(xml).Element("meta").Element("Repos") == null || XDocument.Load(xml).Element("meta").Element("Repos").Elements("Repo").Count() == 0) - { - meta.Add(new XElement("Repos", new XElement("Repo", new XElement("Name", "UpTool2 official Repo"), new XElement("Link", "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml")))); - meta.Add(new XElement("LocalRepo")); - } - else - { - XElement repos = meta.Element("Repos"); - IEnumerable reposa = repos.Elements("Repo"); - reposa.Select(s => s.Element("Link")).Where(s => s.Value == "https://github.com/CreepyCrafter24/UpTool2/releases/download/Repo/Repo.xml").ToList().ForEach(s => s.Value = "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml"); - } - x.Save(xml); - } online = Ping(metaXml); - if (online) - { - XElement meta = XDocument.Load(metaXml).Element("meta"); - int version = int.Parse(meta.Element("Version").Value); - if (int.Parse(XDocument.Load(xml).Element("meta").Element("Version").Value) < version) - { - if (new DownloadDialog(meta.Element("File").Value, dir + @"\update.exe").ShowDialog() != DialogResult.OK) - throw new Exception("Failed to update"); - using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) - { - string pkghash = BitConverter.ToString(sha256.ComputeHash(File.ReadAllBytes(dir + @"\update.exe"))).Replace("-", string.Empty).ToUpper(); - if (pkghash != meta.Element("Hash").Value.ToUpper()) - throw new Exception("The hash is not equal to the one stored in the repo:\r\nPackage: " + pkghash + "\r\nOnline: " + meta.Element("Hash").Value.ToUpper()); - } - new XElement("meta", new XElement("Version", version)).Save(xml); - splash.Hide(); - Process.Start(new ProcessStartInfo { FileName = "cmd.exe", Arguments = "/C timeout /t 2 & copy /b/v/y \"" + dir + @"\update.exe" + "\" \"" + Application.ExecutablePath + "\" & \"" + Application.ExecutablePath + "\"", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }); - } - else - Application.Run(new MainForm()); - } - else + if (!online || updateCheck(dir, xml, metaXml)) Application.Run(new MainForm()); #if !DEBUG } @@ -139,6 +77,88 @@ namespace UpTool2 } } + static void showSplash() + { + splash = new Form + { + StartPosition = FormStartPosition.CenterScreen, + FormBorderStyle = FormBorderStyle.None, + ControlBox = false, + MaximizeBox = false, + MinimizeBox = false, + ShowIcon = false, + ShowInTaskbar = false, + Size = new Size(700, 400), + ForeColor = Color.Green, + TopMost = true + }; + splash.MaximumSize = splash.Size; + splash.MinimumSize = splash.Size; + Label splashL = new Label + { + AutoSize = false, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleCenter, + Text = "Loading", + Font = new Font(FontFamily.GenericSansSerif, 40) + }; + splash.Controls.Add(splashL); + splash.Show(); + splash.BringToFront(); + } + + static void fixXML(string xml) + { + try + { + if ((!File.Exists(xml)) || XDocument.Load(xml).Element("meta") == null) + new XElement("meta", new XElement("Version", 0), new XElement("Repos", new XElement("Repo", new XElement("Name", "UpTool2 official Repo"), new XElement("Link", "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml"))), new XElement("LocalRepo")).Save(xml); + else + { + XDocument x = XDocument.Load(xml); + XElement meta = x.Element("meta"); + if (XDocument.Load(xml).Element("meta").Element("Repos") == null || XDocument.Load(xml).Element("meta").Element("Repos").Elements("Repo").Count() == 0) + { + meta.Add(new XElement("Repos", new XElement("Repo", new XElement("Name", "UpTool2 official Repo"), new XElement("Link", "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml")))); + meta.Add(new XElement("LocalRepo")); + } + else + { + XElement repos = meta.Element("Repos"); + IEnumerable reposa = repos.Elements("Repo"); + reposa.Select(s => s.Element("Link")).Where(s => s.Value == "https://github.com/CreepyCrafter24/UpTool2/releases/download/Repo/Repo.xml").ToList().ForEach(s => s.Value = "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml"); + } + x.Save(xml); + } + } + catch (XmlException) + { + new XElement("meta", new XElement("Version", 0), new XElement("Repos", new XElement("Repo", new XElement("Name", "UpTool2 official Repo"), new XElement("Link", "https://raw.githubusercontent.com/CreepyCrafter24/UpTool2/master/Repo.xml"))), new XElement("LocalRepo")).Save(xml); + } + } + + static bool updateCheck(string dir, string xml, string metaXml) + { + XElement meta = XDocument.Load(metaXml).Element("meta"); + int version = int.Parse(meta.Element("Version").Value); + if (int.Parse(XDocument.Load(xml).Element("meta").Element("Version").Value) < version) + { + if (new DownloadDialog(meta.Element("File").Value, dir + @"\update.exe").ShowDialog() != DialogResult.OK) + throw new Exception("Failed to update"); + using (SHA256CryptoServiceProvider sha256 = new SHA256CryptoServiceProvider()) + { + string pkghash = BitConverter.ToString(sha256.ComputeHash(File.ReadAllBytes(dir + @"\update.exe"))).Replace("-", string.Empty).ToUpper(); + if (pkghash != meta.Element("Hash").Value.ToUpper()) + throw new Exception("The hash is not equal to the one stored in the repo:\r\nPackage: " + pkghash + "\r\nOnline: " + meta.Element("Hash").Value.ToUpper()); + } + new XElement("meta", new XElement("Version", version)).Save(xml); + splash.Hide(); + Process.Start(new ProcessStartInfo { FileName = "cmd.exe", Arguments = "/C timeout /t 2 & copy /b/v/y \"" + dir + @"\update.exe" + "\" \"" + Application.ExecutablePath + "\" & \"" + Application.ExecutablePath + "\"", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }); + return false; + } + return true; + } + public static bool Ping(string url) { try @@ -158,6 +178,5 @@ namespace UpTool2 return false; } } - public static bool online; } }