예제 #1
0
		IList<MobileProvision> GetProvisioningProfiles (MobileProvisionPlatform platform, MobileProvisionDistributionType type, CodeSignIdentity identity, IList<X509Certificate2> certs)
		{
			var failures = new List<string> ();
			IList<MobileProvision> profiles;

			if (identity.BundleId != null) {
				if (certs.Count > 0)
					profiles = MobileProvisionIndex.GetMobileProvisions (platform, identity.BundleId, type, certs, unique: true, failures: failures);
				else
					profiles = MobileProvisionIndex.GetMobileProvisions (platform, identity.BundleId, type, unique: true, failures: failures);
			} else if (certs.Count > 0) {
				profiles = MobileProvisionIndex.GetMobileProvisions (platform, type, certs, unique: true, failures: failures);
			} else {
				profiles = MobileProvisionIndex.GetMobileProvisions (platform, type, unique: true, failures: failures);
			}

			if (profiles.Count == 0) {
				foreach (var f in failures)
					Log.LogMessage (MessageImportance.Low, "{0}", f);
				
				Log.LogError (MSBStrings.E0131, AppBundleName, PlatformName);
				return null;
			}

			Log.LogMessage (MessageImportance.Low, "Available profiles:");
			foreach (var p in profiles)
				Log.LogMessage (MessageImportance.Low, "    {0}", p.Name);

			return profiles;
		}
예제 #2
0
        IList <MobileProvision> GetProvisioningProfiles(MobileProvisionPlatform platform, MobileProvisionDistributionType type, CodeSignIdentity identity, IList <X509Certificate2> certs)
        {
            var failures = new List <string> ();
            IList <MobileProvision> profiles;

            if (identity.BundleId != null)
            {
                if (certs.Count > 0)
                {
                    profiles = MobileProvisionIndex.GetMobileProvisions(platform, identity.BundleId, type, certs, unique: true, failures: failures);
                }
                else
                {
                    profiles = MobileProvisionIndex.GetMobileProvisions(platform, identity.BundleId, type, unique: true, failures: failures);
                }
            }
            else if (certs.Count > 0)
            {
                profiles = MobileProvisionIndex.GetMobileProvisions(platform, type, certs, unique: true, failures: failures);
            }
            else
            {
                profiles = MobileProvisionIndex.GetMobileProvisions(platform, type, unique: true, failures: failures);
            }

            if (profiles.Count == 0)
            {
                foreach (var f in failures)
                {
                    Log.LogMessage(MessageImportance.Low, "{0}", f);
                }

                Log.LogError($"Could not find any available provisioning profiles for {PlatformName}. Please enable Automatic Provisioning from the iOS Bundle Signing page.");

                return(null);
            }

            Log.LogMessage(MessageImportance.Low, "Available profiles:");

            foreach (var p in profiles)
            {
                Log.LogMessage(MessageImportance.Low, "    {0}", p.Name);
            }

            return(profiles);
        }
