From c9bffbe74fc601a011d9cfabb8e2cd6251863c53 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Mon, 30 Mar 2020 13:34:13 -0700 Subject: [PATCH] Deactivates beta apps when no longer a patron/signed in Prevents beta apps from taking up active app slots despite not being listed in My Apps --- AltStore/Patreon/PatreonAPI.swift | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/AltStore/Patreon/PatreonAPI.swift b/AltStore/Patreon/PatreonAPI.swift index a37d592e..ba5eda56 100644 --- a/AltStore/Patreon/PatreonAPI.swift +++ b/AltStore/Patreon/PatreonAPI.swift @@ -8,6 +8,7 @@ import Foundation import AuthenticationServices +import CoreData private let clientID = "ZMx0EGUWe4TVWYXNZZwK_fbIK5jHFVWoUf1Qb-sqNXmT-YzAGwDPxxq7ak3_W5Q2" private let clientSecret = "1hktsZB89QyN69cB4R0tu55R4TCPQGXxvebYUUh7Y-5TLSnRswuxs6OUjdJ74IJt" @@ -235,11 +236,13 @@ extension PatreonAPI func signOut(completion: @escaping (Result) -> Void) { DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in - let accounts = PatreonAccount.all(in: context, requestProperties: [\FetchRequest.returnsObjectsAsFaults: true]) - accounts.forEach(context.delete(_:)) - do { + let accounts = PatreonAccount.all(in: context, requestProperties: [\FetchRequest.returnsObjectsAsFaults: true]) + accounts.forEach(context.delete(_:)) + + self.deactivateBetaApps(in: context) + try context.save() Keychain.shared.patreonAccessToken = nil @@ -253,10 +256,7 @@ extension PatreonAPI } } } -} - -extension PatreonAPI -{ + func refreshPatreonAccount() { guard PatreonAPI.shared.isAuthenticated else { return } @@ -265,6 +265,13 @@ extension PatreonAPI do { let account = try result.get() + + if let context = account.managedObjectContext, !account.isPatron + { + // Deactivate all beta apps now that we're no longer a patron. + self.deactivateBetaApps(in: context) + } + try account.managedObjectContext?.save() } catch @@ -391,6 +398,15 @@ private extension PatreonAPI task.resume() } + + func deactivateBetaApps(in context: NSManagedObjectContext) + { + let predicate = NSPredicate(format: "%K != %@ AND %K != nil AND %K == YES", + #keyPath(InstalledApp.bundleIdentifier), StoreApp.altstoreAppID, #keyPath(InstalledApp.storeApp), #keyPath(InstalledApp.storeApp.isBeta)) + + let installedApps = InstalledApp.all(satisfying: predicate, in: context) + installedApps.forEach { $0.isActive = false } + } } @available(iOS 13.0, *)