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));
        }
示例#2
0
        public bool VerifyFile(DistributionFile file, FileInfo fileInfo)
        {
            var bytes = File.ReadAllBytes(fileInfo.FullName);

            return
                (Crc32CAlgorithm.Compute(bytes) == file.Hash &&
                 _signatureTool.Verify(file.Signature, bytes));
        }
示例#3
0
        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;
 }
示例#5
0
        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();
            }
        }
示例#6
0
 public DTODistributionFile(DistributionFile distributionFile)
 {
     RelativePath       = distributionFile.RelativePath;
     DestinationGroupID = distributionFile.DestinationGroupID;
     Content            = distributionFile.Content;
 }
示例#7
0
 public static int GetHashCode(DistributionFile x)
 {
     return(_distributionFileEqualityComparer.GetHashCode(x));
 }
示例#8
0
 public static bool DistributionFilesEqual(DistributionFile x, DistributionFile y)
 {
     return(_distributionFileEqualityComparer.Equals(x, y));
 }