public DistributeFileResult DistributeFile(DistributionFile distributionFile) { string errorMessage = null; try { Configuration configuration = Configuration.Read(); Group group = configuration.Groups.FirstOrDefault(x => x.ID == distributionFile.DestinationGroupID); if (group == null) { Logger.AddAndThrow <DistributeFileException>(LogType.Error, $"Could not find group with ID {distributionFile.DestinationGroupID}"); } string filePath = Path.Combine(group.Path, distributionFile.RelativePath.Trim(Path.DirectorySeparatorChar)); try { FileSystemHandler.PutFileContent(filePath, distributionFile.Content); } catch (Exception ex) { Logger.AddAndThrow <DistributeFileException>($"Failed to persist file content of {filePath}", ex); } } catch (DistributeFileException ex) { errorMessage = ex.Message; } return(new DistributeFileResult(distributionFile.RelativePath, distributionFile.DestinationGroupID, errorMessage)); }
public bool VerifyFile(DistributionFile file, FileInfo fileInfo) { var bytes = File.ReadAllBytes(fileInfo.FullName); return (Crc32CAlgorithm.Compute(bytes) == file.Hash && _signatureTool.Verify(file.Signature, bytes)); }
public bool TryDecompress(DistributionFile distributionFile, FileInfo compressedFile, FileInfo targetFile) { targetFile.DeleteIfExists(); using var zip = ZipFile.Read(compressedFile.FullName); if (zip.Count != 1) { _logger.LogError("zip is empty or contains more than one entry. Incorrect zip"); return(false); } zip[0].Extract(targetFile.Directory.FullName, ExtractExistingFileAction.OverwriteSilently); if (targetFile.Length != distributionFile.Size) { _logger.LogError($"Decompressed file {targetFile.Name} has wrong size"); targetFile.DeleteIfExists(); return(false); } compressedFile.DeleteIfExists(); return(true); }
public DistributionFileProcessingResult(FileProcessingResultCode code, DistributionFile distributionFile) { Code = code; DistributionFile = distributionFile; }
private bool PrepareFile(DistributionFile distributionFile, FileSystemInfo targetDirectory) { if (distributionFile.Action == FileProcessingAction.Delete) { _logger.LogTrace($"Skipping file marked for delete: {distributionFile.Name}"); return(true); } var compressed = new FileInfo(Path.Combine(targetDirectory.FullName, distributionFile.InternalPath, distributionFile.CompressedName)); var decompressed = new FileInfo(Path.Combine(targetDirectory.FullName, distributionFile.InternalPath, distributionFile.Name)); try { if (compressed.Exists) { compressed.Delete(); } if (decompressed.Exists) { decompressed.Delete(); } if (!_downloader.TryDownload(distributionFile, compressed.FullName)) { _logger.LogError($"Can not download file: {compressed.Name}"); return(false); } if (compressed.Length != distributionFile.CompressedSize) { _logger.LogError($"Downloaded file {compressed.Name} has wrong size: {compressed.Length.ToString()}, has to be: {distributionFile.CompressedSize.ToString()}"); return(false); } if (!_decompressor.TryDecompress(distributionFile, compressed, decompressed)) { _logger.LogError($"Can not decompress file {compressed.Name}"); decompressed.DeleteIfExists(); return(false); } if (decompressed.Length != distributionFile.Size) { _logger.LogError($"Decompressed file {decompressed.Name} has wrong size: {decompressed.Length.ToString()}, has to be: {distributionFile.Size.ToString()}"); decompressed.DeleteIfExists(); return(false); } if (!_verifier.VerifyFile(distributionFile, decompressed)) { _logger.LogError($"Decompressed file {decompressed.Name} verification failed"); decompressed.DeleteIfExists(); return(false); } return(true); } finally { compressed.DeleteIfExists(); } }
public DTODistributionFile(DistributionFile distributionFile) { RelativePath = distributionFile.RelativePath; DestinationGroupID = distributionFile.DestinationGroupID; Content = distributionFile.Content; }
public static int GetHashCode(DistributionFile x) { return(_distributionFileEqualityComparer.GetHashCode(x)); }
public static bool DistributionFilesEqual(DistributionFile x, DistributionFile y) { return(_distributionFileEqualityComparer.Equals(x, y)); }