예제 #3
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, string bundleIdentifier, MobileProvisionDistributionType type, IList <X509Certificate2> developerCertificates, bool includeExpired = false, bool unique = false)
        {
            var extension   = MobileProvision.GetFileExtension(platform);
            var dictionary  = new Dictionary <string, int> ();
            var thumbprints = new HashSet <string> ();
            var list        = new List <MobileProvision> ();
            MobileProvisionDistributionType dist;
            var     plist = OpenIndex();
            var     now   = DateTime.UtcNow;
            PString identifier;
            PString fileName;
            PArray  platforms;
            PArray  profiles;
            PArray  array;

            if (bundleIdentifier == null)
            {
                throw new ArgumentNullException(nameof(bundleIdentifier));
            }

            if (developerCertificates == null)
            {
                throw new ArgumentNullException(nameof(developerCertificates));
            }

            foreach (var certificate in developerCertificates)
            {
                thumbprints.Add(certificate.Thumbprint);
            }

            if (thumbprints.Count == 0)
            {
                return(list);
            }

            if (!plist.TryGetValue("ProvisioningProfiles", out profiles))
            {
                return(list);
            }

            // iterate over the profiles in reverse order so that we load newer profiles first (optimization for the 'unique' case)
            for (int i = profiles.Count - 1; i >= 0; i--)
            {
                var profile = profiles[i] as PDictionary;

                if (profile == null || !profile.TryGetValue("FileName", out fileName) || !fileName.Value.EndsWith(extension, StringComparison.Ordinal))
                {
                    continue;
                }

                if (!profile.TryGetValue("Platforms", out platforms) || !Contains(platforms, platform))
                {
                    continue;
                }

                if (!includeExpired)
                {
                    PDate expirationDate;

                    if (!profile.TryGetValue("ExpirationDate", out expirationDate))
                    {
                        continue;
                    }

                    if (expirationDate.Value < now)
                    {
                        continue;
                    }
                }

                if (type != MobileProvisionDistributionType.Any)
                {
                    PString value;

                    if (!profile.TryGetValue("Distribution", out value) || !Enum.TryParse(value.Value, out dist))
                    {
                        continue;
                    }

                    if ((type & dist) == 0)
                    {
                        continue;
                    }
                }

                if (!profile.TryGetValue("ApplicationIdentifier", out identifier))
                {
                    continue;
                }

                string id = identifier.Value;
                int    dot;

                // Note: the ApplicationIdentifier will be in the form "7V723M9SQ5.com.xamarin.app-name", so we'll need to trim the leading TeamIdentifierPrefix
                if ((dot = id.IndexOf('.')) != -1)
                {
                    id = id.Substring(dot + 1);
                }

                if (id.Length > 0 && id[id.Length - 1] == '*')
                {
                    // Note: this is a wildcard provisioning profile, which means we need to use a substring match
                    id = id.TrimEnd('*');

                    if (!bundleIdentifier.StartsWith(id, StringComparison.Ordinal))
                    {
                        continue;
                    }
                }
                else if (id != bundleIdentifier)
                {
                    // the CFBundleIdentifier provided by our caller does not match this provisioning profile
                    continue;
                }

                if (!profile.TryGetValue("DeveloperCertificates", out array))
                {
                    continue;
                }

                foreach (var cert in array.OfType <PDictionary> ())
                {
                    PString thumbprint;

                    if (!cert.TryGetValue("Thumbprint", out thumbprint))
                    {
                        continue;
                    }

                    if (!thumbprints.Contains(thumbprint.Value))
                    {
                        continue;
                    }

                    if (unique)
                    {
                        PDate   creationDate;
                        PString name;
                        int     index;

                        if (!profile.TryGetValue("Name", out name))
                        {
                            break;
                        }

                        if (dictionary.TryGetValue(name.Value, out index))
                        {
                            if (!profile.TryGetValue("CreationDate", out creationDate))
                            {
                                break;
                            }

                            if (creationDate.Value > list[index].CreationDate)
                            {
                                list[index] = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                            }
                        }
                        else
                        {
                            var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                            dictionary.Add(name.Value, list.Count);
                            list.Add(provision);
                        }
                    }
                    else
                    {
                        var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                        list.Add(provision);
                    }
                    break;
                }
            }

            return(list);
        }
