diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index 618c9ad8..05328c0b 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -1185,9 +1185,15 @@ private extension AppManager return } */ - guard let extensions = context.app?.appExtensions else { throw OperationError.invalidParameters } + guard let extensions = context.app?.appExtensions else { + throw OperationError.invalidParameters("AppManager._install.removeAppExtensionsOperation: context.app?.appExtensions is nil") + } - guard let app = context.app, let presentingViewController = context.authenticatedContext.presentingViewController else { throw OperationError.invalidParameters } + guard let app = context.app, + let presentingViewController = context.authenticatedContext.presentingViewController + else { + throw OperationError.invalidParameters("AppManager._install.removeAppExtensionsOperation: context.app or context.authenticatedContext.presentingViewController is nil") + } self?.removeAppExtensions(from: app, extensions: extensions, presentingViewController) { result in @@ -1253,13 +1259,20 @@ private extension AppManager throw error } - guard let profiles = context.provisioningProfiles else { throw OperationError.invalidParameters } + guard let profiles = context.provisioningProfiles else { + throw OperationError.invalidParameters("AppManager._install.deactivateAppsOperation: context.provisioningProfiles is nil") + } if !profiles.contains(where: { $1.isFreeProvisioningProfile == true }) { operation.finish() return } - guard let app = context.app, let presentingViewController = context.authenticatedContext.presentingViewController else { throw OperationError.invalidParameters } + guard + let app = context.app, + let presentingViewController = context.authenticatedContext.presentingViewController + else { + throw OperationError.invalidParameters("AppManager._install.deactivateAppsOperation: self.context.app or context.authenticatedContext.presentingViewController is nil") + } self?.deactivateApps(for: app, presentingViewController: presentingViewController) { result in switch result @@ -1298,7 +1311,9 @@ private extension AppManager throw error } - guard let app = context.app else { throw OperationError.invalidParameters } + guard let app = context.app else { + throw OperationError.invalidParameters("AppManager._install.patchAppOperation: context.app is nil") + } guard let isUntetherRequired = app.bundle.infoDictionary?[Bundle.Info.untetherRequired] as? Bool, let minimumiOSVersionString = app.bundle.infoDictionary?[Bundle.Info.untetherMinimumiOSVersion] as? String, diff --git a/AltStore/My Apps/MyAppsViewController.swift b/AltStore/My Apps/MyAppsViewController.swift index 58d724c7..5ad7b899 100644 --- a/AltStore/My Apps/MyAppsViewController.swift +++ b/AltStore/My Apps/MyAppsViewController.swift @@ -791,7 +791,9 @@ private extension MyAppsViewController throw error } - guard let fileURL = context.fileURL else { throw OperationError.invalidParameters } + guard let fileURL = context.fileURL else { + throw OperationError.invalidParameters("MyAppsViewController.sideloadApp.unzipAppOperation: context.fileURL is nil") + } defer { try? FileManager.default.removeItem(at: fileURL) } @@ -825,7 +827,9 @@ private extension MyAppsViewController throw error } - guard let application = context.application else { throw OperationError.invalidParameters } + guard let application = context.application else { + throw OperationError.invalidParameters("MyAppsViewController.sideloadApp.installAppOperation: context.application is nil") + } let group = AppManager.shared.install(application, presentingViewController: self) { (result) in switch result diff --git a/AltStore/Operations/BackupAppOperation.swift b/AltStore/Operations/BackupAppOperation.swift index a6a7247f..9ce929d6 100644 --- a/AltStore/Operations/BackupAppOperation.swift +++ b/AltStore/Operations/BackupAppOperation.swift @@ -48,7 +48,9 @@ class BackupAppOperation: ResultOperation { if let error = self.context.error { throw error } - guard let installedApp = self.context.installedApp, let context = installedApp.managedObjectContext else { throw OperationError.invalidParameters } + guard let installedApp = self.context.installedApp, let context = installedApp.managedObjectContext else { + throw OperationError.invalidParameters("BackupAppOperation.main: self.context.installedApp or installedApp.managedObjectContext is nil") + } context.perform { do { diff --git a/AltStore/Operations/EnableJITOperation.swift b/AltStore/Operations/EnableJITOperation.swift index fd2cd3cb..ff1f8804 100644 --- a/AltStore/Operations/EnableJITOperation.swift +++ b/AltStore/Operations/EnableJITOperation.swift @@ -50,7 +50,9 @@ final class EnableJITOperation: ResultOperation return } - guard let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) } + guard let installedApp = self.context.installedApp else { + return self.finish(.failure(OperationError.invalidParameters("EnableJITOperation.main: self.context.installedApp is nil"))) + } if #available(iOS 17, *) { let sideJITenabled = UserDefaults.standard.sidejitenable let SideJITIP = UserDefaults.standard.textInputSideJITServerurl ?? "" diff --git a/AltStore/Operations/FetchAppIDsOperation.swift b/AltStore/Operations/FetchAppIDsOperation.swift index 4f75c9e7..b45ff65c 100644 --- a/AltStore/Operations/FetchAppIDsOperation.swift +++ b/AltStore/Operations/FetchAppIDsOperation.swift @@ -39,7 +39,9 @@ final class FetchAppIDsOperation: ResultOperation<([AppID], NSManagedObjectConte guard let team = self.context.team, let session = self.context.session - else { return self.finish(.failure(OperationError.invalidParameters)) } + else { + return self.finish(.failure(OperationError.invalidParameters("FetchAppIDsOperation.main: self.context.team or self.context.session is nil"))) + } ALTAppleAPI.shared.fetchAppIDs(for: team, session: session) { (appIDs, error) in self.managedObjectContext.perform { diff --git a/AltStore/Operations/FetchProvisioningProfilesOperation.swift b/AltStore/Operations/FetchProvisioningProfilesOperation.swift index 730db3d9..ace2ff09 100644 --- a/AltStore/Operations/FetchProvisioningProfilesOperation.swift +++ b/AltStore/Operations/FetchProvisioningProfilesOperation.swift @@ -43,7 +43,8 @@ final class FetchProvisioningProfilesOperation: ResultOperation<[String: ALTProv guard let team = self.context.team, let session = self.context.session - else { return self.finish(.failure(OperationError.invalidParameters)) } + else { + return self.finish(.failure(OperationError.invalidParameters("FetchProvisioningProfilesOperation.main: self.context.team or self.context.session is nil"))) } guard let app = self.context.app else { return self.finish(.failure(OperationError.appNotFound(name: nil))) } diff --git a/AltStore/Operations/InstallAppOperation.swift b/AltStore/Operations/InstallAppOperation.swift index 4db5f93e..3933351e 100644 --- a/AltStore/Operations/InstallAppOperation.swift +++ b/AltStore/Operations/InstallAppOperation.swift @@ -43,7 +43,9 @@ final class InstallAppOperation: ResultOperation let certificate = self.context.certificate, let resignedApp = self.context.resignedApp, let provisioningProfiles = self.context.provisioningProfiles - else { return self.finish(.failure(OperationError.invalidParameters)) } + else { + return self.finish(.failure(OperationError.invalidParameters("InstallAppOperation.main: self.context.certificate or self.context.resignedApp or self.context.provisioningProfiles is nil"))) + } let backgroundContext = DatabaseManager.shared.persistentContainer.newBackgroundContext() backgroundContext.perform { diff --git a/AltStore/Operations/OperationError.swift b/AltStore/Operations/OperationError.swift index d2155809..b98f630f 100644 --- a/AltStore/Operations/OperationError.swift +++ b/AltStore/Operations/OperationError.swift @@ -56,7 +56,6 @@ extension OperationError static let notAuthenticated: OperationError = .init(code: .notAuthenticated) static let unknownUDID: OperationError = .init(code: .unknownUDID) static let invalidApp: OperationError = .init(code: .invalidApp) - static let invalidParameters: OperationError = .init(code: .invalidParameters) static let noSources: OperationError = .init(code: .noSources) static let missingAppGroup: OperationError = .init(code: .missingAppGroup) @@ -112,6 +111,9 @@ extension OperationError OperationError(code: .refreshAppFailed, failureReason: message) } + static func invalidParameters(_ message: String? = nil) -> OperationError { + OperationError(code: .invalidParameters, failureReason: message) + } } @@ -160,7 +162,6 @@ struct OperationError: ALTLocalizedError { case .notAuthenticated: return NSLocalizedString("You are not signed in.", comment: "") case .unknownUDID: return NSLocalizedString("SideStore could not determine this device's UDID.", comment: "") case .invalidApp: return NSLocalizedString("The app is in an invalid format.", comment: "") - case .invalidParameters: return NSLocalizedString("Invalid parameters.", comment: "") case .maximumAppIDLimitReached: return NSLocalizedString("Cannot register more than 10 App IDs within a 7 day period.", comment: "") case .noSources: return NSLocalizedString("There are no SideStore sources.", comment: "") case .missingAppGroup: return NSLocalizedString("SideStore's shared app group could not be accessed.", comment: "") @@ -186,7 +187,11 @@ struct OperationError: ALTLocalizedError { let message = self._failureReason ?? "" return String(format: NSLocalizedString("Unable to refresh App\n%@", comment: ""), message) + case .invalidParameters: + let message = self._failureReason.map { ": \n\($0)" } ?? "." + return String(format: NSLocalizedString("Invalid parameters%@", comment: ""), message) } + } var recoverySuggestion: String? { diff --git a/AltStore/Operations/Patch App/PatchAppOperation.swift b/AltStore/Operations/Patch App/PatchAppOperation.swift index 6eb9b08a..3cd4b583 100644 --- a/AltStore/Operations/Patch App/PatchAppOperation.swift +++ b/AltStore/Operations/Patch App/PatchAppOperation.swift @@ -98,7 +98,9 @@ final class PatchAppOperation: ResultOperation return } - guard let resignedApp = self.context.resignedApp else { return self.finish(.failure(OperationError.invalidParameters)) } + guard let resignedApp = self.context.resignedApp else { + return self.finish(.failure(OperationError.invalidParameters("PatchAppOperation.main: self.context.resignedApp is nil"))) + } self.progressHandler?(self.progress, NSLocalizedString("Downloading iOS firmware...", comment: "")) diff --git a/AltStore/Operations/RefreshAppOperation.swift b/AltStore/Operations/RefreshAppOperation.swift index 8f7a17c1..d4a1f236 100644 --- a/AltStore/Operations/RefreshAppOperation.swift +++ b/AltStore/Operations/RefreshAppOperation.swift @@ -37,7 +37,10 @@ final class RefreshAppOperation: ResultOperation { if let error = self.context.error { return self.finish(.failure(error)) } - guard let profiles = self.context.provisioningProfiles else { return self.finish(.failure(OperationError.invalidParameters)) } + guard let profiles = self.context.provisioningProfiles else { + return self.finish(.failure(OperationError.invalidParameters("RefreshAppOperation.main: self.context.provisioningProfiles is nil"))) + } + guard let app = self.context.app else { return self.finish(.failure(OperationError(.appNotFound(name: nil)))) } for p in profiles { diff --git a/AltStore/Operations/RemoveAppBackupOperation.swift b/AltStore/Operations/RemoveAppBackupOperation.swift index 24df7ba2..9b003e06 100644 --- a/AltStore/Operations/RemoveAppBackupOperation.swift +++ b/AltStore/Operations/RemoveAppBackupOperation.swift @@ -35,7 +35,9 @@ final class RemoveAppBackupOperation: ResultOperation return } - guard let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) } + guard let installedApp = self.context.installedApp else { + return self.finish(.failure(OperationError.invalidParameters("RemoveAppBackupOperation.main: self.context.installedApp is nil"))) + } installedApp.managedObjectContext?.perform { guard let backupDirectoryURL = FileManager.default.backupDirectoryURL(for: installedApp) else { return self.finish(.failure(OperationError.missingAppGroup)) } diff --git a/AltStore/Operations/RemoveAppOperation.swift b/AltStore/Operations/RemoveAppOperation.swift index 46400cfa..9b5320bc 100644 --- a/AltStore/Operations/RemoveAppOperation.swift +++ b/AltStore/Operations/RemoveAppOperation.swift @@ -33,7 +33,9 @@ final class RemoveAppOperation: ResultOperation return } - guard let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) } + guard let installedApp = self.context.installedApp else { + return self.finish(.failure(OperationError.invalidParameters("RemoveAppOperation.main: self.context.installedApp is nil"))) + } installedApp.managedObjectContext?.perform { let resignedBundleIdentifier = installedApp.resignedBundleIdentifier diff --git a/AltStore/Operations/ResignAppOperation.swift b/AltStore/Operations/ResignAppOperation.swift index 859f3868..f12c4a3c 100644 --- a/AltStore/Operations/ResignAppOperation.swift +++ b/AltStore/Operations/ResignAppOperation.swift @@ -42,7 +42,12 @@ final class ResignAppOperation: ResultOperation let profiles = self.context.provisioningProfiles, let team = self.context.team, let certificate = self.context.certificate - else { return self.finish(.failure(OperationError.invalidParameters)) } + else { + return self.finish(.failure(OperationError.invalidParameters("ResignAppOperation.main: " + + "self.context.team or " + + "self.context.provisioningProfiles or" + + "self.context.certificate is nil"))) + } // Prepare app bundle let prepareAppProgress = Progress.discreteProgress(totalUnitCount: 2) diff --git a/AltStore/Operations/SendAppOperation.swift b/AltStore/Operations/SendAppOperation.swift index 1ed6fd67..99f2b3e0 100644 --- a/AltStore/Operations/SendAppOperation.swift +++ b/AltStore/Operations/SendAppOperation.swift @@ -36,7 +36,9 @@ final class SendAppOperation: ResultOperation<()> return self.finish(.failure(error)) } - guard let resignedApp = self.context.resignedApp else { return self.finish(.failure(OperationError.invalidParameters)) } + guard let resignedApp = self.context.resignedApp else { + return self.finish(.failure(OperationError.invalidParameters("SendAppOperation.main: self.resignedApp is nil"))) + } // self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa. let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.fileURL) diff --git a/AltStore/Operations/VerifyAppOperation.swift b/AltStore/Operations/VerifyAppOperation.swift index 5fc94972..4c946e9a 100644 --- a/AltStore/Operations/VerifyAppOperation.swift +++ b/AltStore/Operations/VerifyAppOperation.swift @@ -117,7 +117,9 @@ final class VerifyAppOperation: ResultOperation throw error } - guard let app = self.context.app else { throw OperationError.invalidParameters } + guard let app = self.context.app else { + throw OperationError.invalidParameters("VerifyAppOperation.main: self.context.app is nil") + } if !["ny.litritt.ignited", "com.litritt.ignited"].contains(where: { $0 == app.bundleIdentifier }) { guard app.bundleIdentifier == self.context.bundleIdentifier else {