internal bool YieldFromSwidtag(Package provider, string requiredVersion, string minimumVersion, string maximumVersion, string searchKey)
        {
            if (provider == null)
            {
                // if the provider isn't there, just return.
                return(!IsCanceled);
            }

            if (AnyNullOrEmpty(provider.Name, provider.Version, provider.VersionScheme))
            {
                Debug("Skipping yield on swid due to missing field \r\n", provider.ToString());
                return(!IsCanceled);
            }

            if (!String.IsNullOrWhiteSpace(requiredVersion))
            {
                if (provider.Version != requiredVersion)
                {
                    return(!IsCanceled);
                }
            }
            else
            {
                if (!String.IsNullOrWhiteSpace(minimumVersion) && SoftwareIdentityVersionComparer.CompareVersions(provider.VersionScheme, provider.Version, minimumVersion) < 0)
                {
                    return(!IsCanceled);
                }

                if (!String.IsNullOrWhiteSpace(maximumVersion) && SoftwareIdentityVersionComparer.CompareVersions(provider.VersionScheme, provider.Version, maximumVersion) > 0)
                {
                    return(!IsCanceled);
                }
            }
            return(YieldFromSwidtag(provider, searchKey));
        }
Exemple #2
0
        public void VersionTests()
        {
            using (CaptureConsole) {
                Console.WriteLine("Version Tests");

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("alphanumeric", "1.0", "1.0"));
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("alphanumeric", "A", "B") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("alphanumeric", "B", "A") > 0);

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("decimal", "1", "1.0"));
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("decimal", "0", "0.0"));
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("decimal", ".0", "0.0"));

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("decimal", "1.0", "1.0"));
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("decimal", "1.20", "1.2"));
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("decimal", "1.1", "1.2") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("decimal", "1.2", "1.1") > 0);

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.0", "1.0"));
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.1", "1.2") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.2", "1.1") > 0);
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.2.0", "1.2.0"));
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.0.0.0.0.0.0", "1"));
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.2", "1.2.0"));
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric", "1.2.0", "1.2"));

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric+suffix", "1.0", "1.0"));
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric+suffix", "1.1", "1.2") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric+suffix", "1.2", "1.1") > 0);

                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric+suffix", "1.1-beta2", "1.1") > 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric+suffix", "1.0-beta2", "1.1") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("multipartnumeric+suffix", "1.2-beta2", "1.1") > 0);

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("semver", "1.0", "1.0"));
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("semver", "1.1", "1.2") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("semver", "1.2", "1.1") > 0);

                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("unknown", "1.0", "1.0"));
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("unknown", "1.1", "1.2") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("unknown", "1.2", "1.1") > 0);

                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("unknown", ".1", "1.2") < 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("unknown", "1.0", ".1") > 0);
                Assert.True(SoftwareIdentityVersionComparer.CompareVersions("unknown", "0", "1") < 0);
                Assert.Equal(0, SoftwareIdentityVersionComparer.CompareVersions("unknown", "1", "1.0"));
            }
        }
Exemple #3
0
        protected bool IsPackageInVersionRange(SoftwareIdentity pkg)
        {
            if (RequiredVersion != null && SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, RequiredVersion) != 0)
            {
                return(false);
            }

            if (MinimumVersion != null && SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, MinimumVersion) < 0)
            {
                return(false);
            }

            if (MaximumVersion != null && SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, MaximumVersion) > 0)
            {
                return(false);
            }

            return(true);
        }
        private bool FilterOnVersion(Package pkg, string requiredVersion, string minimumVersion, string maximumVersion)
        {
            if (pkg == null)
            {
                return(false);
            }

            if (string.IsNullOrWhiteSpace(requiredVersion) || (SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, requiredVersion) == 0))
            {
                if (string.IsNullOrWhiteSpace(minimumVersion) || (SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, minimumVersion) >= 0))
                {
                    if (string.IsNullOrWhiteSpace(maximumVersion) || (SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, maximumVersion) <= 0))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Exemple #5