예제 #4
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, MobileProvisionDistributionType type, IList <X509Certificate2> developerCertificates, bool includeExpired = false, bool unique = false)
        {
            var extension   = MobileProvision.GetFileExtension(platform);
            var dictionary  = new Dictionary <string, int> ();
            var thumbprints = new HashSet <string> ();
            var list        = new List <MobileProvision> ();
            MobileProvisionDistributionType dist;
            var     plist = OpenIndex();
            var     now   = DateTime.UtcNow;
            PString fileName;
            PArray  platforms;
            PArray  profiles;
            PArray  array;

            if (developerCertificates == null)
            {
                throw new ArgumentNullException(nameof(developerCertificates));
            }

            foreach (var certificate in developerCertificates)
            {
                thumbprints.Add(certificate.Thumbprint);
            }

            if (thumbprints.Count == 0)
            {
                return(list);
            }

            if (!plist.TryGetValue("ProvisioningProfiles", out profiles))
            {
                return(list);
            }

            // iterate over the profiles in reverse order so that we load newer profiles first (optimization for the 'unique' case)
            for (int i = profiles.Count - 1; i >= 0; i--)
            {
                var profile = profiles[i] as PDictionary;

                if (profile == null || !profile.TryGetValue("FileName", out fileName) || !fileName.Value.EndsWith(extension, StringComparison.Ordinal))
                {
                    continue;
                }

                if (!profile.TryGetValue("Platforms", out platforms) || !Contains(platforms, platform))
                {
                    continue;
                }

                if (!includeExpired)
                {
                    PDate expirationDate;

                    if (!profile.TryGetValue("ExpirationDate", out expirationDate))
                    {
                        continue;
                    }

                    if (expirationDate.Value < now)
                    {
                        continue;
                    }
                }

                if (type != MobileProvisionDistributionType.Any)
                {
                    PString value;

                    if (!profile.TryGetValue("Distribution", out value) || !Enum.TryParse(value.Value, out dist))
                    {
                        continue;
                    }

                    if ((type & dist) == 0)
                    {
                        continue;
                    }
                }

                if (!profile.TryGetValue("DeveloperCertificates", out array))
                {
                    continue;
                }

                foreach (var cert in array.OfType <PDictionary> ())
                {
                    PString thumbprint;

                    if (!cert.TryGetValue("Thumbprint", out thumbprint))
                    {
                        continue;
                    }

                    if (!thumbprints.Contains(thumbprint.Value))
                    {
                        continue;
                    }

                    if (unique)
                    {
                        PDate   creationDate;
                        PString name;
                        int     index;

                        if (!profile.TryGetValue("Name", out name))
                        {
                            break;
                        }

                        if (dictionary.TryGetValue(name.Value, out index))
                        {
                            if (!profile.TryGetValue("CreationDate", out creationDate))
                            {
                                break;
                            }

                            if (creationDate.Value > list[index].CreationDate)
                            {
                                list[index] = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                            }
                        }
                        else
                        {
                            var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                            dictionary.Add(name.Value, list.Count);
                            list.Add(provision);
                        }
                    }
                    else
                    {
                        var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                        list.Add(provision);
                    }
                    break;
                }
            }

            return(list);
        }
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, string bundleIdentifier, MobileProvisionDistributionType type, IList <X509Certificate2> developerCertificates, bool includeExpired = false, bool unique = false, List <string> failures = null)
        {
            var index       = OpenIndex(MobileProvision.ProfileDirectory, IndexFileName);
            var extension   = MobileProvision.GetFileExtension(platform);
            var dictionary  = new Dictionary <string, int> ();
            var thumbprints = new HashSet <string> ();
            var list        = new List <MobileProvision> ();
            var now         = DateTime.UtcNow;

            if (bundleIdentifier == null)
            {
                throw new ArgumentNullException(nameof(bundleIdentifier));
            }

            if (developerCertificates == null)
            {
                throw new ArgumentNullException(nameof(developerCertificates));
            }

            foreach (var certificate in developerCertificates)
            {
                thumbprints.Add(certificate.Thumbprint);
            }

            if (thumbprints.Count == 0)
            {
                return(list);
            }

            // iterate over the profiles in reverse order so that we load newer profiles first (optimization for the 'unique' case)
            for (int i = index.ProvisioningProfiles.Count - 1; i >= 0; i--)
            {
                var profile = index.ProvisioningProfiles[i];

                if (!profile.FileName.EndsWith(extension, StringComparison.Ordinal))
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its FileName ({profile.FileName}) does not end with '{extension}'.");
                    continue;
                }

                if (!profile.Platforms.Contains(platform))
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its platforms ({string.Join (", ", profile.Platforms.Select ((v) => v.ToString ()))}) do not match the requested platform ({platform}).");
                    continue;
                }

                if (!includeExpired && profile.ExpirationDate < now)
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because it has expired ({profile.ExpirationDate}).");
                    continue;
                }

                if (type != MobileProvisionDistributionType.Any && (profile.Distribution & type) == 0)
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its ({profile.Distribution}) does not match the expected type ({type}).");
                    continue;
                }

                var id = profile.ApplicationIdentifier;
                int dot;

                // Note: the ApplicationIdentifier will be in the form "7V723M9SQ5.com.xamarin.app-name", so we'll need to trim the leading TeamIdentifierPrefix
                if ((dot = id.IndexOf('.')) != -1)
                {
                    id = id.Substring(dot + 1);
                }

                if (id.Length > 0 && id[id.Length - 1] == '*')
                {
                    // Note: this is a wildcard provisioning profile, which means we need to use a substring match
                    id = id.TrimEnd('*');

                    if (!bundleIdentifier.StartsWith(id, StringComparison.Ordinal))
                    {
                        failures?.Add($"The profile '{profile.Name}' is not applicable because its id ({profile.ApplicationIdentifier}) does not match the bundle identifer {bundleIdentifier}.");
                        continue;
                    }
                }
                else if (id != bundleIdentifier)
                {
                    // the CFBundleIdentifier provided by our caller does not match this provisioning profile
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its id ({profile.ApplicationIdentifier}) does not match the bundle identifer {bundleIdentifier}.");
                    continue;
                }

                foreach (var cert in profile.DeveloperCertificates)
                {
                    if (!thumbprints.Contains(cert.Thumbprint))
                    {
                        failures?.Add($"The profile '{profile.Name}' might not be applicable because its developer certificate (of {profile.DeveloperCertificates.Count} certificates) {cert.Name}'s thumbprint ({cert.Thumbprint}) is not in the list of accepted thumbprints ({string.Join (", ", thumbprints)}).");
                        continue;
                    }

                    if (unique)
                    {
                        int idx;

                        if (dictionary.TryGetValue(profile.Name, out idx))
                        {
                            if (profile.CreationDate > list[idx].CreationDate)
                            {
                                list[idx] = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName));
                            }
                        }
                        else
                        {
                            var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName));
                            dictionary.Add(profile.Name, list.Count);
                            list.Add(provision);
                        }
                    }
                    else
                    {
                        var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName));
                        list.Add(provision);
                    }
                    break;
                }
            }

            return(list);
        }
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, MobileProvisionDistributionType type, IList <X509Certificate2> developerCertificates, bool includeExpired = false, bool unique = false, List <string> failures = null)
        {
            var index       = OpenIndex(MobileProvision.ProfileDirectory, IndexFileName);
            var extension   = MobileProvision.GetFileExtension(platform);
            var dictionary  = new Dictionary <string, int> ();
            var thumbprints = new HashSet <string> ();
            var list        = new List <MobileProvision> ();
            var now         = DateTime.UtcNow;

            if (developerCertificates == null)
            {
                throw new ArgumentNullException(nameof(developerCertificates));
            }

            foreach (var certificate in developerCertificates)
            {
                thumbprints.Add(certificate.Thumbprint);
            }

            if (thumbprints.Count == 0)
            {
                return(list);
            }

            // iterate over the profiles in reverse order so that we load newer profiles first (optimization for the 'unique' case)
            for (int i = index.ProvisioningProfiles.Count - 1; i >= 0; i--)
            {
                var profile = index.ProvisioningProfiles[i];

                if (!profile.FileName.EndsWith(extension, StringComparison.Ordinal))
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its FileName ({profile.FileName}) does not end with '{extension}'.");
                    continue;
                }

                if (!profile.Platforms.Contains(platform))
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its platforms ({string.Join (", ", profile.Platforms.Select ((v) => v.ToString ()))}) do not match the requested platform ({platform}).");
                    continue;
                }

                if (!includeExpired && profile.ExpirationDate < now)
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because it has expired ({profile.ExpirationDate}).");
                    continue;
                }

                if (type != MobileProvisionDistributionType.Any && (profile.Distribution & type) == 0)
                {
                    failures?.Add($"The profile '{profile.Name}' is not applicable because its ({profile.Distribution}) does not match the expected type ({type}).");
                    continue;
                }

                foreach (var cert in profile.DeveloperCertificates)
                {
                    if (!thumbprints.Contains(cert.Thumbprint))
                    {
                        failures?.Add($"The profile '{profile.Name}' might not be applicable because its developer certificate (of {profile.DeveloperCertificates.Count} certificates) {cert.Name}'s thumbprint ({cert.Thumbprint}) is not in the list of accepted thumbprints ({string.Join (", ", thumbprints)}).");
                        continue;
                    }

                    if (unique)
                    {
                        int idx;

                        if (dictionary.TryGetValue(profile.Name, out idx))
                        {
                            if (profile.CreationDate > list[idx].CreationDate)
                            {
                                list[idx] = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName));
                            }
                        }
                        else
                        {
                            var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName));
                            dictionary.Add(profile.Name, list.Count);
                            list.Add(provision);
                        }
                    }
                    else
                    {
                        var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName));
                        list.Add(provision);
                    }
                    break;
                }
            }

            return(list);
        }
