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