/// <summary> /// Initializes a new instance of the <see cref="IronyAppCast" /> class. /// </summary> /// <param name="isInstallerVersion">if set to <c>true</c> [is installer version].</param> /// <param name="updaterService">The updater service.</param> public IronyAppCast(bool isInstallerVersion, IUpdaterService updaterService) : base() { appCast = new XMLAppCast(); IsInstallerVersion = isInstallerVersion; this.updaterService = updaterService; }
/// <summary> /// Runs the specified opts. /// </summary> /// <param name="opts">The opts.</param> private static void Run(Options opts) { // Really really lacks documentation _signatureManager.SetStorageDirectory(opts.KeyLocation); Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory; if (opts.Export) { Console.WriteLine("Private Key:"); Console.WriteLine(Convert.ToBase64String(_signatureManager.GetPrivateKey())); Console.WriteLine("Public Key:"); Console.WriteLine(Convert.ToBase64String(_signatureManager.GetPublicKey())); return; } if (opts.GenerateKeys) { var didSucceed = _signatureManager.Generate(opts.ForceRegeneration); if (didSucceed) { Console.WriteLine("Keys successfully generated", Color.Green); } else { Console.WriteLine("Keys failed to generate", Color.Red); } return; } if (opts.BinaryToSign != null) { var signature = _signatureManager.GetSignatureForFile(new FileInfo(opts.BinaryToSign)); Console.WriteLine($"Signature: {signature}", Color.Green); return; } if (opts.BinaryToVerify != null) { var result = _signatureManager.VerifySignature(new FileInfo(opts.BinaryToVerify), opts.Signature); if (result) { Console.WriteLine($"Signature valid", Color.Green); } else { Console.WriteLine($"Signature invalid", Color.Red); } return; } List <string> binaries = new List <string>(); foreach (var item in opts.Extension.Split(",", StringSplitOptions.RemoveEmptyEntries)) { var search = $"*.{item}"; if (opts.SourceBinaryDirectory == ".") { opts.SourceBinaryDirectory = Environment.CurrentDirectory; } var files = Directory.GetFiles(opts.SourceBinaryDirectory, search); if (files.Length == 0) { Console.WriteLine($"No files founds matching {search} in {opts.SourceBinaryDirectory}", Color.Yellow); Environment.Exit(1); } binaries.AddRange(files); } var outputDirectory = opts.SourceBinaryDirectory; Console.WriteLine(""); Console.WriteLine($"Searching: {opts.SourceBinaryDirectory}", Color.Blue); Console.WriteLine($"Found {binaries.Count()} {opts.Extension} files(s)", Color.Blue); Console.WriteLine(""); try { var items = new List <AppCastItem>(); var hasChangelog = File.Exists(opts.ChangeLogPath); var verFileInfo = new FileInfo(Path.Combine(opts.VersionExtractionPath, "IronyModManager.exe")); var versionInfo = GetVersionFromAssembly(verFileInfo); var titleVersionInfo = GetTitleVersionFromAssembly(verFileInfo); foreach (var binary in binaries) { var fileInfo = new FileInfo(binary); var remoteUpdateFile = $"{opts.BaseUrl}/{(opts.PrefixVersion ? $"v{titleVersionInfo}/" : "")}{HttpUtility.UrlEncode(fileInfo.Name)}"; string os = string.Empty; if (binary.Contains("win", StringComparison.OrdinalIgnoreCase)) { os = "windows"; } else if (binary.Contains("linux", StringComparison.OrdinalIgnoreCase)) { os = "linux"; } else if (binary.Contains("osx", StringComparison.OrdinalIgnoreCase)) { os = "osx"; } // var item = new AppCastItem() { Title = titleVersionInfo, DownloadLink = remoteUpdateFile, Version = versionInfo, ShortVersion = versionInfo.Substring(0, versionInfo.LastIndexOf('.')), PublicationDate = fileInfo.CreationTime, UpdateSize = fileInfo.Length, Description = "", DownloadSignature = _signatureManager.KeysExist() ? _signatureManager.GetSignatureForFile(fileInfo) : null, OperatingSystemString = os, MIMEType = MimeTypes.GetMimeType(fileInfo.Name) }; if (hasChangelog) { item.Description = File.ReadAllText(opts.ChangeLogPath); } items.Add(item); } var appcastXmlDocument = XMLAppCast.GenerateAppCastXml(items, "Irony Mod Manager"); var appcastFileName = Path.Combine(outputDirectory, opts.AppCastFileName); var dirName = Path.GetDirectoryName(appcastFileName); if (!Directory.Exists(dirName)) { Console.WriteLine("Creating {0}", dirName); Directory.CreateDirectory(dirName); } Console.WriteLine("Writing appcast to {0}", appcastFileName); using (var w = XmlWriter.Create(appcastFileName, new XmlWriterSettings { NewLineChars = "\n", Encoding = new UTF8Encoding(false) })) { appcastXmlDocument.Save(w); } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(); Environment.Exit(1); } }
static void Run(Options opts) { /* * if (opts.GithubAtomFeed != null) * { * GenerateFromAtom(opts); * return; * }*/ if (opts.ShowExtendedExamples) { PrintExtendedExamples(); return; } if (!string.IsNullOrWhiteSpace(opts.PathToKeyFiles)) { _signatureManager.SetStorageDirectory(opts.PathToKeyFiles); } if (opts.Export) { Console.WriteLine("Private Key:"); Console.WriteLine(Convert.ToBase64String(_signatureManager.GetPrivateKey())); Console.WriteLine("Public Key:"); Console.WriteLine(Convert.ToBase64String(_signatureManager.GetPublicKey())); return; } if (opts.GenerateKeys) { var didSucceed = _signatureManager.Generate(opts.ForceRegeneration); if (didSucceed) { Console.WriteLine("Keys successfully generated", Color.Green); } else { Console.WriteLine("Keys failed to generate", Color.Red); } return; } if (opts.BinaryToSign != null) { var signature = _signatureManager.GetSignatureForFile(new FileInfo(opts.BinaryToSign)); Console.WriteLine($"Signature: {signature}", Color.Green); return; } if (opts.BinaryToVerify != null) { var result = _signatureManager.VerifySignature(new FileInfo(opts.BinaryToVerify), opts.Signature); if (result) { Console.WriteLine($"Signature valid", Color.Green); } else { Console.WriteLine($"Signature invalid", Color.Red); } return; } var search = $"*.{opts.Extension}"; if (opts.SourceBinaryDirectory == ".") { opts.SourceBinaryDirectory = Environment.CurrentDirectory; } var binaries = Directory.GetFiles(opts.SourceBinaryDirectory, search, opts.SearchBinarySubDirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); if (binaries.Length == 0) { Console.WriteLine($"No files founds matching {search} in {opts.SourceBinaryDirectory}", Color.Yellow); Environment.Exit(1); } if (!_operatingSystems.Any(opts.OperatingSystem.Contains)) { Console.WriteLine($"Invalid operating system: {opts.OperatingSystem}", Color.Red); Console.WriteLine($"Valid options are: {0}", string.Join(", ", _operatingSystems)); Environment.Exit(1); } if (string.IsNullOrEmpty(opts.OutputDirectory)) { opts.OutputDirectory = opts.SourceBinaryDirectory; } Console.WriteLine(""); Console.WriteLine($"Operating System: {opts.OperatingSystem}", Color.LightBlue); Console.WriteLine($"Searching: {opts.SourceBinaryDirectory}", Color.LightBlue); Console.WriteLine($"Found {binaries.Count()} {opts.Extension} files(s)", Color.LightBlue); Console.WriteLine(""); try { var productName = opts.ProductName; var items = new List <AppCastItem>(); var usesChangelogs = !string.IsNullOrWhiteSpace(opts.ChangeLogPath) && Directory.Exists(opts.ChangeLogPath); foreach (var binary in binaries) { string version = null; var fileInfo = new FileInfo(binary); if (opts.FileExtractVersion) { version = GetVersionFromName(fileInfo); } else { version = GetVersionFromAssembly(fileInfo); } if (version == null) { Console.WriteLine($"Unable to determine version of binary {fileInfo.Name}, try -f parameter"); Environment.Exit(1); } var productVersion = version; var itemTitle = string.IsNullOrWhiteSpace(productName) ? productVersion : productName + " " + productVersion; var urlEncodedFileName = HttpUtility.UrlEncode(fileInfo.Name); var urlToUse = !string.IsNullOrWhiteSpace(opts.BaseUrl?.ToString()) ? (opts.BaseUrl.ToString().EndsWith("/") ? opts.BaseUrl.ToString() : opts.BaseUrl + "/") : ""; if (opts.PrefixVersion) { urlToUse += $"{version}/"; } if (urlEncodedFileName.StartsWith("/") && urlEncodedFileName.Length > 1) { urlEncodedFileName = urlEncodedFileName.Substring(1); } var remoteUpdateFile = $"{urlToUse}{urlEncodedFileName}"; // changelog stuff var changelogFileName = productVersion + ".md"; var changelogPath = Path.Combine(opts.ChangeLogPath, changelogFileName); var hasChangelogForFile = usesChangelogs && File.Exists(changelogPath); var changelogSignature = ""; if (hasChangelogForFile) { changelogSignature = _signatureManager.GetSignatureForFile(changelogPath); } // var item = new AppCastItem() { Title = itemTitle?.Trim(), DownloadLink = remoteUpdateFile?.Trim(), Version = productVersion?.Trim(), ShortVersion = productVersion?.Substring(0, productVersion.LastIndexOf('.'))?.Trim(), PublicationDate = fileInfo.CreationTime, UpdateSize = fileInfo.Length, Description = "", DownloadSignature = _signatureManager.KeysExist() ? _signatureManager.GetSignatureForFile(fileInfo) : null, OperatingSystemString = opts.OperatingSystem?.Trim(), MIMEType = MimeTypes.GetMimeType(fileInfo.Name) }; if (hasChangelogForFile) { if (!string.IsNullOrWhiteSpace(opts.ChangeLogUrl)) { item.ReleaseNotesSignature = changelogSignature; var changeLogUrlBase = opts.ChangeLogUrl.EndsWith("/") || changelogFileName.StartsWith("/") ? opts.ChangeLogUrl : opts.ChangeLogUrl + "/"; item.ReleaseNotesLink = (opts.ChangeLogUrl + changelogFileName).Trim(); } else { item.Description = File.ReadAllText(changelogPath).Trim(); } } items.Add(item); } var appcastXmlDocument = XMLAppCast.GenerateAppCastXml(items, productName); var appcastFileName = Path.Combine(opts.OutputDirectory, "appcast.xml"); var dirName = Path.GetDirectoryName(appcastFileName); if (!Directory.Exists(dirName)) { Console.WriteLine("Creating {0}", dirName); Directory.CreateDirectory(dirName); } Console.WriteLine("Writing appcast to {0}", appcastFileName); using (var w = XmlWriter.Create(appcastFileName, new XmlWriterSettings { NewLineChars = "\n", Encoding = new UTF8Encoding(false) })) { appcastXmlDocument.Save(w); } if (_signatureManager.KeysExist()) { var appcastFile = new FileInfo(appcastFileName); var extension = opts.SignatureFileExtension?.TrimStart('.') ?? "signature"; var signatureFile = appcastFileName + "." + extension; var signature = _signatureManager.GetSignatureForFile(appcastFile); var result = _signatureManager.VerifySignature(appcastFile, signature); if (result) { File.WriteAllText(signatureFile, signature); Console.WriteLine($"Wrote {signatureFile}", Color.Green); } else { Console.WriteLine($"Failed to verify {signatureFile}", Color.Red); } } else { Console.WriteLine("Skipped generating signature. Generate keys with --generate-keys", Color.Red); Environment.Exit(1); } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(); Environment.Exit(1); } }