From 664c31aba865edc427271f9a1f8a8ebe4681044d Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Wed, 1 Apr 2020 12:19:25 -0700 Subject: [PATCH] =?UTF-8?q?[AltServer]=20Removes=20duplicate=20profiles=20?= =?UTF-8?q?even=20if=20they=E2=80=99re=20excluded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AltServer/Devices/ALTDeviceManager.mm | 37 +++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/AltServer/Devices/ALTDeviceManager.mm b/AltServer/Devices/ALTDeviceManager.mm index 8d17568e..3711fb11 100644 --- a/AltServer/Devices/ALTDeviceManager.mm +++ b/AltServer/Devices/ALTDeviceManager.mm @@ -656,7 +656,8 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT misagent:(misagent_client_t)mis error:(NSError **)error { - NSMutableDictionary *cachedProfiles = [NSMutableDictionary dictionary]; + NSMutableDictionary *ignoredProfiles = [NSMutableDictionary dictionary]; + NSMutableDictionary *removedProfiles = [NSMutableDictionary dictionary]; NSArray *provisioningProfiles = [self copyProvisioningProfilesWithClient:mis error:error]; if (provisioningProfiles == nil) @@ -678,20 +679,46 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT if (excludedBundleIdentifiers != nil && [excludedBundleIdentifiers containsObject:provisioningProfile.bundleIdentifier]) { + // This provisioning profile has an excluded bundle identifier. + // Ignore it, unless we've already ignored one with the same bundle identifier, + // in which case remove whichever profile is the oldest. + + ALTProvisioningProfile *previousProfile = ignoredProfiles[provisioningProfile.bundleIdentifier]; + if (previousProfile != nil) + { + // We've already ignored a profile with this bundle identifier, + // so make sure we only ignore the newest one and remove the oldest one. + BOOL isNewerThanPreviousProfile = ([provisioningProfile.expirationDate compare:previousProfile.expirationDate] == NSOrderedDescending); + ALTProvisioningProfile *oldestProfile = isNewerThanPreviousProfile ? previousProfile : provisioningProfile; + ALTProvisioningProfile *newestProfile = isNewerThanPreviousProfile ? provisioningProfile : previousProfile; + + ignoredProfiles[provisioningProfile.bundleIdentifier] = newestProfile; + + // Don't cache this profile or else it will be reinstalled, so just remove it without caching. + if (![self removeProvisioningProfile:oldestProfile misagent:mis error:error]) + { + return nil; + } + } + else + { + ignoredProfiles[provisioningProfile.bundleIdentifier] = provisioningProfile; + } + continue; } - ALTProvisioningProfile *preferredProfile = cachedProfiles[provisioningProfile.bundleIdentifier]; + ALTProvisioningProfile *preferredProfile = removedProfiles[provisioningProfile.bundleIdentifier]; if (preferredProfile != nil) { if ([provisioningProfile.expirationDate compare:preferredProfile.expirationDate] == NSOrderedDescending) { - cachedProfiles[provisioningProfile.bundleIdentifier] = provisioningProfile; + removedProfiles[provisioningProfile.bundleIdentifier] = provisioningProfile; } } else { - cachedProfiles[provisioningProfile.bundleIdentifier] = provisioningProfile; + removedProfiles[provisioningProfile.bundleIdentifier] = provisioningProfile; } if (![self removeProvisioningProfile:provisioningProfile misagent:mis error:error]) @@ -700,7 +727,7 @@ NSNotificationName const ALTDeviceManagerDeviceDidDisconnectNotification = @"ALT } } - return cachedProfiles; + return removedProfiles; } - (BOOL)installProvisioningProfile:(ALTProvisioningProfile *)provisioningProfile misagent:(misagent_client_t)mis error:(NSError **)error