0
        internal IEnumerable <PackageJson> Query(string name, string minimumVersion, string maximumVersion)
        {
            if (string.IsNullOrEmpty(minimumVersion) && string.IsNullOrEmpty(maximumVersion))
            {
                return(Query(name));
            }

            if (!IsValid || string.IsNullOrEmpty(name))
            {
                return(Enumerable.Empty <PackageJson>());
            }

            var packages = _PackageSourceList.SelectMany(each => each.Value).Where(item => (item.Name.EqualsIgnoreCase(name) ||
                                                                                            (!string.IsNullOrWhiteSpace(item.DisplayName) && item.DisplayName.EqualsIgnoreCase(name))) && !item.IsCommonDefinition);

            return(packages.Where(pkg => {
                if (!string.IsNullOrWhiteSpace(minimumVersion))
                {
                    if (SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, minimumVersion) < 0)
                    {
                        // a minimum version was specified, but the package version is less than the specified minimumversion.
                        return false;
                    }
                }

                if (!string.IsNullOrWhiteSpace(maximumVersion))
                {
                    if (SoftwareIdentityVersionComparer.CompareVersions(pkg.VersionScheme, pkg.Version, maximumVersion) > 0)
                    {
                        // a maximum version was specified, but the package version is more than the specified maximumversion.
                        return false;
                    }
                }

                // the version is in the range asked for.
                return true;
            }));
        }
        // YieldPackages - Use a foreach (Pipeline) loop to cycle through the Uninstall Keys as specified by the Hive and RegKey.
        // From there in the loop if the result returns True then display the result or when the request is null display all software installed for the Programs Provider.
        // Hive - HKLM / HKCU
        // RegKey - SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
        private bool YieldPackages(string hive, RegistryKey regkey, string name, string requiredVersion, string minimumVersion, string maximumVersion, Request request)
        {
            if (regkey != null)
            {
                var includeWindowsInstaller = request.GetOptionValue("IncludeWindowsInstaller").IsTrue();
                var includeSystemComponent  = request.GetOptionValue("IncludeSystemComponent").IsTrue();

                //var wildcardPattern = new WildcardPattern(name??"", WildcardOptions.CultureInvariant | WildcardOptions.IgnoreCase);

                // Iterate through each Key and pull the values as necessary
                foreach (var key in regkey.GetSubKeyNames())
                {
                    var subkey = regkey.OpenSubKey(key);
                    if (subkey != null)
                    {
                        var properties = subkey.GetValueNames().ToDictionaryNicely(each => each.ToString(), each => (subkey.GetValue(each) ?? string.Empty).ToString(), StringComparer.OrdinalIgnoreCase);

                        if (!includeWindowsInstaller && properties.ContainsKey("WindowsInstaller") && properties["WindowsInstaller"] == "1")
                        {
                            continue;
                        }

                        if (!includeSystemComponent && properties.ContainsKey("SystemComponent") && properties["SystemComponent"] == "1")
                        {
                            continue;
                        }

                        /*
                         *
                         * var productName = "";
                         *
                         * if (!properties.TryGetValue("DisplayName", out productName)) {
                         *  // no product name?
                         *  continue;
                         * }
                         *
                         *
                         * if (!string.IsNullOrWhiteSpace(productName) && (string.IsNullOrWhiteSpace(name) || wildcardPattern.IsMatch(productName)))
                         * {
                         *
                         */

                        var productName = properties.Get("DisplayName");
                        // var productVersion = properties.Get("DisplayVersion") ?? "";
                        var productVersion = properties.Get("DisplayVersion") ?? VerFinder();
                        var publisher      = properties.Get("Publisher") ?? "";
                        var comments       = properties.Get("Comments") ?? "";
                        var FullPath       = hive + @"\" + subkey;

                        // Pull based off Pattern Match
                        var uninstallString = properties.Get("QuietUninstallString") ?? properties.Get("UninstallString") ?? "";

                        if (!string.IsNullOrEmpty(requiredVersion))
                        {
                            if (SoftwareIdentityVersionComparer.CompareVersions("unknown", requiredVersion, productVersion) != 0)
                            {
                                continue;
                            }
                        }
                        else
                        {
                            if (!string.IsNullOrEmpty(minimumVersion) && SoftwareIdentityVersionComparer.CompareVersions("unknown", productVersion, minimumVersion) < 0)
                            {
                                continue;
                            }
                            if (!string.IsNullOrEmpty(maximumVersion) && SoftwareIdentityVersionComparer.CompareVersions("unknown", productVersion, maximumVersion) > 0)
                            {
                                continue;
                            }
                        }

                        if (request.YieldSoftwareIdentity(FullPath, productName, productVersion, "unknown", comments, "", name, "", "") != null)
                        {
                            if (properties.Keys.Where(each => !string.IsNullOrWhiteSpace(each)).Any(k => request.AddMetadata(FullPath, k.MakeSafeFileName(), properties[k]) == null))
                            {
                                return(false);
                            }
                        }

                        //}
                    }
                }
            }
            return(true);
        }
