Skip to content

Commit

Permalink
Support loading profisioning profiles from both locations
Browse files Browse the repository at this point in the history
  • Loading branch information
jstedfast committed Aug 9, 2024
1 parent ce8955d commit 0683fa4
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 140 deletions.
6 changes: 4 additions & 2 deletions UnitTests/TestMobileProvisionIndex.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@
namespace UnitTests {
[TestFixture]
public class TestMobileProvisionIndex {
static readonly string[] ProfileDirectories = new string [] { "../../TestData/Provisioning Profiles" };

[Test]
public void TestCreateIndex ()
{
var index = MobileProvisionIndex.CreateIndex ("../../TestData/Provisioning Profiles", "profiles.index");
var index = MobileProvisionIndex.CreateIndex (ProfileDirectories, "profiles.index");

Assert.AreEqual (2, index.ProvisioningProfiles.Count);

Expand Down Expand Up @@ -77,7 +79,7 @@ public void TestCreateIndex ()
[Test]
public void TestOpenIndex ()
{
var index = MobileProvisionIndex.OpenIndex ("../../TestData/Provisioning Profiles", "profiles.index");
var index = MobileProvisionIndex.OpenIndex (ProfileDirectories, "profiles.index");

Assert.AreEqual (2, index.ProvisioningProfiles.Count);

Expand Down
75 changes: 37 additions & 38 deletions Xamarin.MacDev/MobileProvision.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,30 +50,27 @@ public class MobileProvision {
public const string AutomaticAppStore = "Automatic:AppStore";
public const string AutomaticInHouse = "Automatic:InHouse";
public const string AutomaticAdHoc = "Automatic:AdHoc";
public static readonly string ProfileDirectory;
public static readonly string[] ProfileDirectories;

static MobileProvision ()
{
if (Environment.OSVersion.Platform == PlatformID.MacOSX
|| Environment.OSVersion.Platform == PlatformID.Unix) {
string personal = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile);

// Xcode >= 16.x uses ~/Library/Developer/Xcode/UserData/Provisioning Profiles
string profileDir = Path.Combine (personal, "Library", "Developer", "Xcode", "UserData", "Provisioning Profiles");
ProfileDirectories = new string[] {
// Xcode >= 16.x uses ~/Library/Developer/Xcode/UserData/Provisioning Profiles
Path.Combine (personal, "Library", "Developer", "Xcode", "UserData", "Provisioning Profiles"),

if (!Directory.Exists (profileDir)) {
// Xcode < 16.x uses ~/Library/MobileDevice/Provisioning Profiles
profileDir = Path.Combine (personal, "Library", "MobileDevice", "Provisioning Profiles");
}

ProfileDirectory = profileDir;
Path.Combine (personal, "Library", "MobileDevice", "Provisioning Profiles"),
};
} else {
ProfileDirectory = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData),
"Xamarin",
"iOS",
"Provisioning",
"Profiles");
var appDataLocal = Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData);

ProfileDirectories = new string [] {
Path.Combine (appDataLocal, "Xamarin", "iOS", "Provisioning", "Profiles")
};
}
}

Expand Down Expand Up @@ -154,9 +151,6 @@ public static IList<MobileProvision> GetAllInstalledProvisions (MobileProvisionP
/// </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;
Expand All @@ -174,33 +168,38 @@ public static IList<MobileProvision> GetAllInstalledProvisions (MobileProvisionP
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;
foreach (var profileDir in ProfileDirectories) {
if (!Directory.Exists (profileDir))
continue;

foreach (var file in Directory.EnumerateFiles (profileDir, 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);
}
} else {
uuids.Add (m.Uuid, m);
list.Add (m);
}
} catch (Exception ex) {
LoggingService.LogWarning ("Error reading " + platform + " provision file '" + file + "'", ex);
}
} catch (Exception ex) {
LoggingService.LogWarning ("Error reading " + platform + " provision file '" + file + "'", ex);
}
}

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

return list;
Expand Down
Loading

0 comments on commit 0683fa4

Please sign in to comment.