diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 1ebc27c8..37231608 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -308,6 +308,16 @@ BFE60742231B07E6002B0E8E /* SettingsHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE60741231B07E6002B0E8E /* SettingsHeaderFooterView.swift */; }; BFE6325A22A83BEB00F30809 /* Authentication.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFE6325922A83BEB00F30809 /* Authentication.storyboard */; }; BFE6326C22A86FF300F30809 /* AuthenticationOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */; }; + BFE972E3260A8B2700D0BDAC /* NSError+libimobiledevice.mm in Sources */ = {isa = PBXBuildFile; fileRef = BFE972E2260A8B2700D0BDAC /* NSError+libimobiledevice.mm */; }; + BFECAC7F24FD950B0077C41F /* CodableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableError.swift */; }; + BFECAC8024FD950B0077C41F /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF22485828200DD5981 /* ConnectionManager.swift */; }; + BFECAC8124FD950B0077C41F /* ALTServerError+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */; }; + BFECAC8224FD950B0077C41F /* ServerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3128229F474900370A3C /* ServerProtocol.swift */; }; + BFECAC8324FD950B0077C41F /* NetworkConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CD2489ABE90097E58C /* NetworkConnection.swift */; }; + BFECAC8424FD950B0077C41F /* ALTConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = BF718BD723C93DB700A89F2D /* ALTConstants.m */; }; + BFECAC8524FD950B0077C41F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF624858BDE00DD5981 /* Connection.swift */; }; + BFECAC8624FD950B0077C41F /* Result+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBAC8852295C90300587369 /* Result+Conveniences.swift */; }; + BFECAC8724FD950B0077C41F /* Bundle+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */; }; BFECAC8824FD950E0077C41F /* CodableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableError.swift */; }; BFECAC8924FD950E0077C41F /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF22485828200DD5981 /* ConnectionManager.swift */; }; BFECAC8A24FD950E0077C41F /* ALTServerError+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */; }; @@ -331,9 +341,13 @@ BFF435D8255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF435D7255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift */; }; BFF615A82510042B00484D3B /* AltStoreCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */; }; BFF7C9342578492100E55F36 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; }; + D51AD27E29356B7B00967AAA /* ALTWrappedError.h in Headers */ = {isa = PBXBuildFile; fileRef = D51AD27C29356B7B00967AAA /* ALTWrappedError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D51AD27F29356B7B00967AAA /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = D51AD27D29356B7B00967AAA /* ALTWrappedError.m */; }; + D51AD28029356B8000967AAA /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = D51AD27D29356B7B00967AAA /* ALTWrappedError.m */; }; D52C08EE28AEC37A006C4AE5 /* AppVersion.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */; }; D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D533E8B62727841800A9B5DD /* libAppleArchive.tbd */; settings = {ATTRIBUTES = (Weak, ); }; }; D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D533E8BD2727BBF800A9B5DD /* libcurl.a */; }; + D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D540E93728EE1BDE000F1B0F /* ErrorDetailsViewController.swift */; }; D54DED1428CBC44B008B27A0 /* ErrorLogTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */; }; D55E163728776CB700A627A1 /* ComplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D55E163528776CB000A627A1 /* ComplicationView.swift */; }; D57DF638271E32F000677701 /* PatchApp.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D57DF637271E32F000677701 /* PatchApp.storyboard */; }; @@ -348,8 +362,12 @@ D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */; }; D5DAE0942804B0B80034D8D4 /* ScreenshotProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DAE0932804B0B80034D8D4 /* ScreenshotProcessor.swift */; }; D5DAE0962804DF430034D8D4 /* UpdatePatronsOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */; }; + D5DB145A28F9DC5A00A8F606 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */; }; + D5DB145B28F9DC5C00A8F606 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */; }; D5E1E7C128077DE90016FC96 /* FetchTrustedSourcesOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5E1E7C028077DE90016FC96 /* FetchTrustedSourcesOperation.swift */; }; + D5E3FB9828FDFAD90034B72C /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; D5F2F6A92720B7C20081CCF5 /* PatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */; }; + D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */; }; D5F99A1828D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */; }; D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */; }; /* End PBXBuildFile section */ @@ -847,12 +865,15 @@ D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersion.swift; sourceTree = ""; }; D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 11.xcdatamodel"; sourceTree = ""; }; C9EEAA842DA87A88A870053B /* Pods_AltStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D51AD27C29356B7B00967AAA /* ALTWrappedError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTWrappedError.h; sourceTree = ""; }; + D51AD27D29356B7B00967AAA /* ALTWrappedError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTWrappedError.m; sourceTree = ""; }; D52C08ED28AEC37A006C4AE5 /* AppVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersion.swift; sourceTree = ""; }; D52E988928D002D30032BE6B /* AltStore 11.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 11.xcdatamodel"; sourceTree = ""; }; D533E8B62727841800A9B5DD /* libAppleArchive.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libAppleArchive.tbd; path = usr/lib/libAppleArchive.tbd; sourceTree = SDKROOT; }; D533E8B82727B61400A9B5DD /* fragmentzip.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = fragmentzip.h; sourceTree = ""; }; D533E8BB2727BBEE00A9B5DD /* libfragmentzip.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libfragmentzip.a; path = Dependencies/fragmentzip/libfragmentzip.a; sourceTree = SOURCE_ROOT; }; D533E8BD2727BBF800A9B5DD /* libcurl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcurl.a; path = Dependencies/libcurl/libcurl.a; sourceTree = SOURCE_ROOT; }; + D540E93728EE1BDE000F1B0F /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = ""; }; D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogTableViewCell.swift; sourceTree = ""; }; D55E163528776CB000A627A1 /* ComplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplicationView.swift; sourceTree = ""; }; D57DF637271E32F000677701 /* PatchApp.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = PatchApp.storyboard; sourceTree = ""; }; @@ -869,8 +890,10 @@ D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore9ToAltStore10.xcmappingmodel; sourceTree = ""; }; D5DAE0932804B0B80034D8D4 /* ScreenshotProcessor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotProcessor.swift; sourceTree = ""; }; D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePatronsOperation.swift; sourceTree = ""; }; + D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTLocalizedError.swift; sourceTree = ""; }; D5E1E7C028077DE90016FC96 /* FetchTrustedSourcesOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchTrustedSourcesOperation.swift; sourceTree = ""; }; D5F2F6A82720B7C20081CCF5 /* PatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchViewController.swift; sourceTree = ""; }; + D5F5AF7C28ECEA990067C736 /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = ""; }; D5F99A1728D11DB500476A16 /* AltStore10ToAltStore11.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore10ToAltStore11.xcmappingmodel; sourceTree = ""; }; D5F99A1928D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreApp10ToStoreApp11Policy.swift; sourceTree = ""; }; EA79A60285C6AF5848AA16E9 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStore.debug.xcconfig"; path = "Target Support Files/Pods-AltStore/Pods-AltStore.debug.xcconfig"; sourceTree = ""; }; @@ -1829,6 +1852,16 @@ path = "Error Log"; sourceTree = ""; }; + D5DB145728F9DC0300A8F606 /* Errors */ = { + isa = PBXGroup; + children = ( + D5DB145828F9DC1000A8F606 /* ALTLocalizedError.swift */, + D51AD27C29356B7B00967AAA /* ALTWrappedError.h */, + D51AD27D29356B7B00967AAA /* ALTWrappedError.m */, + ); + path = Errors; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -2337,6 +2370,47 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BF458689229872EA00BD7491 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BFF767C82489A74E0097E58C /* WirelessConnectionHandler.swift in Sources */, + BFF0394B25F0551600BE607D /* MenuController.swift in Sources */, + BFECAC8024FD950B0077C41F /* ConnectionManager.swift in Sources */, + BFC15ADA27BC352300ED2FB4 /* PluginVersion.swift in Sources */, + BFECAC8324FD950B0077C41F /* NetworkConnection.swift in Sources */, + BF541C0B25E5A5FA00CD46B2 /* FileManager+URLs.swift in Sources */, + BFECAC8724FD950B0077C41F /* Bundle+AltStore.swift in Sources */, + BF3F786422CAA41E008FBD20 /* ALTDeviceManager+Installation.swift in Sources */, + BF18BFFD2485A1E400DD5981 /* WiredConnectionHandler.swift in Sources */, + BFC712BB2512B9CF00AB5EBE /* PluginManager.swift in Sources */, + BFECAC8224FD950B0077C41F /* ServerProtocol.swift in Sources */, + BFECAC8124FD950B0077C41F /* ALTServerError+Conveniences.swift in Sources */, + BFECAC7F24FD950B0077C41F /* CodableError.swift in Sources */, + D51AD28029356B8000967AAA /* ALTWrappedError.m in Sources */, + BFECAC8624FD950B0077C41F /* Result+Conveniences.swift in Sources */, + BF265D1925F843A000080DC9 /* NSError+AltStore.swift in Sources */, + BF904DEA265DAE9A00E86C2A /* InstalledApp.swift in Sources */, + BFF435D9255CBDAB00DD724F /* ALTApplication+AltStoreApp.swift in Sources */, + BF718BD523C928A300A89F2D /* ALTNotificationConnection.mm in Sources */, + BF1E312B229F474900370A3C /* RequestHandler.swift in Sources */, + BF718BD123C91BD300A89F2D /* ALTWiredConnection.mm in Sources */, + BFAD678E25E0649500D4C4D1 /* ALTDebugConnection.mm in Sources */, + BFECAC8524FD950B0077C41F /* Connection.swift in Sources */, + BF458690229872EA00BD7491 /* AppDelegate.swift in Sources */, + BFECAC8424FD950B0077C41F /* ALTConstants.m in Sources */, + BF4586C52298CDB800BD7491 /* ALTDeviceManager.mm in Sources */, + BF0241AA22F29CCD00129732 /* UserDefaults+AltServer.swift in Sources */, + BFECAC9424FD98BA0077C41F /* NSError+ALTServerError.m in Sources */, + BFAD67A325E0854500D4C4D1 /* DeveloperDiskManager.swift in Sources */, + D5F5AF7D28ECEA990067C736 /* ErrorDetailsViewController.swift in Sources */, + BFECAC9324FD98BA0077C41F /* CFNotificationName+AltStore.m in Sources */, + BFE48975238007CE003239E0 /* AnisetteDataManager.swift in Sources */, + D5DB145B28F9DC5C00A8F606 /* ALTLocalizedError.swift in Sources */, + BFE972E3260A8B2700D0BDAC /* NSError+libimobiledevice.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BF4587282298D31600BD7491 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2461,6 +2535,7 @@ BFBF331B2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel in Sources */, 0EE7FDC72BE8CF4100D1E390 /* ALTWrappedError.m in Sources */, D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */, + D51AD27F29356B7B00967AAA /* ALTWrappedError.m in Sources */, BF989184250AACFC002ACF50 /* Date+RelativeDate.swift in Sources */, BF66EE962501AEBC007EE018 /* ALTPatreonBenefitType.m in Sources */, BFAECC5A2501B0A400528F27 /* NetworkConnection.swift in Sources */, @@ -2478,6 +2553,7 @@ D5F99A1A28D12B1400476A16 /* StoreApp10ToStoreApp11Policy.swift in Sources */, BFAECC562501B0A400528F27 /* ALTServerError+Conveniences.swift in Sources */, BFAECC592501B0A400528F27 /* Result+Conveniences.swift in Sources */, + D5E3FB9828FDFAD90034B72C /* NSError+AltStore.swift in Sources */, BFAECC542501B0A400528F27 /* NSError+ALTServerError.m in Sources */, BF66EEE12501AECA007EE018 /* DatabaseManager.swift in Sources */, D52C08EE28AEC37A006C4AE5 /* AppVersion.swift in Sources */, @@ -2485,6 +2561,7 @@ BF66EECC2501AECA007EE018 /* Source.swift in Sources */, BF66EED72501AECA007EE018 /* InstalledApp.swift in Sources */, 0EE7FDC92BE8D07400D1E390 /* NSError+AltStore.swift in Sources */, + D5DB145A28F9DC5A00A8F606 /* ALTLocalizedError.swift in Sources */, BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */, BF1FE359251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */, BF66EEA62501AEC5007EE018 /* PatreonAPI.swift in Sources */, @@ -2520,6 +2597,7 @@ BF3D649D22E7AC1B00E9056B /* PermissionPopoverViewController.swift in Sources */, D57F2C9426E01BC700B9FA39 /* UIDevice+Vibration.swift in Sources */, BFD2478F2284C8F900981D42 /* Button.swift in Sources */, + D540E93828EE1BDE000F1B0F /* ErrorDetailsViewController.swift in Sources */, BF56D2AC23DF8E170006506D /* FetchAppIDsOperation.swift in Sources */, BFC1F38D22AEE3A4003AC21A /* DownloadAppOperation.swift in Sources */, BFE6073A231ADF82002B0E8E /* SettingsViewController.swift in Sources */, diff --git a/AltStore/Authentication/AuthenticationViewController.swift b/AltStore/Authentication/AuthenticationViewController.swift index 29200868..9b7ef53c 100644 --- a/AltStore/Authentication/AuthenticationViewController.swift +++ b/AltStore/Authentication/AuthenticationViewController.swift @@ -109,7 +109,6 @@ private extension AuthenticationViewController case .failure(let error as NSError): DispatchQueue.main.async { let error = error.withLocalizedTitle(NSLocalizedString("Failed to Log In", comment: "")) - let toastView = ToastView(error: error) toastView.show(in: self) toastView.textLabel.textColor = .altPrimary diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index b39178d6..c6f9bdd7 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -547,7 +547,6 @@ extension AppManager do { guard let result = results.values.first else { throw OperationError.unknown() } - let installedApp = try result.get() assert(installedApp.managedObjectContext != nil) @@ -612,7 +611,6 @@ extension AppManager do { guard let result = results.values.first else { throw OperationError.unknown() } - let installedApp = try result.get() assert(installedApp.managedObjectContext != nil) diff --git a/AltStore/Operations/AuthenticationOperation.swift b/AltStore/Operations/AuthenticationOperation.swift index 17b15ba9..5648d842 100644 --- a/AltStore/Operations/AuthenticationOperation.swift +++ b/AltStore/Operations/AuthenticationOperation.swift @@ -215,7 +215,6 @@ final class AuthenticationOperation: ResultOperation<(ALTTeam, ALTCertificate, A let account = Account.first(satisfying: NSPredicate(format: "%K == %@", #keyPath(Account.identifier), altTeam.account.identifier), in: context), let team = Team.first(satisfying: NSPredicate(format: "%K == %@", #keyPath(Team.identifier), altTeam.identifier), in: context) else { throw AuthenticationError(.noTeam) } - // Account account.isActiveAccount = true @@ -495,7 +494,6 @@ private extension AuthenticationOperation { let certificate = try Result(certificate, error).get() guard let privateKey = certificate.privateKey else { throw AuthenticationError(.missingPrivateKey) } - ALTAppleAPI.shared.fetchCertificates(for: team, session: session) { (certificates, error) in do { diff --git a/AltStore/Operations/DownloadAppOperation.swift b/AltStore/Operations/DownloadAppOperation.swift index e6651784..e465e20b 100644 --- a/AltStore/Operations/DownloadAppOperation.swift +++ b/AltStore/Operations/DownloadAppOperation.swift @@ -17,7 +17,6 @@ final class DownloadAppOperation: ResultOperation { let app: AppProtocol let context: AppOperationContext - private let appName: String private let bundleIdentifier: String private var sourceURL: URL? @@ -30,7 +29,6 @@ final class DownloadAppOperation: ResultOperation { self.app = app self.context = context - self.appName = app.name self.bundleIdentifier = app.bundleIdentifier self.sourceURL = app.url @@ -166,7 +164,6 @@ private extension DownloadAppOperation { var isDirectory: ObjCBool = false guard FileManager.default.fileExists(atPath: fileURL.path, isDirectory: &isDirectory) else { throw OperationError.appNotFound(name: self.appName) } - try FileManager.default.createDirectory(at: self.temporaryDirectory, withIntermediateDirectories: true, attributes: nil) let appBundleURL: URL @@ -315,7 +312,7 @@ private extension DownloadAppOperation } catch let error as DecodingError { - let nsError = (error as NSError).withLocalizedFailure(String(format: NSLocalizedString("Could not determine dependencies for %@.", comment: ""), application.name)) + let nsError = (error as NSError).withLocalizedFailure(String(format: NSLocalizedString("The dependencies for %@ could not be determined.", comment: ""), application.name)) completionHandler(.failure(nsError)) } catch @@ -347,7 +344,7 @@ private extension DownloadAppOperation } catch let error as NSError { - let localizedFailure = String(format: NSLocalizedString("The dependency '%@' could not be downloaded.", comment: ""), dependency.preferredFilename) + let localizedFailure = String(format: NSLocalizedString("The dependency “%@” could not be downloaded.", comment: ""), dependency.preferredFilename) completionHandler(.failure(error.withLocalizedFailure(localizedFailure))) } } diff --git a/AltStore/Operations/OperationError.swift b/AltStore/Operations/OperationError.swift index fc21d117..901cdfbe 100644 --- a/AltStore/Operations/OperationError.swift +++ b/AltStore/Operations/OperationError.swift @@ -194,6 +194,7 @@ struct OperationError: ALTLocalizedError { } } + private var _failureReason: String? var recoverySuggestion: String? { switch self.code diff --git a/AltStore/Operations/VerifyAppOperation.swift b/AltStore/Operations/VerifyAppOperation.swift index 7f0ce63e..85405d77 100644 --- a/AltStore/Operations/VerifyAppOperation.swift +++ b/AltStore/Operations/VerifyAppOperation.swift @@ -197,9 +197,9 @@ private extension VerifyAppOperation let permissions = entitlements.keys.sorted().joined(separator: "\n") let message = String(format: NSLocalizedString(""" You must allow access to these private permissions before continuing: - + %@ - + Private permissions allow apps to do more than normally allowed by iOS, including potentially accessing sensitive private data. Make sure to only install apps from sources you trust. """, comment: ""), permissions) diff --git a/AltStore/Settings/Error Log/ErrorLogViewController.swift b/AltStore/Settings/Error Log/ErrorLogViewController.swift index 092319eb..4c54ab97 100644 --- a/AltStore/Settings/Error Log/ErrorLogViewController.swift +++ b/AltStore/Settings/Error Log/ErrorLogViewController.swift @@ -46,15 +46,20 @@ final class ErrorLogViewController: UITableViewController self.tableView.dataSource = self.dataSource self.tableView.prefetchDataSource = self.dataSource } - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) + { guard let loggedError = sender as? LoggedError, segue.identifier == "showErrorDetails" else { return } - + let navigationController = segue.destination as! UINavigationController - + let errorDetailsViewController = navigationController.viewControllers.first as! ErrorDetailsViewController errorDetailsViewController.loggedError = loggedError } + + @IBAction private func unwindFromErrorDetails(_ segue: UIStoryboardSegue) + { + } } private extension ErrorLogViewController @@ -76,13 +81,7 @@ private extension ErrorLogViewController let cell = cell as! ErrorLogTableViewCell cell.dateLabel.text = self.timeFormatter.string(from: loggedError.date) cell.errorFailureLabel.text = loggedError.localizedFailure ?? NSLocalizedString("Operation Failed", comment: "") - - switch loggedError.domain - { - case AltServerErrorDomain: cell.errorCodeLabel?.text = String(format: NSLocalizedString("AltServer Error %@", comment: ""), NSNumber(value: loggedError.code)) - case OperationError.domain: cell.errorCodeLabel?.text = String(format: NSLocalizedString("AltStore Error %@", comment: ""), NSNumber(value: loggedError.code)) - default: cell.errorCodeLabel?.text = loggedError.error.localizedErrorCode - } + cell.errorCodeLabel.text = loggedError.error.localizedErrorCode let nsError = loggedError.error as NSError let errorDescription = [nsError.localizedDescription, nsError.localizedRecoverySuggestion].compactMap { $0 }.joined(separator: "\n\n") @@ -258,7 +257,7 @@ private extension ErrorLogViewController let baseURL = URL(string: "https://faq.altstore.io/getting-started/troubleshooting-guide")! var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false)! - let query = [loggedError.domain, "\(loggedError.code)"].joined(separator: "+") + let query = [loggedError.domain, "\(loggedError.error.displayCode)"].joined(separator: "+") components.queryItems = [URLQueryItem(name: "q", value: query)] let safariViewController = SFSafariViewController(url: components.url ?? baseURL) diff --git a/AltStore/Settings/Settings.storyboard b/AltStore/Settings/Settings.storyboard index 3478ae3c..e70c76f1 100644 --- a/AltStore/Settings/Settings.storyboard +++ b/AltStore/Settings/Settings.storyboard @@ -1288,5 +1288,8 @@ Settings by i cons from the Noun Project + + + diff --git a/AltStore/Sources/SourcesViewController.swift b/AltStore/Sources/SourcesViewController.swift index 42143714..0034f53c 100644 --- a/AltStore/Sources/SourcesViewController.swift +++ b/AltStore/Sources/SourcesViewController.swift @@ -17,14 +17,12 @@ struct SourceError: ALTLocalizedError enum Code: Int, ALTErrorCode { typealias Error = SourceError - case unsupported } var code: Code var errorTitle: String? var errorFailure: String? - @Managed var source: Source var errorFailureReason: String { diff --git a/AltStoreCore/Patreon/PatreonAPI.swift b/AltStoreCore/Patreon/PatreonAPI.swift index 0a0b34d1..0182a457 100644 --- a/AltStoreCore/Patreon/PatreonAPI.swift +++ b/AltStoreCore/Patreon/PatreonAPI.swift @@ -32,6 +32,23 @@ enum PatreonAPIErrorCode: Int, ALTErrorEnum, CaseIterable } } +typealias PatreonAPIError = PatreonAPIErrorCode.Error +enum PatreonAPIErrorCode: Int, ALTErrorEnum, CaseIterable +{ + case unknown + case notAuthenticated + case invalidAccessToken + + var errorFailureReason: String { + switch self + { + case .unknown: return NSLocalizedString("An unknown error occurred.", comment: "") + case .notAuthenticated: return NSLocalizedString("No connected Patreon account.", comment: "") + case .invalidAccessToken: return NSLocalizedString("Invalid access token.", comment: "") + } + } +} + extension PatreonAPI { enum AuthorizationType diff --git a/Shared/Categories/NSError+ALTServerError.m b/Shared/Categories/NSError+ALTServerError.m index a243f7e9..a0813546 100644 --- a/Shared/Categories/NSError+ALTServerError.m +++ b/Shared/Categories/NSError+ALTServerError.m @@ -80,7 +80,6 @@ NSErrorUserInfoKey const ALTOperatingSystemVersionErrorKey = @"ALTOperatingSyste NSError *underlyingError = self.userInfo[NSUnderlyingErrorKey]; return underlyingError.localizedDescription; } - default: return nil; } @@ -95,7 +94,6 @@ NSErrorUserInfoKey const ALTOperatingSystemVersionErrorKey = @"ALTOperatingSyste NSError *underlyingError = self.userInfo[NSUnderlyingErrorKey]; return underlyingError.alt_localizedFailure; } - case ALTServerErrorConnectionFailed: { NSError *underlyingError = self.userInfo[NSUnderlyingErrorKey]; @@ -135,6 +133,7 @@ NSErrorUserInfoKey const ALTOperatingSystemVersionErrorKey = @"ALTOperatingSyste return [NSString stringWithFormat:NSLocalizedString(@"Error code: %@", @""), underlyingErrorCode]; } + // Return nil because this is a "pass-through" error, so if underlyingError doesn't have failure reason, this doesn't either. return nil; } @@ -218,7 +217,7 @@ NSErrorUserInfoKey const ALTOperatingSystemVersionErrorKey = @"ALTOperatingSyste case ALTServerErrorIncompatibleDeveloperDisk: { NSString *osVersion = [self altserver_osVersion] ?: NSLocalizedString(@"this device's OS version", @""); - NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"The disk is incompatible with %@.", @""), osVersion]; + NSString *failureReason = [NSString stringWithFormat:NSLocalizedString(@"The disk is incompatible with %@.", @""), osVersion]; // "Developer" disk is included in localizedFailure return failureReason; } } diff --git a/Shared/Errors/ALTLocalizedError.swift b/Shared/Errors/ALTLocalizedError.swift index c2ab7fc2..6e01fbc3 100644 --- a/Shared/Errors/ALTLocalizedError.swift +++ b/Shared/Errors/ALTLocalizedError.swift @@ -32,7 +32,6 @@ public extension ALTLocalizedError get { nil } set {} } - var sourceLine: UInt? { get { nil } set {} @@ -42,14 +41,12 @@ public extension ALTLocalizedError public protocol ALTErrorCode: RawRepresentable where RawValue == Int { associatedtype Error: ALTLocalizedError where Error.Code == Self - static var errorDomain: String { get } // Optional } public protocol ALTErrorEnum: ALTErrorCode { associatedtype Error = DefaultLocalizedError - var errorFailureReason: String { get } } @@ -57,7 +54,6 @@ public protocol ALTErrorEnum: ALTErrorCode public extension ALTLocalizedError { var errorCode: Int { self.code.rawValue } - var errorDescription: String? { guard (self as NSError).localizedFailure == nil else { // Error has localizedFailure, so return nil to construct localizedDescription from it + localizedFailureReason. @@ -95,7 +91,6 @@ public extension ALTLocalizedError where Code: ALTErrorEnum static var errorDomain: String { return Code.errorDomain } - // ALTErrorEnum Codes provide their failure reason directly. var errorFailureReason: String { return self.code.errorFailureReason @@ -119,12 +114,10 @@ public extension ALTLocalizedError init(_ error: Self, localizedTitle: String? = nil, localizedFailure: String? = nil) { self = error - if let localizedTitle { self.errorTitle = localizedTitle } - if let localizedFailure { self.errorFailure = localizedFailure diff --git a/Shared/Errors/ALTWrappedError.m b/Shared/Errors/ALTWrappedError.m index 76cde5bd..77a89f3e 100644 --- a/Shared/Errors/ALTWrappedError.m +++ b/Shared/Errors/ALTWrappedError.m @@ -30,7 +30,6 @@ _wrappedError = [error copy]; } } - return self; } diff --git a/Shared/Extensions/ALTServerError+Conveniences.swift b/Shared/Extensions/ALTServerError+Conveniences.swift index 185ed775..882d1b06 100644 --- a/Shared/Extensions/ALTServerError+Conveniences.swift +++ b/Shared/Extensions/ALTServerError+Conveniences.swift @@ -21,9 +21,10 @@ public extension ALTServerError case is DecodingError: self = ALTServerError(.invalidRequest, underlyingError: error) case is EncodingError: self = ALTServerError(.invalidResponse, underlyingError: error) case let error as NSError: + // Assign error as underlying error, even if there already is one, + // because it'll still be accessible via error.underlyingError.underlyingError. var userInfo = error.userInfo userInfo[NSUnderlyingErrorKey] = error - self = ALTServerError(.underlyingError, userInfo: userInfo) } } diff --git a/Shared/Extensions/NSError+AltStore.swift b/Shared/Extensions/NSError+AltStore.swift index 4b85ed1f..16c00e13 100644 --- a/Shared/Extensions/NSError+AltStore.swift +++ b/Shared/Extensions/NSError+AltStore.swift @@ -77,7 +77,6 @@ public extension NSError userInfo[NSLocalizedFailureReasonErrorKey] = self.localizedFailureReason userInfo[NSLocalizedRecoverySuggestionErrorKey] = self.localizedRecoverySuggestion userInfo[NSDebugDescriptionErrorKey] = self.localizedDebugDescription - // Remove userInfo values that don't conform to NSSecureEncoding. userInfo = userInfo.filter { (key, value) in return (value as AnyObject) is NSSecureCoding diff --git a/Shared/Server Protocol/CodableError.swift b/Shared/Server Protocol/CodableError.swift index 86e8c215..1018dbb1 100644 --- a/Shared/Server Protocol/CodableError.swift +++ b/Shared/Server Protocol/CodableError.swift @@ -30,7 +30,6 @@ extension CodableError case codableError(CodableError) indirect case array([UserInfoValue]) indirect case dictionary([String: UserInfoValue]) - var value: Any? { switch self { @@ -43,7 +42,6 @@ extension CodableError case .dictionary(let dictionary): return dictionary.compactMapValues { $0.value } // .compactMapValues instead of .mapValues to ensure nil values are removed. } } - var codableValue: Codable? { switch self { @@ -54,12 +52,10 @@ extension CodableError let sanitizedError = nsError.sanitizedForSerialization() let data = try? NSKeyedArchiver.archivedData(withRootObject: sanitizedError, requiringSecureCoding: true) return data - case .array(let array): return array case .dictionary(let dictionary): return dictionary } } - init(_ rawValue: Any?) { switch rawValue @@ -72,7 +68,6 @@ extension CodableError default: self = .unknown } } - init(from decoder: Decoder) throws { let container = try decoder.singleValueContainer() @@ -180,30 +175,25 @@ struct CodableError: Codable provider?(self.error, NSLocalizedFailureReasonErrorKey) != nil || (self.error._domain == ALTServerError.errorDomain && self.error._code == ALTServerError.underlyingError.rawValue) ) - if !isRecognizedError { // Error not recognized, so copy over NSLocalizedDescriptionKey and NSLocalizedFailureReasonErrorKey. userInfo[NSLocalizedDescriptionKey] = userInfo[ErrorUserInfoKey.altLocalizedDescription] userInfo[NSLocalizedFailureReasonErrorKey] = userInfo[ErrorUserInfoKey.altLocalizedFailureReason] } - // Copy over NSLocalizedRecoverySuggestionErrorKey and NSDebugDescriptionErrorKey if provider returns nil. if provider?(self.error, NSLocalizedRecoverySuggestionErrorKey) == nil { userInfo[NSLocalizedRecoverySuggestionErrorKey] = userInfo[ErrorUserInfoKey.altLocalizedRecoverySuggestion] } - if provider?(self.error, NSDebugDescriptionErrorKey) == nil { userInfo[NSDebugDescriptionErrorKey] = userInfo[ErrorUserInfoKey.altDebugDescription] } - userInfo[ErrorUserInfoKey.altLocalizedDescription] = nil userInfo[ErrorUserInfoKey.altLocalizedFailureReason] = nil userInfo[ErrorUserInfoKey.altLocalizedRecoverySuggestion] = nil userInfo[ErrorUserInfoKey.altDebugDescription] = nil - self.userInfo = userInfo } else if let rawUserInfo = try container.decodeIfPresent([String: UserInfoValue].self, forKey: .legacyUserInfo) @@ -213,13 +203,11 @@ struct CodableError: Codable self.userInfo = userInfo } } - func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(self.errorDomain, forKey: .errorDomain) try container.encode(self.errorCode, forKey: .errorCode) - let rawLegacyUserInfo = self.userInfo?.compactMapValues { (value) -> UserInfoValue? in // .legacyUserInfo only supports String and NSError values. switch value