Exemple #7
0
        /// <summary>
        ///     Follows the feed to find the all versions of a package matching 'name', in the given range
        /// </summary>
        /// <param name="name"></param>
        /// <param name="minimumVersion"></param>
        /// <param name="maximumVersion"></param>
        /// <returns>A set of packages</returns>
        internal IEnumerable <Package> Query(string name, string minimumVersion, string maximumVersion)
        {
            if (string.IsNullOrEmpty(minimumVersion) && string.IsNullOrEmpty(maximumVersion))
            {
                return(Query(name));
            }

            if (!IsValid || string.IsNullOrEmpty(name))
            {
                return(Enumerable.Empty <Package>());
            }

            // first get all the packages that are in this feed with a matched name and version
            var packages = PackagesFilteredByName(name).Select(packageGroup => new Package(_request, packageGroup)).Where(package => {
                if (package.IsValid && package.Name.EqualsIgnoreCase(name))
                {
                    if (!string.IsNullOrWhiteSpace(minimumVersion))
                    {
                        if (SoftwareIdentityVersionComparer.CompareVersions(package.VersionScheme, package.Version, minimumVersion) < 0)
                        {
                            // a minimum version was specified, but the package version is less than the specified minimumversion.
                            return(false);
                        }
                    }

                    if (!string.IsNullOrWhiteSpace(maximumVersion))
                    {
                        if (SoftwareIdentityVersionComparer.CompareVersions(package.VersionScheme, package.Version, maximumVersion) > 0)
                        {
                            // a maximum version was specified, but the package version is more than the specified maximumversion.
                            return(false);
                        }
                    }

                    // the version is in the range asked for.
                    return(true);
                }
                // not a valid package, or incorrect name.
                return(false);
            });

            // then follow any supplemental links to more declared latest packages.
            var morePackages = More.SelectMany(nextGroup => new Feed(_request, nextGroup).Query(name, minimumVersion, maximumVersion));

            // let's search child feeds that declare that the name of the package in the feed matches the given name
            // and the version is either in the specified range of the link, or there is no specified version.
            var packagesByName = Feeds.Where(feedGroup => feedGroup.Any(link => {
                if (name.EqualsIgnoreCase(link.Attributes[Iso19770_2.Discovery.Name]))
                {
                    // first, ensure that the requested miniumum version is lower than the maximum version found in the feed.
                    var maxVer = link.Attributes[Iso19770_2.Discovery.MaximumVersion];
                    if (!string.IsNullOrEmpty(maxVer))
                    {
                        // since we don't know the version scheme at this point, so we just have to guess.
                        if (SoftwareIdentityVersionComparer.CompareVersions(Iso19770_2.VersionScheme.Unknown, minimumVersion, maxVer) <= 0)
                        {
                            // the minimum version is greater than the maximum version in the feed.
                            return(false);
                        }
                    }

                    // and then ensure that the requested maximum version is greater than the miniumum version found in the feed.
                    var minVer = link.Attributes[Iso19770_2.Discovery.MinimumVersion];
                    if (!string.IsNullOrEmpty(minVer))
                    {
                        // since we don't know the version scheme at this point, so we just have to guess.
                        if (SoftwareIdentityVersionComparer.CompareVersions(Iso19770_2.VersionScheme.Unknown, maximumVersion, minVer) >= 0)
                        {
                            // the maximum version less than the minimum version in the feed.
                            return(false);
                        }
                    }

                    return(true);
                }
                return(false);
            })).SelectMany(feed => new Feed(_request, feed).Query(name, minimumVersion, maximumVersion));

            // and search child feeds that the name would be in their range.
            // (version matches have to wait till we Query() that feed, since name ranges and version ranges shouldn't be on the same link.)
            var packagesByNameRange = Feeds.Where(feedGroup => feedGroup.Any(link => {
                var minName = link.Attributes[Iso19770_2.Discovery.MinimumName];
                var maxName = link.Attributes[Iso19770_2.Discovery.MaximumName];
                if (string.IsNullOrEmpty(minName) || string.IsNullOrEmpty(maxName))
                {
                    return(false);
                }
                return(String.Compare(minName, name, StringComparison.OrdinalIgnoreCase) <= 0 && String.Compare(name, maxName, StringComparison.OrdinalIgnoreCase) <= 0);
            })).SelectMany(feed => new Feed(_request, feed).Query(name, minimumVersion, maximumVersion));

            return(packages.Concat(morePackages).Concat(packagesByName).Concat(packagesByNameRange));
        }
