Example #1
0
        public async Task <VirtualFile> DownloadVersion(string version, VirtualDirectory downloadDirectory,
                                                        IProgressNotifier parentProgress = null,
                                                        string proxy = "")
        {
            await EnsureRepository(proxy).ConfigureAwait(false);

            string actualVersion = await CheckVersion(version, proxy).ConfigureAwait(false);

            CliVersionDefinition versionDefinition = repository.Version.FirstOrDefault(v => v.GetInformalVersion() == actualVersion);

            if (versionDefinition == null)
            {
                throw new UnkownVersionException(actualVersion);
            }

            FileDefinition downloadFile = GetCorrectVersion();

            if (downloadFile == null)
            {
                throw new UnsupportedSystemException(environmentService.PlatformName, environmentService.Architecture);
            }

            Uri downloadUri = InvalidUriFormatException.TryCreateUri(downloadFile.relPath,
                                                                     InvalidUriFormatException.TryCreateUri(settingsProvider.Settings.CliRepositoryRoot));
            VirtualFile result = downloadDirectory.File(downloadFile.name);

            using (Stream fileStream = result.OpenWrite())
            {
                await Download(downloadUri, fileStream, proxy, parentProgress).ConfigureAwait(false);
            }

            using (Stream fileStream = result.OpenRead())
            {
                try
                {
                    securityValidator.ValidateHash(fileStream, downloadFile.Fingerprint.hash, downloadFile.Fingerprint.algorithm);
                }
                catch (HashValidationException e)
                {
                    e.ValidationFileName = downloadUri.AbsolutePath;
                    throw;
                }
            }

            return(result);

            FileDefinition GetCorrectVersion()
            {
                FileDefinition[] correctArchitecture = versionDefinition.File
                                                       .Where(f => f.Architecture.ToString().Equals(environmentService.Architecture,
                                                                                                    StringComparison.OrdinalIgnoreCase))
                                                       .ToArray();
                return(correctArchitecture.FirstOrDefault(f => f.OS.ToString().Equals(environmentService.PlatformName,
                                                                                      StringComparison.OrdinalIgnoreCase)) ??
                       correctArchitecture.FirstOrDefault(f => f.OS == OSDefinition.unbound));
            }
        }
Example #2
0
        private async Task LoadRepository(string proxy)
        {
            Uri    baseUri        = InvalidUriFormatException.TryCreateUri(settingsProvider.Settings.CliRepositoryRoot);
            Uri    repositoryFile = InvalidUriFormatException.TryCreateUri(settingsProvider.Settings.CliRepositoryFileName, baseUri);
            Uri    signatureFile  = InvalidUriFormatException.TryCreateUri(settingsProvider.Settings.CliRepositorySignatureFileName, baseUri);
            string publicKeyFile  = Path.Combine(environmentService.AssemblyDirectory, Constants.PublicKeyFileName);

            if (!fileSystem.FileExists(publicKeyFile))
            {
                throw new PublicKeyFileNotFoundException();
            }

            using (MemoryStream repositoryStream = RecyclableMemoryStreamManager.Instance.GetStream())
                using (MemoryStream signatureStream = RecyclableMemoryStreamManager.Instance.GetStream())
                    using (Stream publicKeyFileStream = fileSystem.GetFile(publicKeyFile).OpenRead())
                    {
                        await Download(repositoryFile, repositoryStream, proxy).ConfigureAwait(false);

                        repositoryStream.Seek(0, SeekOrigin.Begin);

                        await Download(signatureFile, signatureStream, proxy).ConfigureAwait(false);

                        signatureStream.Seek(0, SeekOrigin.Begin);

                        try
                        {
                            securityValidator.ValidateSignature(repositoryStream, signatureStream, publicKeyFileStream);
                        }
                        catch (SignatureValidationException e)
                        {
                            e.ValidationFileName = repositoryFile.AbsolutePath;
                            throw;
                        }

                        repositoryStream.Seek(0, SeekOrigin.Begin);
                        XmlSerializer serializer = new XmlSerializer(typeof(Repository));
                        using (XmlReader reader = XmlReader.Create(repositoryStream))
                        {
                            repository = (Repository)serializer.Deserialize(reader);
                        }
                    }
        }