예제 #7
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, string bundleIdentifier, MobileProvisionDistributionType type, bool includeExpired = false)
        {
            var extension   = MobileProvision.GetFileExtension(platform);
            var thumbprints = new HashSet <string> ();
            var list        = new List <MobileProvision> ();
            MobileProvisionDistributionType dist;
            var     plist = OpenIndex();
            var     now   = DateTime.Now;
            PString identifier;
            PString fileName;
            PArray  platforms;
            PArray  profiles;

            if (bundleIdentifier == null)
            {
                throw new ArgumentNullException(nameof(bundleIdentifier));
            }

            if (thumbprints.Count == 0)
            {
                return(list);
            }

            if (!plist.TryGetValue("ProvisioningProfiles", out profiles))
            {
                return(list);
            }

            foreach (var profile in profiles.OfType <PDictionary> ())
            {
                if (!profile.TryGetValue("FileName", out fileName) || !fileName.Value.EndsWith(extension, StringComparison.Ordinal))
                {
                    continue;
                }

                if (!profile.TryGetValue("Platforms", out platforms) || !Contains(platforms, platform))
                {
                    continue;
                }

                if (!includeExpired)
                {
                    PDate expirationDate;

                    if (!profile.TryGetValue("ExpirationDate", out expirationDate))
                    {
                        continue;
                    }

                    if (expirationDate.Value < now)
                    {
                        continue;
                    }
                }

                if (type != MobileProvisionDistributionType.Any)
                {
                    PString value;

                    if (!profile.TryGetValue("Distribution", out value) || !Enum.TryParse(value.Value, out dist))
                    {
                        continue;
                    }

                    if ((type & dist) == 0)
                    {
                        continue;
                    }
                }

                if (!profile.TryGetValue("ApplicationIdentifier", out identifier))
                {
                    continue;
                }

                string id = identifier.Value;
                int    dot;

                // Note: the ApplicationIdentifier will be in the form "7V723M9SQ5.com.xamarin.app-name", so we'll need to trim the leading TeamIdentifierPrefix
                if ((dot = id.IndexOf('.')) != -1)
                {
                    id = id.Substring(dot + 1);
                }

                if (id.Length > 0 && id[id.Length - 1] == '*')
                {
                    // Note: this is a wildcard provisioning profile, which means we need to use a substring match
                    id = id.TrimEnd('*');

                    if (!bundleIdentifier.StartsWith(id, StringComparison.Ordinal))
                    {
                        continue;
                    }
                }
                else if (id != bundleIdentifier)
                {
                    // the CFBundleIdentifier provided by our caller does not match this provisioning profile
                    continue;
                }

                var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                list.Add(provision);
            }

            return(list);
        }
