Exemple #1
0
        private void SetDotNetLibInformation(string targetFramework, NugetPackageType t)
        {
            PackageType     = t;
            TargetFramework = "";
            var assemblyFolderDict = new Dictionary <NugetPackageType, string>()
            {
                { NugetPackageType.DotNetCompileTimeAssembly, DotNetCompileTimeAssemblyPath },
                { NugetPackageType.DotNetImplementationAssembly, DotNetImplementationAssemblyPath }
            };

            if (!string.IsNullOrEmpty(targetFramework))
            {
                TargetFramework = System.Environment.ExpandEnvironmentVariables(targetFramework);
            }

            var basePath = Path.Combine(RootPath, string.Format("{0}.{1}", Id, MinVersion));

            if (t == NugetPackageType.DotNetImplementationAssembly || t == NugetPackageType.DotNetCompileTimeAssembly)
            {
                if (string.IsNullOrEmpty(TargetFramework))
                {
                    throw new Exception($"The NuGet package {ToString()} is marked as .NET lib, but the TargetFramework is not specified.");
                }
                FullPath = Path.Combine(basePath, assemblyFolderDict[t], TargetFramework);
            }
            else
            {
                FullPath = basePath;
                if (!string.IsNullOrEmpty(TargetFramework))
                {
                    FullPath = Path.Combine(FullPath, TargetFramework);
                }
            }
        }
Exemple #2
0
        public NugetPackage(string id, string version, string targetFramework, string source, string[] dependenciesSources, string var, NugetPackageType packageType, string packagesRoot, bool dependeciesForceMinVersion = true)
        {
            Dependencies = new List <NugetDependency>();
            Libraries    = new List <string>();
            Id           = id;
            VersionRange = NuGet.Versioning.VersionRange.Parse(System.Environment.ExpandEnvironmentVariables(version));
            MinVersion   = VersionRange.ToNonSnapshotRange().MinVersion.ToString();
            DependenciesForceMinVersion = dependeciesForceMinVersion;

            if (string.IsNullOrEmpty(source))
            {
                throw new Exception(string.Format("Invalid source for the package id {0};{1}. The source parameter is mandatory.", Id, MinVersion));
            }
            Source = TryGetUri(source);

            DependencySources = new List <Uri>();
            if (dependenciesSources != null)
            {
                foreach (var src in dependenciesSources)
                {
                    DependencySources.Add(TryGetUri(src));
                }
            }
            RootPath = packagesRoot;

            SetDotNetLibInformation(targetFramework, packageType);

            EnvironmentVariableKeys = new List <string>();
            EnvironmentVariableKeys.Add(EscapeStringAsEnvironmentVariableAsKey(Id));
            EnvironmentVariableKeys.Add(GetVersionEnvironmentVariableKey(Id));
            EnvironmentVariableKeys.Add(GetFrameworkEnvironmentVariableKey(Id));

            //Alaways set the "default" key value
            Environment.SetEnvironmentVariable(EscapeStringAsEnvironmentVariableAsKey(Id), FullPath);
            Environment.SetEnvironmentVariable(GetVersionEnvironmentVariableKey(Id), MinVersion);
            Environment.SetEnvironmentVariable(GetFrameworkEnvironmentVariableKey(Id), TargetFramework);

            if (!string.IsNullOrEmpty(var)) //If requested, set also the user specified value
            {
                EnvironmentVariableAdditionalKey = var;
                if (Environment.GetEnvironmentVariable(EnvironmentVariableAdditionalKey) == null)
                {
                    Environment.SetEnvironmentVariable(EnvironmentVariableAdditionalKey, FullPath);
                }
            }
        }
Exemple #3
0
        private static bool CheckFrameworkMatch(PackageReaderBase packageReader, NuGetFramework targetFramework, ref NugetPackageType type)
        {
            var frameworkReducer = new FrameworkReducer();
            Dictionary <NugetPackageType, Func <IEnumerable <FrameworkSpecificGroup> > > getter = new Dictionary <NugetPackageType, Func <IEnumerable <FrameworkSpecificGroup> > >
            {
                { NugetPackageType.DotNetImplementationAssembly, () => packageReader.GetItems(NugetPackage.DotNetImplementationAssemblyPath) },
                { NugetPackageType.DotNetCompileTimeAssembly, () => packageReader.GetItems(NugetPackage.DotNetCompileTimeAssemblyPath) },
            };

            foreach (var get in getter)
            {
                var items = get.Value();
                var targetFrameworkString = targetFramework.GetFrameworkString();
                var match = items.Where(x => targetFrameworkString == x.TargetFramework.GetFrameworkString());
                if (match.Count() > 0)
                {
                    type = get.Key;
                    return(true);
                }
            }
            return(false);
        }
Exemple #4
0
 public NugetPackage(string id, string version, string targetFramework, string source, string var, NugetPackageType packageType, string packagesRoot, bool dependeciesForceMinVersion = true)
     : this(id, version, targetFramework, source, null, var, packageType, packagesRoot, dependeciesForceMinVersion)
 {
 }
