public static string GetFilenameForCEUIFile(CExtendedUpdateInfoXml.File file2, IEnumerable <CompDBXmlClass.PayloadItem> payloadItems) { string filename = file2.FileName; if (payloadItems.Any(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest)) { CompDBXmlClass.PayloadItem payload = payloadItems.First(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest); filename = payload.Path; } return(filename); }
public static string GetFilenameForCEUIFile(CExtendedUpdateInfoXml.File file2, IEnumerable <CompDBXmlClass.PayloadItem> payloadItems) { string filename = file2.FileName; if (payloadItems.Any(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest)) { CompDBXmlClass.PayloadItem payload = payloadItems.First(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest); filename = payload.Path; } else if (payloadItems.Count() == 0 && filename.Contains("_") && !filename.StartsWith("_") && (filename.IndexOf('-') == -1 || filename.IndexOf('-') > filename.IndexOf('_'))) { filename = filename.Substring(0, filename.IndexOf('_')) + "\\" + filename.Substring(filename.IndexOf('_') + 1); filename = filename.TrimStart('\\'); } return(filename); }
public static bool ShouldFileGetDownloaded(CExtendedUpdateInfoXml.File file2, IEnumerable <CompDBXmlClass.PayloadItem> payloadItems) { string filename = file2.FileName; if (payloadItems.Any(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest)) { CompDBXmlClass.PayloadItem payload = payloadItems.First(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest); filename = payload.Path; if (payload.PayloadType.Equals("ExpressCab", StringComparison.InvariantCultureIgnoreCase)) { // This is a diff cab, skip it return(false); } } if (filename.Contains("Diff", StringComparison.InvariantCultureIgnoreCase) || filename.Contains("Baseless", StringComparison.InvariantCultureIgnoreCase)) { return(false); } return(true); }
public async static Task <string> GetBuildStringAsync(this UpdateData update) { try { CExtendedUpdateInfoXml.File deploymentCab = null; foreach (var file in update.Xml.Files.File) { if (file.FileName.EndsWith("desktopdeployment.cab", StringComparison.InvariantCultureIgnoreCase)) { deploymentCab = file; break; } } if (deploymentCab == null) { return(null); } var fileDownloadInfo = await FE3Handler.GetFileUrl(update, deploymentCab.Digest); if (fileDownloadInfo == null) { return(null); } string deploymentCabTemp = Path.GetTempFileName(); await client.DownloadFileTaskAsync(new Uri(fileDownloadInfo.DownloadUrl), deploymentCabTemp); if (fileDownloadInfo.IsEncrypted) { if (!fileDownloadInfo.Decrypt(deploymentCabTemp, deploymentCabTemp + ".decrypted")) { return(null); } File.Delete(deploymentCabTemp); File.Move(deploymentCabTemp + ".decrypted", deploymentCabTemp); } string result = null; try { using (var cabinet = new CabinetHandler(File.OpenRead(deploymentCabTemp))) { foreach (var file in cabinet.Files) { if (file.Equals("UpdateAgent.dll", StringComparison.InvariantCultureIgnoreCase)) { byte[] buffer; using (var dllstream = cabinet.OpenFile(file)) { buffer = new byte[dllstream.Length]; await dllstream.ReadAsync(buffer, 0, (int)dllstream.Length); } result = GetBuildStringFromUpdateAgent(buffer); break; } } } } catch { } var reportedBuildNumberFromService = update.Xml.ExtendedProperties.ReleaseVersion.Split('.')[2]; if (!string.IsNullOrEmpty(result) && result.Count(x => x == '.') >= 2) { var elements = result.Split('.'); elements[2] = reportedBuildNumberFromService; result = string.Join(".", elements); } File.Delete(deploymentCabTemp); return(result); } catch { return(null); } }
private static void AddUpdatesIfNotPresentAlready(ICollection <UpdateData> updates, IEnumerable <UpdateData> uncleanedData) { var data = uncleanedData.Select(x => TrimDeltasFromUpdateData(x)).ToArray(); foreach (var update in data) { if (updates.Any(x => x.Xml.Files.File.Count() == update.Xml.Files.File.Count())) { var potentialDupes = updates.Where(x => x.Xml.Files.File.Count() == update.Xml.Files.File.Count()); CExtendedUpdateInfoXml.File metadataCab = null; foreach (var file in update.Xml.Files.File) { if (file.PatchingType.Equals("metadata", StringComparison.InvariantCultureIgnoreCase)) { metadataCab = file; break; } } if (metadataCab == null) { continue; } bool exists = false; foreach (var potentialDupe in potentialDupes) { CExtendedUpdateInfoXml.File metadataCab2 = null; foreach (var file in potentialDupe.Xml.Files.File) { if (file.PatchingType.Equals("metadata", StringComparison.InvariantCultureIgnoreCase)) { metadataCab2 = file; break; } } if (metadataCab2 == null) { continue; } if (metadataCab.Digest == metadataCab2.Digest) { exists = true; continue; } } if (!exists) { updates.Add(update); } } else { updates.Add(update); } } }
public static bool ShouldFileGetDownloaded(CExtendedUpdateInfoXml.File file2, string OutputFolder, IEnumerable <CompDBXmlClass.PayloadItem> payloadItems) { string filename = file2.FileName; if (payloadItems.Any(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest)) { CompDBXmlClass.PayloadItem payload = payloadItems.First(x => x.PayloadHash == file2.AdditionalDigest.Text || x.PayloadHash == file2.Digest); filename = payload.Path; if (payload.PayloadType.Equals("ExpressCab", StringComparison.InvariantCultureIgnoreCase)) { // This is a diff cab, skip it return(false); } } if (filename.Contains("Diff", StringComparison.InvariantCultureIgnoreCase) || filename.Contains("Baseless", StringComparison.InvariantCultureIgnoreCase)) { return(false); } string filenameonly = Path.GetFileName(filename); string outputPath = filename.Replace(filenameonly, ""); if (File.Exists(Path.Combine(OutputFolder, outputPath, filenameonly))) { Logging.Log("File " + Path.Combine(outputPath, filenameonly) + " already exists. Verifying if it's matching expectations."); byte[] expectedHash = Convert.FromBase64String(file2.Digest); if (file2.DigestAlgorithm.Equals("sha1", StringComparison.InvariantCultureIgnoreCase)) { Logging.Log("Computing SHA1 hash..."); using (SHA1 SHA1 = SHA1Managed.Create()) { byte[] hash; using (FileStream fileStream = File.OpenRead(Path.Combine(OutputFolder, outputPath, filenameonly))) hash = SHA1.ComputeHash(fileStream); if (StructuralComparisons.StructuralEqualityComparer.Equals(expectedHash, hash)) { Logging.Log("Hash matches! Skipping file"); return(false); } else { Logging.Log("Hash does not match! Deleting and redownloading the file."); File.Delete(Path.Combine(OutputFolder, outputPath, filenameonly)); Logging.Log("File deleted"); } } } else if (file2.DigestAlgorithm.Equals("sha256", StringComparison.InvariantCultureIgnoreCase)) { Logging.Log("Computing SHA256 hash..."); using (SHA256 SHA256 = SHA256Managed.Create()) { byte[] hash; using (FileStream fileStream = File.OpenRead(Path.Combine(OutputFolder, outputPath, filenameonly))) hash = SHA256.ComputeHash(fileStream); if (StructuralComparisons.StructuralEqualityComparer.Equals(expectedHash, hash)) { Logging.Log("Hash matches! Skipping file"); return(false); } else { Logging.Log("Hash does not match! Deleting and redownloading the file."); File.Delete(Path.Combine(OutputFolder, outputPath, filenameonly)); Logging.Log("File deleted"); } } } } return(true); }