From a451b0178ef3655f3eef53ae946eee4530ac57a4 Mon Sep 17 00:00:00 2001 From: Riley Testut Date: Thu, 25 Jul 2019 14:04:26 -0700 Subject: [PATCH] [AltStore] Validates minimum iOS version when installing apps --- .../Operations/DownloadAppOperation.swift | 22 ++++++++++++------- AltStore/Operations/OperationError.swift | 14 ++++++++++++ Dependencies/AltSign | 2 +- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/AltStore/Operations/DownloadAppOperation.swift b/AltStore/Operations/DownloadAppOperation.swift index 6c587723..f7f0d9a5 100644 --- a/AltStore/Operations/DownloadAppOperation.swift +++ b/AltStore/Operations/DownloadAppOperation.swift @@ -52,25 +52,31 @@ class DownloadAppOperation: ResultOperation var isDirectory: ObjCBool = false guard FileManager.default.fileExists(atPath: fileURL.path, isDirectory: &isDirectory) else { throw OperationError.appNotFound } + let temporaryDirectory = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) + try FileManager.default.createDirectory(at: temporaryDirectory, withIntermediateDirectories: true, attributes: nil) + defer { try? FileManager.default.removeItem(at: temporaryDirectory) } + + let appBundleURL: URL + if isDirectory.boolValue { // Directory, so assuming this is .app bundle. guard Bundle(url: fileURL) != nil else { throw OperationError.invalidApp } - try FileManager.default.copyItem(at: fileURL, to: self.destinationURL, shouldReplace: true) + appBundleURL = fileURL } else { // File, so assuming this is a .ipa file. - - let temporaryDirectory = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) - try FileManager.default.createDirectory(at: temporaryDirectory, withIntermediateDirectories: true, attributes: nil) - defer { try? FileManager.default.removeItem(at: temporaryDirectory) } - - let bundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: temporaryDirectory) - try FileManager.default.copyItem(at: bundleURL, to: self.destinationURL, shouldReplace: true) + appBundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: temporaryDirectory) } + guard let application = ALTApplication(fileURL: appBundleURL) else { throw OperationError.invalidApp } + + guard ProcessInfo.processInfo.isOperatingSystemAtLeast(application.minimumiOSVersion) else { throw OperationError.iOSVersionNotSupported(application) } + + try FileManager.default.copyItem(at: appBundleURL, to: self.destinationURL, shouldReplace: true) + self.context.perform { let app = self.context.object(with: self.app.objectID) as! App diff --git a/AltStore/Operations/OperationError.swift b/AltStore/Operations/OperationError.swift index 7b50fc79..4412d215 100644 --- a/AltStore/Operations/OperationError.swift +++ b/AltStore/Operations/OperationError.swift @@ -7,6 +7,7 @@ // import Foundation +import AltSign enum OperationError: LocalizedError { @@ -22,6 +23,8 @@ enum OperationError: LocalizedError case invalidApp case invalidParameters + case iOSVersionNotSupported(ALTApplication) + var errorDescription: String? { switch self { case .unknown: return NSLocalizedString("An unknown error occured.", comment: "") @@ -32,6 +35,17 @@ enum OperationError: LocalizedError case .unknownUDID: return NSLocalizedString("Unknown device UDID.", comment: "") case .invalidApp: return NSLocalizedString("The app is invalid.", comment: "") case .invalidParameters: return NSLocalizedString("Invalid parameters.", comment: "") + case .iOSVersionNotSupported(let app): + let name = app.name + + var version = "iOS \(app.minimumiOSVersion.majorVersion).\(app.minimumiOSVersion.minorVersion)" + if app.minimumiOSVersion.patchVersion > 0 + { + version += ".\(app.minimumiOSVersion.patchVersion)" + } + + let localizedDescription = String(format: NSLocalizedString("%@ requires %@.", comment: ""), name, version) + return localizedDescription } } } diff --git a/Dependencies/AltSign b/Dependencies/AltSign index 2523e4fe..2c0303e6 160000 --- a/Dependencies/AltSign +++ b/Dependencies/AltSign @@ -1 +1 @@ -Subproject commit 2523e4fe0f2ca80bb286903bfd91550691502380 +Subproject commit 2c0303e685c4f9ba36fdcb5668707df7d14fe387