예제 #8
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, MobileProvisionDistributionType type, IList <X509Certificate2> developerCertificates, bool includeExpired = false)
        {
            var extension   = MobileProvision.GetFileExtension(platform);
            var thumbprints = new HashSet <string> ();
            var list        = new List <MobileProvision> ();
            MobileProvisionDistributionType dist;
            var     plist = OpenIndex();
            var     now   = DateTime.Now;
            PString fileName;
            PArray  platforms;
            PArray  profiles;
            PArray  array;

            if (developerCertificates == null)
            {
                throw new ArgumentNullException(nameof(developerCertificates));
            }

            foreach (var certificate in developerCertificates)
            {
                thumbprints.Add(certificate.Thumbprint);
            }

            if (thumbprints.Count == 0)
            {
                return(list);
            }

            if (!plist.TryGetValue("ProvisioningProfiles", out profiles))
            {
                return(list);
            }

            foreach (var profile in profiles.OfType <PDictionary> ())
            {
                if (!profile.TryGetValue("FileName", out fileName) || !fileName.Value.EndsWith(extension, StringComparison.Ordinal))
                {
                    continue;
                }

                if (!profile.TryGetValue("Platforms", out platforms) || !Contains(platforms, platform))
                {
                    continue;
                }

                if (!includeExpired)
                {
                    PDate expirationDate;

                    if (!profile.TryGetValue("ExpirationDate", out expirationDate))
                    {
                        continue;
                    }

                    if (expirationDate.Value < now)
                    {
                        continue;
                    }
                }

                if (type != MobileProvisionDistributionType.Any)
                {
                    PString value;

                    if (!profile.TryGetValue("Distribution", out value) || !Enum.TryParse(value.Value, out dist))
                    {
                        continue;
                    }

                    if ((type & dist) == 0)
                    {
                        continue;
                    }
                }

                if (!profile.TryGetValue("DeveloperCertificates", out array))
                {
                    continue;
                }

                foreach (var cert in array.OfType <PDictionary> ())
                {
                    PString thumbprint;

                    if (!cert.TryGetValue("Thumbprint", out thumbprint))
                    {
                        continue;
                    }

                    if (thumbprints.Contains(thumbprint.Value))
                    {
                        var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                        list.Add(provision);
                        break;
                    }
                }
            }

            return(list);
        }