Exemple #5
0
        /// <summary>
        /// This method looks for the requestedPackage and installes (unpacks) it.
        /// </summary>
        /// <param name="requestedPackage"></param>
        /// <param name="installedPackages"></param>
        /// <returns></returns>
        private static async Task InstallPackageActionAsync(NugetPackage requestedPackage,
                                                            SourcePackageDependencyInfo packageToInstall,
                                                            ISettings settings,
                                                            SourceCacheContext cacheContext,
                                                            List <NugetPackage> installedPackages)
        {
            var packetRoot = Path.GetFullPath(requestedPackage.RootPath);
            //var packagePathResolver = new PackagePathResolver(Path.Combine(packetRoot, packageToInstall.Id, packageToInstall.Version.ToFullString()), true);
            var packagePathResolver = new PackagePathResolver(packetRoot);

            var nuGetFramework = NuGetFramework.ParseFolder(requestedPackage.TargetFramework);

            var packageExtractionContext = new PackageExtractionContext(PackageSaveMode.Defaultv3, XmlDocFileSaveMode.None, ClientPolicyContext.GetClientPolicy(settings, _logger), _logger);

            //Check if the package was previousely installed in this session
            var knownPackage = installedPackages.Where((x) => x.Id == packageToInstall.Id).FirstOrDefault();
            var packageToInstallVersionRange = VersionRange.Parse(packageToInstall.Version.OriginalVersion);

            if (knownPackage == null || !packageToInstallVersionRange.Satisfies(knownPackage.VersionRange.MinVersion))
            {
                PackageReaderBase packageReader;
                //Check if the package is already installed in the file system
                var installedPath = packagePathResolver.GetInstalledPath(packageToInstall);
                if (installedPath == null)
                {
                    var downloadResource = await packageToInstall.Source.GetResourceAsync <DownloadResource>(CancellationToken.None);

                    var download = downloadResource.GetDownloadResourceResultAsync(
                        packageToInstall,
                        new PackageDownloadContext(cacheContext),
                        SettingsUtility.GetGlobalPackagesFolder(settings),
                        _logger, CancellationToken.None);
                    download.Wait();
                    var downloadResult = download.Result;

                    await PackageExtractor.ExtractPackageAsync(
                        downloadResult.PackageSource,
                        downloadResult.PackageStream,
                        packagePathResolver,
                        packageExtractionContext,
                        CancellationToken.None);

                    packageReader = downloadResult.PackageReader;
                }
                else
                {
                    packageReader = new PackageFolderReader(installedPath);
                }

                NugetPackage newlyInstalled = null;
                if (requestedPackage.Id != packageToInstall.Id) //Was not the first requested id, must be a dependency.
                {
                    var nearest = GetNearestFramework(packageReader, nuGetFramework);

                    if (nearest == null)
                    {
                        throw new Exceptions.TargetFrameworkNotFoundException($"The current package {packageToInstall.Id} V{packageToInstall.Version} was installed as dependecy of {requestedPackage}. The parent package framework {nuGetFramework} is unknown/incompatible with the dependency's available frameworks.");
                    }
                    else
                    {
                        var version = packageToInstall.Version;
                        try
                        {   //If available, get the NuSpec version
                            version = packageReader.NuspecReader.GetVersion();
                        }
                        catch (NuGet.Packaging.Core.PackagingException) { }

                        newlyInstalled = new NugetPackage(packageToInstall.Id, version.OriginalVersion,
                                                          nearest.Item2.GetShortFolderName(),
                                                          packageToInstall.Source.PackageSource.Source,
                                                          null, nearest.Item1, requestedPackage.RootPath, requestedPackage.DependenciesForceMinVersion);
                    }
                }
                else
                {
                    NugetPackageType packageType = requestedPackage.PackageType;

                    if (packageType != NugetPackageType.Other)
                    {
                        if (!CheckFrameworkMatch(packageReader, nuGetFramework, ref packageType))
                        {
                            throw new Exceptions.TargetFrameworkNotFoundException($"The current package {packageToInstall.Id} V{packageToInstall.Version} requested framework {nuGetFramework} is unknown/incompatible with the available frameworks.");
                        }
                    }

                    if (requestedPackage.Source.AbsoluteUri != packageToInstall.Source.PackageSource.Source)
                    {
                        //Possible Dependency Confusion attack
                        throw new Exceptions.DependencyConfusionException($"The requested package has been found in {packageToInstall.Source.PackageSource.Source} instead of the required URI {requestedPackage.Source.AbsoluteUri}. Update the pakcage source if this is intended");
                    }
                    newlyInstalled = new NugetPackage(requestedPackage.Id, requestedPackage.VersionRange.OriginalString,
                                                      requestedPackage.TargetFramework,
                                                      requestedPackage.Source.AbsoluteUri,
                                                      null, packageType, requestedPackage.RootPath, requestedPackage.DependenciesForceMinVersion);
                }

                newlyInstalled.AddDependencies(packageToInstall.Dependencies);

                newlyInstalled.LoadLibraries();

                installedPackages.Add(newlyInstalled);
            }
        }