Пример #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;
		}
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, 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 list       = new List <MobileProvision> ();
            var now        = DateTime.UtcNow;

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

            return(list);
        }
        protected override MobileProvision GetMobileProvision(MobileProvisionPlatform platform, string uuid)
        {
            if (File.Exists(ProvisioningProfile))
            {
                return(MobileProvision.LoadFromFile(ProvisioningProfile));
            }

            return(null);
        }
Пример #4
0
        public static MobileProvision GetMobileProvision(MobileProvisionPlatform platform, string uuid)
        {
            var extension = MobileProvision.GetFileExtension (platform);
            var path = Path.Combine (MobileProvision.ProfileDirectory, uuid + extension);

            if (File.Exists (path))
                return MobileProvision.LoadFromFile (path);

            return MobileProvision.GetAllInstalledProvisions (platform, true).FirstOrDefault (x => x.Uuid == uuid);
        }
Пример #5
0
        protected virtual MobileProvision GetMobileProvision(MobileProvisionPlatform platform, string uuid)
        {
            var extension = MobileProvision.GetFileExtension(platform);
            var path      = Path.Combine(MobileProvision.ProfileDirectory, uuid + extension);

            if (File.Exists(path))
            {
                return(MobileProvision.LoadFromFile(path));
            }

            return(MobileProvision.GetAllInstalledProvisions(platform, true).FirstOrDefault(x => x.Uuid == uuid));
        }
Пример #6
0
        public static string GetFileExtension(MobileProvisionPlatform platform)
        {
            switch (platform)
            {
            case MobileProvisionPlatform.MacOS:
                return(".provisionprofile");

            case MobileProvisionPlatform.tvOS:
            case MobileProvisionPlatform.iOS:
            default:
                return(".mobileprovision");
            }
        }
Пример #7
0
        static bool Contains(PArray platforms, MobileProvisionPlatform platform)
        {
            var value = platform.ToString();

            foreach (var item in platforms.OfType <PString> ())
            {
                if (item.Value == value)
                {
                    return(true);
                }
            }

            return(false);
        }
Пример #8
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, bool includeExpired = false)
        {
            var     extension = MobileProvision.GetFileExtension(platform);
            var     list      = new List <MobileProvision> ();
            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;
                    }
                }

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

            return(list);
        }
Пример #9
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);
        }
Пример #10
0
        public static MobileProvision GetMobileProvision(MobileProvisionPlatform platform, string uuid)
        {
            var extension = MobileProvision.GetFileExtension(platform);
            var path      = Path.Combine(MobileProvision.ProfileDirectory, uuid + extension);

            if (File.Exists(path))
            {
                return(MobileProvision.LoadFromFile(path));
            }

            var     plist = OpenIndex();
            PString fileName;
            PArray  platforms;
            PArray  profiles;
            PString value;

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

                    if (!profile.TryGetValue("Uuid", out value))
                    {
                        continue;
                    }

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

                    return(MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, fileName.Value)));
                }
            }

            return(null);
        }
        public static MobileProvision GetMobileProvision(MobileProvisionPlatform platform, string name, List <string> failures = null)
        {
            var extension = MobileProvision.GetFileExtension(platform);
            var path      = Path.Combine(MobileProvision.ProfileDirectory, name + extension);

            if (File.Exists(path))
            {
                return(MobileProvision.LoadFromFile(path));
            }

            var index = OpenIndex(MobileProvision.ProfileDirectory, IndexFileName);
            var latestCreationDate = DateTime.MinValue;

            foreach (var profile in index.ProvisioningProfiles)
            {
                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 (name == profile.Name || name == profile.Uuid)
                {
                    return(MobileProvision.LoadFromFile(Path.Combine(MobileProvision.ProfileDirectory, profile.FileName)));
                }

                failures?.Add($"The profile '{profile.Name}' is not applicable because its Name and Uuid ({profile.Uuid}) do not match '{name}'.");
            }

            return(null);
        }
Пример #12
0
 public static IList <MobileProvision> GetAllInstalledProvisions(MobileProvisionPlatform platform)
 {
     return(GetAllInstalledProvisions(platform, false));
 }
Пример #13
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);
        }
Пример #14
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);
        }
Пример #15
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, bool includeExpired = false, bool unique = false)
        {
            var     extension  = MobileProvision.GetFileExtension(platform);
            var     dictionary = new Dictionary <string, int> ();
            var     list       = new List <MobileProvision> ();
            var     plist      = OpenIndex();
            var     now        = DateTime.UtcNow;
            PString fileName;
            PArray  platforms;
            PArray  profiles;

            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 (unique)
                {
                    PDate   creationDate;
                    PString name;
                    int     index;

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

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

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

            return(list);
        }
Пример #16
0
        /// <summary>
        /// All installed provisioning profiles, sorted by newest first.
        /// </summary>
        public static IList <MobileProvision> GetAllInstalledProvisions(MobileProvisionPlatform platform, bool includeExpired)
        {
            if (!Directory.Exists(ProfileDirectory))
            {
                return(new MobileProvision[0]);
            }

            var    uuids = new Dictionary <string, MobileProvision> ();
            var    list  = new List <MobileProvision> ();
            var    now   = DateTime.Now;
            string pattern;

            switch (platform)
            {
            case MobileProvisionPlatform.MacOS:
                pattern = "*.provisionprofile";
                break;

            case MobileProvisionPlatform.tvOS:
            case MobileProvisionPlatform.iOS:
                pattern = "*.mobileprovision";
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(platform));
            }

            foreach (var file in Directory.EnumerateFiles(ProfileDirectory, pattern))
            {
                try {
                    var data = File.ReadAllBytes(file);

                    var m = new MobileProvision();
                    m.Load(PDictionary.FromBinaryXml(data));
                    m.Data = data;

                    if (includeExpired || m.ExpirationDate > now)
                    {
                        if (uuids.ContainsKey(m.Uuid))
                        {
                            // we always want the most recently created/updated provision
                            if (m.CreationDate > uuids[m.Uuid].CreationDate)
                            {
                                int index = list.IndexOf(uuids[m.Uuid]);
                                uuids[m.Uuid] = m;
                                list[index]   = m;
                            }
                        }
                        else
                        {
                            uuids.Add(m.Uuid, m);
                            list.Add(m);
                        }
                    }
                } catch (Exception ex) {
                    LoggingService.LogWarning("Error reading " + platform + " provision file '" + file + "'", ex);
                }
            }

            //newest first
            list.Sort((x, y) => y.CreationDate.CompareTo(x.CreationDate));

            return(list);
        }
Пример #17
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);
        }
        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);
        }
Пример #20
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);
        }
Пример #21
0
 protected virtual MobileProvision GetMobileProvision(MobileProvisionPlatform platform, string name)
 {
     return(MobileProvisionIndex.GetMobileProvision(platform, name));
 }
Пример #22
0
        public static IList <MobileProvision> GetMobileProvisions(MobileProvisionPlatform platform, MobileProvisionDistributionType type, bool includeExpired = false, bool unique = false)
        {
            var extension  = MobileProvision.GetFileExtension(platform);
            var dictionary = new Dictionary <string, int> ();
            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;
                    }
                }

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

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

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

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

            return(list);
        }