mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-17 18:53:40 +01:00
[AltStore] Validates minimum iOS version when installing apps
This commit is contained in:
@@ -52,25 +52,31 @@ class DownloadAppOperation: ResultOperation<InstalledApp>
|
|||||||
var isDirectory: ObjCBool = false
|
var isDirectory: ObjCBool = false
|
||||||
guard FileManager.default.fileExists(atPath: fileURL.path, isDirectory: &isDirectory) else { throw OperationError.appNotFound }
|
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
|
if isDirectory.boolValue
|
||||||
{
|
{
|
||||||
// Directory, so assuming this is .app bundle.
|
// Directory, so assuming this is .app bundle.
|
||||||
guard Bundle(url: fileURL) != nil else { throw OperationError.invalidApp }
|
guard Bundle(url: fileURL) != nil else { throw OperationError.invalidApp }
|
||||||
|
|
||||||
try FileManager.default.copyItem(at: fileURL, to: self.destinationURL, shouldReplace: true)
|
appBundleURL = fileURL
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// File, so assuming this is a .ipa file.
|
// File, so assuming this is a .ipa file.
|
||||||
|
appBundleURL = try FileManager.default.unzipAppBundle(at: fileURL, toDirectory: temporaryDirectory)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 {
|
self.context.perform {
|
||||||
let app = self.context.object(with: self.app.objectID) as! App
|
let app = self.context.object(with: self.app.objectID) as! App
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import AltSign
|
||||||
|
|
||||||
enum OperationError: LocalizedError
|
enum OperationError: LocalizedError
|
||||||
{
|
{
|
||||||
@@ -22,6 +23,8 @@ enum OperationError: LocalizedError
|
|||||||
case invalidApp
|
case invalidApp
|
||||||
case invalidParameters
|
case invalidParameters
|
||||||
|
|
||||||
|
case iOSVersionNotSupported(ALTApplication)
|
||||||
|
|
||||||
var errorDescription: String? {
|
var errorDescription: String? {
|
||||||
switch self {
|
switch self {
|
||||||
case .unknown: return NSLocalizedString("An unknown error occured.", comment: "")
|
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 .unknownUDID: return NSLocalizedString("Unknown device UDID.", comment: "")
|
||||||
case .invalidApp: return NSLocalizedString("The app is invalid.", comment: "")
|
case .invalidApp: return NSLocalizedString("The app is invalid.", comment: "")
|
||||||
case .invalidParameters: return NSLocalizedString("Invalid parameters.", 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
Dependencies/AltSign
vendored
2
Dependencies/AltSign
vendored
Submodule Dependencies/AltSign updated: 2523e4fe0f...2c0303e685
Reference in New Issue
Block a user