Exemple #8
0
        private bool YieldPackages(string hive, RegistryKey regkey, string name, string requiredVersion, string minimumVersion, string maximumVersion, Request request)
        {
            if (regkey != null)
            {
                var includeWindowsInstaller = request.GetOptionValue("IncludeWindowsInstaller").IsTrue();
                var includeSystemComponent  = request.GetOptionValue("IncludeSystemComponent").IsTrue();

                foreach (var key in regkey.GetSubKeyNames())
                {
                    var subkey = regkey.OpenSubKey(key);
                    if (subkey != null)
                    {
                        var properties = subkey.GetValueNames().ToDictionaryNicely(each => each.ToString(), each => (subkey.GetValue(each) ?? string.Empty).ToString(), StringComparer.OrdinalIgnoreCase);

                        if (!includeWindowsInstaller && properties.ContainsKey("WindowsInstaller") && properties["WindowsInstaller"] == "1")
                        {
                            continue;
                        }

                        if (!includeSystemComponent && properties.ContainsKey("SystemComponent") && properties["SystemComponent"] == "1")
                        {
                            continue;
                        }

                        var productName = "";

                        if (!properties.TryGetValue("DisplayName", out productName))
                        {
                            // no product name?
                            continue;
                        }

                        if (string.IsNullOrWhiteSpace(name) || productName.IndexOf(name, StringComparison.OrdinalIgnoreCase) > -1)
                        {
                            var productVersion  = properties.Get("DisplayVersion") ?? "";
                            var publisher       = properties.Get("Publisher") ?? "";
                            var uninstallString = properties.Get("QuietUninstallString") ?? properties.Get("UninstallString") ?? "";
                            var comments        = properties.Get("Comments") ?? "";

                            var fp = hive + @"\" + subkey;

                            if (!string.IsNullOrEmpty(requiredVersion))
                            {
                                if (SoftwareIdentityVersionComparer.CompareVersions("unknown", requiredVersion, productVersion) != 0)
                                {
                                    continue;
                                }
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(minimumVersion) && SoftwareIdentityVersionComparer.CompareVersions("unknown", productVersion, minimumVersion) < 0)
                                {
                                    continue;
                                }
                                if (!string.IsNullOrEmpty(maximumVersion) && SoftwareIdentityVersionComparer.CompareVersions("unknown", productVersion, maximumVersion) > 0)
                                {
                                    continue;
                                }
                            }

                            if (request.YieldSoftwareIdentity(fp, productName, productVersion, "unknown", comments, "", name, "", "") != null)
                            {
                                if (properties.Keys.Where(each => !string.IsNullOrWhiteSpace(each)).Any(k => request.AddMetadata(fp, k.MakeSafeFileName(), properties[k]) == null))
                                {
                                    return(false);
                                }
                            }
                        }
                    }
                }
            }
            return(true);
        }