예제 #9
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, MobileProvisionDistributionType type, bool includeExpired = false)
        {
            var extension = MobileProvision.GetFileExtension(platform);
            var list      = new List <MobileProvision> ();
            MobileProvisionDistributionType dist;
            var     plist = OpenIndex();
            var     now   = DateTime.Now;
            PString fileName;
            PArray  platforms;
            PArray  profiles;

            if (!plist.TryGetValue("ProvisioningProfiles", out profiles))
            {
                return(list);
            }

            foreach (var profile in profiles.OfType <PDictionary> ())
            {
                if (!profile.TryGetValue("FileName", out fileName) || !fileName.Value.EndsWith(extension, StringComparison.Ordinal))
                {
                    continue;
                }

                if (!profile.TryGetValue("Platforms", out platforms) || !Contains(platforms, platform))
                {
                    continue;
                }

                if (!includeExpired)
                {
                    PDate expirationDate;

                    if (!profile.TryGetValue("ExpirationDate", out expirationDate))
                    {
                        continue;
                    }

                    if (expirationDate.Value < now)
                    {
                        continue;
                    }
                }

                if (type != MobileProvisionDistributionType.Any)
                {
                    PString value;

                    if (!profile.TryGetValue("Distribution", out value) || !Enum.TryParse(value.Value, out dist))
                    {
                        continue;
                    }

                    if ((type & dist) == 0)
                    {
                        continue;
                    }
                }

                var provision = MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value));
                list.Add(provision);
            }

            return(list);
        }