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)); } }
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); } } }