diff --git a/AltDaemon/AltDaemon-Bridging-Header.h b/AltDaemon/AltDaemon-Bridging-Header.h new file mode 100644 index 00000000..c7a02e94 --- /dev/null +++ b/AltDaemon/AltDaemon-Bridging-Header.h @@ -0,0 +1,36 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface AKDevice : NSObject + +@property (class, readonly) AKDevice *currentDevice; + +@property (strong, readonly) NSString *serialNumber; +@property (strong, readonly) NSString *uniqueDeviceIdentifier; +@property (strong, readonly) NSString *serverFriendlyDescription; + +@end + +@interface AKAppleIDSession : NSObject + +- (instancetype)initWithIdentifier:(NSString *)identifier; + +- (NSDictionary *)appleIDHeadersForRequest:(NSURLRequest *)request; + +@end + +@interface LSApplicationWorkspace : NSObject + +@property (class, readonly) LSApplicationWorkspace *defaultWorkspace; + +- (BOOL)installApplication:(NSURL *)fileURL withOptions:(nullable NSDictionary *)options error:(NSError *_Nullable *)error; +- (BOOL)uninstallApplication:(NSString *)bundleIdentifier withOptions:(nullable NSDictionary *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/AltDaemon/AltDaemon.entitlements b/AltDaemon/AltDaemon.entitlements new file mode 100644 index 00000000..3dfaef0b --- /dev/null +++ b/AltDaemon/AltDaemon.entitlements @@ -0,0 +1,22 @@ + + + + + application-identifier + 6XVY5G3U44.com.rileytestut.AltDaemon + get-task-allow + + platform-application + + com.apple.authkit.client.private + + com.apple.private.mobileinstall.allowedSPI + + Install + Uninstall + InstallForLaunchServices + UninstallForLaunchServices + InstallLocalProvisioned + + + diff --git a/AltDaemon/AnisetteDataManager.swift b/AltDaemon/AnisetteDataManager.swift new file mode 100644 index 00000000..daff25d6 --- /dev/null +++ b/AltDaemon/AnisetteDataManager.swift @@ -0,0 +1,65 @@ +// +// AnisetteDataManager.swift +// AltDaemon +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation + +import AltSign + +private extension UserDefaults +{ + @objc var localUserID: String? { + get { return self.string(forKey: #keyPath(UserDefaults.localUserID)) } + set { self.set(newValue, forKey: #keyPath(UserDefaults.localUserID)) } + } +} + +struct AnisetteDataManager +{ + static let shared = AnisetteDataManager() + + private let dateFormatter = ISO8601DateFormatter() + + private init() + { + dlopen("/System/Library/PrivateFrameworks/AuthKit.framework/AuthKit", RTLD_NOW); + } + + func requestAnisetteData() throws -> ALTAnisetteData + { + var request = URLRequest(url: URL(string: "https://developerservices2.apple.com/services/QH65B2/listTeams.action?clientId=XABBG36SBA")!) + request.httpMethod = "POST" + + let akAppleIDSession = unsafeBitCast(NSClassFromString("AKAppleIDSession")!, to: AKAppleIDSession.Type.self) + let akDevice = unsafeBitCast(NSClassFromString("AKDevice")!, to: AKDevice.Type.self) + + let session = akAppleIDSession.init(identifier: "com.apple.gs.xcode.auth") + let headers = session.appleIDHeaders(for: request) + + let device = akDevice.current + let date = self.dateFormatter.date(from: headers["X-Apple-I-Client-Time"] ?? "") ?? Date() + + var localUserID = UserDefaults.standard.localUserID + if localUserID == nil + { + localUserID = UUID().uuidString + UserDefaults.standard.localUserID = localUserID + } + + let anisetteData = ALTAnisetteData(machineID: headers["X-Apple-I-MD-M"] ?? "", + oneTimePassword: headers["X-Apple-I-MD"] ?? "", + localUserID: headers["X-Apple-I-MD-LU"] ?? localUserID ?? "", + routingInfo: UInt64(headers["X-Apple-I-MD-RINFO"] ?? "") ?? 0, + deviceUniqueIdentifier: device.uniqueDeviceIdentifier, + deviceSerialNumber: device.serialNumber, + deviceDescription: " ", + date: date, + locale: .current, + timeZone: .current) + return anisetteData + } +} diff --git a/AltDaemon/AppManager.swift b/AltDaemon/AppManager.swift new file mode 100644 index 00000000..50d5bb3f --- /dev/null +++ b/AltDaemon/AppManager.swift @@ -0,0 +1,126 @@ +// +// AppManager.swift +// AltDaemon +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation + +import AltSign + +private extension URL +{ + static let profilesDirectoryURL = URL(fileURLWithPath: "/var/MobileDevice/ProvisioningProfiles", isDirectory: true) +} + +struct AppManager +{ + static let shared = AppManager() + + private let appQueue = DispatchQueue(label: "com.rileytestut.AltDaemon.appQueue", qos: .userInitiated) + private let profilesQueue = OperationQueue() + + private let fileCoordinator = NSFileCoordinator() + + private init() + { + self.profilesQueue.name = "com.rileytestut.AltDaemon.profilesQueue" + self.profilesQueue.qualityOfService = .userInitiated + } + + func installApp(at fileURL: URL, bundleIdentifier: String, activeProfiles: Set?, completionHandler: @escaping (Result) -> Void) + { + self.appQueue.async { + let lsApplicationWorkspace = unsafeBitCast(NSClassFromString("LSApplicationWorkspace")!, to: LSApplicationWorkspace.Type.self) + + let options = ["CFBundleIdentifier": bundleIdentifier, "AllowInstallLocalProvisioned": NSNumber(value: true)] as [String : Any] + let result = Result { try lsApplicationWorkspace.default.installApplication(fileURL, withOptions: options) } + + completionHandler(result) + } + } + + func removeApp(forBundleIdentifier bundleIdentifier: String, completionHandler: @escaping (Result) -> Void) + { + self.appQueue.async { + let lsApplicationWorkspace = unsafeBitCast(NSClassFromString("LSApplicationWorkspace")!, to: LSApplicationWorkspace.Type.self) + lsApplicationWorkspace.default.uninstallApplication(bundleIdentifier, withOptions: nil) + + completionHandler(.success(())) + } + } + + func install(_ profiles: Set, activeProfiles: Set?, completionHandler: @escaping (Result) -> Void) + { + let intent = NSFileAccessIntent.writingIntent(with: .profilesDirectoryURL, options: []) + self.fileCoordinator.coordinate(with: [intent], queue: self.profilesQueue) { (error) in + do + { + if let error = error + { + throw error + } + + let installingBundleIDs = Set(profiles.map(\.bundleIdentifier)) + + let profileURLs = try FileManager.default.contentsOfDirectory(at: intent.url, includingPropertiesForKeys: nil, options: []) + + // Remove all inactive profiles (if active profiles are provided), and the previous profiles. + for fileURL in profileURLs + { + guard let profile = ALTProvisioningProfile(url: fileURL) else { continue } + + if installingBundleIDs.contains(profile.bundleIdentifier) || (activeProfiles?.contains(profile.bundleIdentifier) == false && profile.isFreeProvisioningProfile) + { + try FileManager.default.removeItem(at: fileURL) + } + else + { + print("Ignoring:", profile.bundleIdentifier, profile.uuid) + } + } + + for profile in profiles + { + let destinationURL = URL.profilesDirectoryURL.appendingPathComponent(profile.uuid.uuidString.lowercased()) + try profile.data.write(to: destinationURL, options: .atomic) + } + + completionHandler(.success(())) + } + catch + { + completionHandler(.failure(error)) + } + } + } + + func removeProvisioningProfiles(forBundleIdentifiers bundleIdentifiers: Set, completionHandler: @escaping (Result) -> Void) + { + let intent = NSFileAccessIntent.writingIntent(with: .profilesDirectoryURL, options: []) + self.fileCoordinator.coordinate(with: [intent], queue: self.profilesQueue) { (error) in + do + { + let profileURLs = try FileManager.default.contentsOfDirectory(at: intent.url, includingPropertiesForKeys: nil, options: []) + + for fileURL in profileURLs + { + guard let profile = ALTProvisioningProfile(url: fileURL) else { continue } + + if bundleIdentifiers.contains(profile.bundleIdentifier) + { + try FileManager.default.removeItem(at: fileURL) + } + } + + completionHandler(.success(())) + } + catch + { + completionHandler(.failure(error)) + } + } + } +} diff --git a/AltDaemon/LocalConnectionHandler.swift b/AltDaemon/LocalConnectionHandler.swift new file mode 100644 index 00000000..80a48104 --- /dev/null +++ b/AltDaemon/LocalConnectionHandler.swift @@ -0,0 +1,110 @@ +// +// LocalConnectionHandler.swift +// AltDaemon +// +// Created by Riley Testut on 6/2/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation +import Network + +import AltKit + +private let ReceivedLocalServerConnectionRequest: @convention(c) (CFNotificationCenter?, UnsafeMutableRawPointer?, CFNotificationName?, UnsafeRawPointer?, CFDictionary?) -> Void = +{ (center, observer, name, object, userInfo) in + guard let name = name, let observer = observer else { return } + + let connection = unsafeBitCast(observer, to: LocalConnectionHandler.self) + connection.handle(name) +} + +class LocalConnectionHandler: ConnectionHandler +{ + var connectionHandler: ((Connection) -> Void)? + var disconnectionHandler: ((Connection) -> Void)? + + private let dispatchQueue = DispatchQueue(label: "io.altstore.LocalConnectionListener", qos: .utility) + + deinit + { + self.stopListening() + } + + func startListening() + { + let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() + let observer = Unmanaged.passUnretained(self).toOpaque() + + CFNotificationCenterAddObserver(notificationCenter, observer, ReceivedLocalServerConnectionRequest, CFNotificationName.localServerConnectionAvailableRequest.rawValue, nil, .deliverImmediately) + CFNotificationCenterAddObserver(notificationCenter, observer, ReceivedLocalServerConnectionRequest, CFNotificationName.localServerConnectionStartRequest.rawValue, nil, .deliverImmediately) + } + + func stopListening() + { + let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() + let observer = Unmanaged.passUnretained(self).toOpaque() + + CFNotificationCenterRemoveObserver(notificationCenter, observer, .localServerConnectionAvailableRequest, nil) + CFNotificationCenterRemoveObserver(notificationCenter, observer, .localServerConnectionStartRequest, nil) + } + + fileprivate func handle(_ notification: CFNotificationName) + { + switch notification + { + case .localServerConnectionAvailableRequest: + let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() + CFNotificationCenterPostNotification(notificationCenter, .localServerConnectionAvailableResponse, nil, nil, true) + + case .localServerConnectionStartRequest: + let connection = NWConnection(host: "localhost", port: NWEndpoint.Port(rawValue: ALTDeviceListeningSocket)!, using: .tcp) + self.start(connection) + + default: break + } + } +} + +private extension LocalConnectionHandler +{ + func start(_ nwConnection: NWConnection) + { + print("Starting connection to:", nwConnection) + + // Use same instance for all callbacks. + let connection = NetworkConnection(nwConnection) + + nwConnection.stateUpdateHandler = { [weak self] (state) in + switch state + { + case .setup, .preparing: break + + case .ready: + print("Connected to client:", nwConnection.endpoint) + self?.connectionHandler?(connection) + + case .waiting: + print("Waiting for connection...") + + case .failed(let error): + print("Failed to connect to service \(nwConnection.endpoint).", error) + self?.disconnect(connection) + + case .cancelled: + self?.disconnect(connection) + + @unknown default: break + } + } + + nwConnection.start(queue: self.dispatchQueue) + } + + func disconnect(_ connection: Connection) + { + connection.disconnect() + + self.disconnectionHandler?(connection) + } +} diff --git a/AltDaemon/RequestHandler.swift b/AltDaemon/RequestHandler.swift new file mode 100644 index 00000000..aff9e5d1 --- /dev/null +++ b/AltDaemon/RequestHandler.swift @@ -0,0 +1,124 @@ +// +// ConnectionManager.swift +// AltServer +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +import Foundation +import AltKit + +typealias ConnectionManager = AltKit.ConnectionManager + +private let connectionManager = ConnectionManager(requestHandler: RequestHandler(), + connectionHandlers: [LocalConnectionHandler()]) + +extension ConnectionManager +{ + static var shared: ConnectionManager { + return connectionManager + } +} + +struct RequestHandler: AltKit.RequestHandler +{ + func handleAnisetteDataRequest(_ request: AnisetteDataRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + { + do + { + let anisetteData = try AnisetteDataManager.shared.requestAnisetteData() + + let response = AnisetteDataResponse(anisetteData: anisetteData) + completionHandler(.success(response)) + } + catch + { + completionHandler(.failure(error)) + } + } + + func handlePrepareAppRequest(_ request: PrepareAppRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + { + guard let fileURL = request.fileURL else { return completionHandler(.failure(ALTServerError(.invalidRequest))) } + + print("Awaiting begin installation request...") + + connection.receiveRequest() { (result) in + print("Received begin installation request with result:", result) + + do + { + guard case .beginInstallation(let request) = try result.get() else { throw ALTServerError(.unknownRequest) } + guard let bundleIdentifier = request.bundleIdentifier else { throw ALTServerError(.invalidRequest) } + + AppManager.shared.installApp(at: fileURL, bundleIdentifier: bundleIdentifier, activeProfiles: request.activeProfiles) { (result) in + let result = result.map { InstallationProgressResponse(progress: 1.0) } + print("Installed app with result:", result) + + completionHandler(result) + } + } + catch + { + completionHandler(.failure(error)) + } + } + } + + func handleInstallProvisioningProfilesRequest(_ request: InstallProvisioningProfilesRequest, for connection: Connection, + completionHandler: @escaping (Result) -> Void) + { + AppManager.shared.install(request.provisioningProfiles, activeProfiles: request.activeProfiles) { (result) in + switch result + { + case .failure(let error): + print("Failed to install profiles \(request.provisioningProfiles.map { $0.bundleIdentifier }):", error) + completionHandler(.failure(error)) + + case .success: + print("Installed profiles:", request.provisioningProfiles.map { $0.bundleIdentifier }) + + let response = InstallProvisioningProfilesResponse() + completionHandler(.success(response)) + } + } + } + + func handleRemoveProvisioningProfilesRequest(_ request: RemoveProvisioningProfilesRequest, for connection: Connection, + completionHandler: @escaping (Result) -> Void) + { + AppManager.shared.removeProvisioningProfiles(forBundleIdentifiers: request.bundleIdentifiers) { (result) in + switch result + { + case .failure(let error): + print("Failed to remove profiles \(request.bundleIdentifiers):", error) + completionHandler(.failure(error)) + + case .success: + print("Removed profiles:", request.bundleIdentifiers) + + let response = RemoveProvisioningProfilesResponse() + completionHandler(.success(response)) + } + } + } + + func handleRemoveAppRequest(_ request: RemoveAppRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + { + AppManager.shared.removeApp(forBundleIdentifier: request.bundleIdentifier) { (result) in + switch result + { + case .failure(let error): + print("Failed to remove app \(request.bundleIdentifier):", error) + completionHandler(.failure(error)) + + case .success: + print("Removed app:", request.bundleIdentifier) + + let response = RemoveAppResponse() + completionHandler(.success(response)) + } + } + } +} diff --git a/AltDaemon/main.swift b/AltDaemon/main.swift new file mode 100644 index 00000000..be17c56c --- /dev/null +++ b/AltDaemon/main.swift @@ -0,0 +1,14 @@ +// +// main.swift +// AltDaemon +// +// Created by Riley Testut on 6/2/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation + +autoreleasepool { + ConnectionManager.shared.start() + RunLoop.current.run() +} diff --git a/AltDaemon/package/DEBIAN/control b/AltDaemon/package/DEBIAN/control new file mode 100644 index 00000000..04b994ca --- /dev/null +++ b/AltDaemon/package/DEBIAN/control @@ -0,0 +1,10 @@ +Package: com.rileytestut.altdaemon +Name: AltDaemon +Depends: +Version: 0.1 +Architecture: iphoneos-arm +Description: AltDaemon allows AltStore to install and refresh apps without a computer. +Maintainer: Riley Testut +Author: Riley Testut +Homepage: https://altstore.io +Section: System diff --git a/AltDaemon/package/DEBIAN/postinst b/AltDaemon/package/DEBIAN/postinst new file mode 100755 index 00000000..e5b799be --- /dev/null +++ b/AltDaemon/package/DEBIAN/postinst @@ -0,0 +1,2 @@ +#!/bin/sh +launchctl load /Library/LaunchDaemons/com.rileytestut.altdaemon.plist diff --git a/AltDaemon/package/DEBIAN/preinst b/AltDaemon/package/DEBIAN/preinst new file mode 100755 index 00000000..cf29046c --- /dev/null +++ b/AltDaemon/package/DEBIAN/preinst @@ -0,0 +1,2 @@ +#!/bin/sh +launchctl unload /Library/LaunchDaemons/com.rileytestut.altdaemon.plist >> /dev/null 2>&1 diff --git a/AltDaemon/package/DEBIAN/prerm b/AltDaemon/package/DEBIAN/prerm new file mode 100755 index 00000000..e88bf33b --- /dev/null +++ b/AltDaemon/package/DEBIAN/prerm @@ -0,0 +1,2 @@ +#!/bin/sh +launchctl unload /Library/LaunchDaemons/com.rileytestut.altdaemon.plist diff --git a/AltDaemon/package/Library/LaunchDaemons/com.rileytestut.altdaemon.plist b/AltDaemon/package/Library/LaunchDaemons/com.rileytestut.altdaemon.plist new file mode 100644 index 00000000..aed284ba --- /dev/null +++ b/AltDaemon/package/Library/LaunchDaemons/com.rileytestut.altdaemon.plist @@ -0,0 +1,18 @@ + + + + + Label + com.rileytestut.altdaemon + ProgramArguments + + /usr/bin/AltDaemon + + UserName + mobile + KeepAlive + + RunAtLoad + + + diff --git a/AltDaemon/package/usr/bin/AltDaemon b/AltDaemon/package/usr/bin/AltDaemon new file mode 100755 index 00000000..f26374b3 Binary files /dev/null and b/AltDaemon/package/usr/bin/AltDaemon differ diff --git a/AltKit/AltKit.h b/AltKit/AltKit.h index 7d1b7380..59f60252 100644 --- a/AltKit/AltKit.h +++ b/AltKit/AltKit.h @@ -8,5 +8,6 @@ #import "NSError+ALTServerError.h" #import "CFNotificationName+AltStore.h" +#import "ALTConnection.h" extern uint16_t ALTDeviceListeningSocket; diff --git a/AltKit/CFNotificationName+AltStore.h b/AltKit/Categories/CFNotificationName+AltStore.h similarity index 61% rename from AltKit/CFNotificationName+AltStore.h rename to AltKit/Categories/CFNotificationName+AltStore.h index 01c2a336..634ba563 100644 --- a/AltKit/CFNotificationName+AltStore.h +++ b/AltKit/Categories/CFNotificationName+AltStore.h @@ -14,4 +14,8 @@ extern CFNotificationName const ALTWiredServerConnectionAvailableRequest NS_SWIF extern CFNotificationName const ALTWiredServerConnectionAvailableResponse NS_SWIFT_NAME(wiredServerConnectionAvailableResponse); extern CFNotificationName const ALTWiredServerConnectionStartRequest NS_SWIFT_NAME(wiredServerConnectionStartRequest); +extern CFNotificationName const ALTLocalServerConnectionAvailableRequest NS_SWIFT_NAME(localServerConnectionAvailableRequest); +extern CFNotificationName const ALTLocalServerConnectionAvailableResponse NS_SWIFT_NAME(localServerConnectionAvailableResponse); +extern CFNotificationName const ALTLocalServerConnectionStartRequest NS_SWIFT_NAME(localServerConnectionStartRequest); + NS_ASSUME_NONNULL_END diff --git a/AltKit/CFNotificationName+AltStore.m b/AltKit/Categories/CFNotificationName+AltStore.m similarity index 60% rename from AltKit/CFNotificationName+AltStore.m rename to AltKit/Categories/CFNotificationName+AltStore.m index ac0eb5d1..c74c55a1 100644 --- a/AltKit/CFNotificationName+AltStore.m +++ b/AltKit/Categories/CFNotificationName+AltStore.m @@ -11,3 +11,7 @@ CFNotificationName const ALTWiredServerConnectionAvailableRequest = CFSTR("io.altstore.Request.WiredServerConnectionAvailable"); CFNotificationName const ALTWiredServerConnectionAvailableResponse = CFSTR("io.altstore.Response.WiredServerConnectionAvailable"); CFNotificationName const ALTWiredServerConnectionStartRequest = CFSTR("io.altstore.Request.WiredServerConnectionStart"); + +CFNotificationName const ALTLocalServerConnectionAvailableRequest = CFSTR("io.altstore.Request.LocalServerConnectionAvailable"); +CFNotificationName const ALTLocalServerConnectionAvailableResponse = CFSTR("io.altstore.Response.LocalServerConnectionAvailable"); +CFNotificationName const ALTLocalServerConnectionStartRequest = CFSTR("io.altstore.Request.LocalServerConnectionStart"); diff --git a/AltKit/NSError+ALTServerError.h b/AltKit/Categories/NSError+ALTServerError.h similarity index 100% rename from AltKit/NSError+ALTServerError.h rename to AltKit/Categories/NSError+ALTServerError.h diff --git a/AltKit/NSError+ALTServerError.m b/AltKit/Categories/NSError+ALTServerError.m similarity index 91% rename from AltKit/NSError+ALTServerError.m rename to AltKit/Categories/NSError+ALTServerError.m index 02bc5541..0f6326b4 100644 --- a/AltKit/NSError+ALTServerError.m +++ b/AltKit/Categories/NSError+ALTServerError.m @@ -39,13 +39,19 @@ NSErrorUserInfoKey const ALTProvisioningProfileBundleIDErrorKey = @"bundleIdenti { case ALTServerErrorUnderlyingError: { - NSString *underlyingErrorCode = self.userInfo[ALTUnderlyingErrorCodeErrorKey]; - if (underlyingErrorCode == nil) + NSError *underlyingError = self.userInfo[NSUnderlyingErrorKey]; + if (underlyingError.localizedFailureReason != nil) { - return NSLocalizedString(@"An unknown error occured.", @""); + return underlyingError.localizedFailureReason; + } + + NSString *underlyingErrorCode = self.userInfo[ALTUnderlyingErrorCodeErrorKey]; + if (underlyingErrorCode != nil) + { + return [NSString stringWithFormat:NSLocalizedString(@"Error code: %@", @""), underlyingErrorCode]; } - return [NSString stringWithFormat:NSLocalizedString(@"Error code: %@", @""), underlyingErrorCode]; + return NSLocalizedString(@"An internal error occured.", @""); } case ALTServerErrorUnknown: diff --git a/AltKit/CodableServerError.swift b/AltKit/CodableServerError.swift deleted file mode 100644 index 7ada01df..00000000 --- a/AltKit/CodableServerError.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// CodableServerError.swift -// AltKit -// -// Created by Riley Testut on 3/5/20. -// Copyright © 2020 Riley Testut. All rights reserved. -// - -import Foundation - -// Can only automatically conform ALTServerError.Code to Codable, not ALTServerError itself -extension ALTServerError.Code: Codable {} - -struct CodableServerError: Codable -{ - var error: ALTServerError { - return ALTServerError(self.errorCode, userInfo: self.userInfo ?? [:]) - } - - private var errorCode: ALTServerError.Code - private var userInfo: [String: String]? - - private enum CodingKeys: String, CodingKey - { - case errorCode - case userInfo - } - - init(error: ALTServerError) - { - self.errorCode = error.code - - var userInfo = error.userInfo.compactMapValues { $0 as? String } - - if let localizedRecoverySuggestion = (error as NSError).localizedRecoverySuggestion - { - userInfo[NSLocalizedRecoverySuggestionErrorKey] = localizedRecoverySuggestion - } - - if !userInfo.isEmpty - { - self.userInfo = userInfo - } - } - - init(from decoder: Decoder) throws - { - let container = try decoder.container(keyedBy: CodingKeys.self) - - let errorCode = try container.decode(Int.self, forKey: .errorCode) - self.errorCode = ALTServerError.Code(rawValue: errorCode) ?? .unknown - - let userInfo = try container.decodeIfPresent([String: String].self, forKey: .userInfo) - self.userInfo = userInfo - } - - func encode(to encoder: Encoder) throws - { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(self.error.code.rawValue, forKey: .errorCode) - try container.encodeIfPresent(self.userInfo, forKey: .userInfo) - } -} - diff --git a/AltKit/Connections/ALTConnection.h b/AltKit/Connections/ALTConnection.h new file mode 100644 index 00000000..348573d7 --- /dev/null +++ b/AltKit/Connections/ALTConnection.h @@ -0,0 +1,23 @@ +// +// ALTConnection.h +// AltKit +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +NS_SWIFT_NAME(Connection) +@protocol ALTConnection + +- (void)sendData:(NSData *)data completionHandler:(void (^)(BOOL, NSError * _Nullable))completionHandler NS_REFINED_FOR_SWIFT; +- (void)receiveDataWithExpectedSize:(NSInteger)expectedSize completionHandler:(void (^)(NSData * _Nullable, NSError * _Nullable))completionHandler NS_SWIFT_NAME(__receiveData(expectedSize:completionHandler:)); + +- (void)disconnect; + +@end + +NS_ASSUME_NONNULL_END diff --git a/AltKit/Connections/Connection.swift b/AltKit/Connections/Connection.swift new file mode 100644 index 00000000..24388501 --- /dev/null +++ b/AltKit/Connections/Connection.swift @@ -0,0 +1,113 @@ +// +// Connection.swift +// AltKit +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation +import Network + +public extension Connection +{ + func send(_ data: Data, completionHandler: @escaping (Result) -> Void) + { + self.__send(data) { (success, error) in + let result = Result(success, error).mapError { (error) -> ALTServerError in + guard let nwError = error as? NWError else { return ALTServerError(error) } + return ALTServerError(.lostConnection, underlyingError: nwError) + } + + completionHandler(result) + } + } + + func receiveData(expectedSize: Int, completionHandler: @escaping (Result) -> Void) + { + self.__receiveData(expectedSize: expectedSize) { (data, error) in + let result = Result(data, error).mapError { (error) -> ALTServerError in + guard let nwError = error as? NWError else { return ALTServerError(error) } + return ALTServerError(.lostConnection, underlyingError: nwError) + } + + completionHandler(result) + } + } + + func send(_ response: T, shouldDisconnect: Bool = false, completionHandler: @escaping (Result) -> Void) + { + func finish(_ result: Result) + { + completionHandler(result) + + if shouldDisconnect + { + // Add short delay to prevent us from dropping connection too quickly. + DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) { + self.disconnect() + } + } + } + + do + { + let data = try JSONEncoder().encode(response) + let responseSize = withUnsafeBytes(of: Int32(data.count)) { Data($0) } + + self.send(responseSize) { (result) in + switch result + { + case .failure(let error): finish(.failure(error)) + case .success: + self.send(data) { (result) in + switch result + { + case .failure(let error): finish(.failure(error)) + case .success: finish(.success(())) + } + } + } + } + } + catch + { + finish(.failure(.init(.invalidResponse, underlyingError: error))) + } + } + + func receiveRequest(completionHandler: @escaping (Result) -> Void) + { + let size = MemoryLayout.size + + print("Receiving request size from connection:", self) + self.receiveData(expectedSize: size) { (result) in + do + { + let data = try result.get() + + let expectedSize = Int(data.withUnsafeBytes { $0.load(as: Int32.self) }) + print("Receiving request from connection: \(self)... (\(expectedSize) bytes)") + + self.receiveData(expectedSize: expectedSize) { (result) in + do + { + let data = try result.get() + let request = try JSONDecoder().decode(ServerRequest.self, from: data) + + print("Received request:", request) + completionHandler(.success(request)) + } + catch + { + completionHandler(.failure(ALTServerError(error))) + } + } + } + catch + { + completionHandler(.failure(ALTServerError(error))) + } + } + } +} diff --git a/AltKit/Connections/ConnectionManager.swift b/AltKit/Connections/ConnectionManager.swift new file mode 100644 index 00000000..9d3c054b --- /dev/null +++ b/AltKit/Connections/ConnectionManager.swift @@ -0,0 +1,160 @@ +// +// ConnectionManager.swift +// AltServer +// +// Created by Riley Testut on 5/23/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +import Foundation +import Network + +public protocol RequestHandler +{ + func handleAnisetteDataRequest(_ request: AnisetteDataRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + func handlePrepareAppRequest(_ request: PrepareAppRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + + func handleInstallProvisioningProfilesRequest(_ request: InstallProvisioningProfilesRequest, for connection: Connection, + completionHandler: @escaping (Result) -> Void) + func handleRemoveProvisioningProfilesRequest(_ request: RemoveProvisioningProfilesRequest, for connection: Connection, + completionHandler: @escaping (Result) -> Void) + + func handleRemoveAppRequest(_ request: RemoveAppRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) +} + +public protocol ConnectionHandler: AnyObject +{ + var connectionHandler: ((Connection) -> Void)? { get set } + var disconnectionHandler: ((Connection) -> Void)? { get set } + + func startListening() + func stopListening() +} + +public class ConnectionManager +{ + public let requestHandler: RequestHandlerType + public let connectionHandlers: [ConnectionHandler] + + public var isStarted = false + + private var connections = [Connection]() + + public init(requestHandler: RequestHandlerType, connectionHandlers: [ConnectionHandler]) + { + self.requestHandler = requestHandler + self.connectionHandlers = connectionHandlers + + for handler in connectionHandlers + { + handler.connectionHandler = { [weak self] (connection) in + self?.prepare(connection) + } + + handler.disconnectionHandler = { [weak self] (connection) in + self?.disconnect(connection) + } + } + } + + public func start() + { + guard !self.isStarted else { return } + + for connectionHandler in self.connectionHandlers + { + connectionHandler.startListening() + } + + self.isStarted = true + } + + public func stop() + { + guard self.isStarted else { return } + + for connectionHandler in self.connectionHandlers + { + connectionHandler.stopListening() + } + + self.isStarted = false + } +} + +private extension ConnectionManager +{ + func prepare(_ connection: Connection) + { + guard !self.connections.contains(where: { $0 === connection }) else { return } + self.connections.append(connection) + + self.handleRequest(for: connection) + } + + func disconnect(_ connection: Connection) + { + guard let index = self.connections.firstIndex(where: { $0 === connection }) else { return } + self.connections.remove(at: index) + } + + func handleRequest(for connection: Connection) + { + func finish(_ result: Result) + { + do + { + let response = try result.get() + connection.send(response, shouldDisconnect: true) { (result) in + print("Sent response \(response) with result:", result) + } + } + catch + { + let response = ErrorResponse(error: ALTServerError(error)) + connection.send(response, shouldDisconnect: true) { (result) in + print("Sent error response \(response) with result:", result) + } + } + } + + connection.receiveRequest() { (result) in + print("Received request with result:", result) + + switch result + { + case .failure(let error): finish(Result.failure(error)) + + case .success(.anisetteData(let request)): + self.requestHandler.handleAnisetteDataRequest(request, for: connection) { (result) in + finish(result) + } + + case .success(.prepareApp(let request)): + self.requestHandler.handlePrepareAppRequest(request, for: connection) { (result) in + finish(result) + } + + case .success(.beginInstallation): break + + case .success(.installProvisioningProfiles(let request)): + self.requestHandler.handleInstallProvisioningProfilesRequest(request, for: connection) { (result) in + finish(result) + } + + case .success(.removeProvisioningProfiles(let request)): + self.requestHandler.handleRemoveProvisioningProfilesRequest(request, for: connection) { (result) in + finish(result) + } + + case .success(.removeApp(let request)): + self.requestHandler.handleRemoveAppRequest(request, for: connection) { (result) in + finish(result) + } + + case .success(.unknown): + finish(Result.failure(ALTServerError(.unknownRequest))) + } + } + } +} diff --git a/AltKit/Connections/NetworkConnection.swift b/AltKit/Connections/NetworkConnection.swift new file mode 100644 index 00000000..232b2a51 --- /dev/null +++ b/AltKit/Connections/NetworkConnection.swift @@ -0,0 +1,54 @@ +// +// NetworkConnection.swift +// AltKit +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation +import Network + +public class NetworkConnection: NSObject, Connection +{ + public let nwConnection: NWConnection + + public init(_ nwConnection: NWConnection) + { + self.nwConnection = nwConnection + } + + public func __send(_ data: Data, completionHandler: @escaping (Bool, Error?) -> Void) + { + self.nwConnection.send(content: data, completion: .contentProcessed { (error) in + completionHandler(error == nil, error) + }) + } + + public func __receiveData(expectedSize: Int, completionHandler: @escaping (Data?, Error?) -> Void) + { + self.nwConnection.receive(minimumIncompleteLength: expectedSize, maximumLength: expectedSize) { (data, context, isComplete, error) in + guard data != nil || error != nil else { + return completionHandler(nil, ALTServerError(.lostConnection)) + } + + completionHandler(data, error) + } + } + + public func disconnect() + { + switch self.nwConnection.state + { + case .cancelled, .failed: break + default: self.nwConnection.cancel() + } + } +} + +extension NetworkConnection +{ + override public var description: String { + return "\(self.nwConnection.endpoint) (Network)" + } +} diff --git a/AltKit/Extensions/ALTServerError+Conveniences.swift b/AltKit/Extensions/ALTServerError+Conveniences.swift new file mode 100644 index 00000000..71cfe623 --- /dev/null +++ b/AltKit/Extensions/ALTServerError+Conveniences.swift @@ -0,0 +1,36 @@ +// +// ALTServerError+Conveniences.swift +// AltKit +// +// Created by Riley Testut on 6/4/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation + +public extension ALTServerError +{ + init(_ error: E) + { + switch error + { + case let error as ALTServerError: self = error + case is DecodingError: self = ALTServerError(.invalidRequest, underlyingError: error) + case is EncodingError: self = ALTServerError(.invalidResponse, underlyingError: error) + case let error as NSError: + var userInfo = error.userInfo + if !userInfo.keys.contains(NSUnderlyingErrorKey) + { + // Assign underlying error (if there isn't already one). + userInfo[NSUnderlyingErrorKey] = error + } + + self = ALTServerError(.underlyingError, userInfo: userInfo) + } + } + + init(_ code: ALTServerError.Code, underlyingError: E) + { + self = ALTServerError(code, userInfo: [NSUnderlyingErrorKey: underlyingError]) + } +} diff --git a/AltKit/Bundle+AltStore.swift b/AltKit/Extensions/Bundle+AltStore.swift similarity index 100% rename from AltKit/Bundle+AltStore.swift rename to AltKit/Extensions/Bundle+AltStore.swift diff --git a/AltKit/Result+Conveniences.swift b/AltKit/Extensions/Result+Conveniences.swift similarity index 100% rename from AltKit/Result+Conveniences.swift rename to AltKit/Extensions/Result+Conveniences.swift diff --git a/AltKit/Server Protocol/CodableServerError.swift b/AltKit/Server Protocol/CodableServerError.swift new file mode 100644 index 00000000..a9980dcb --- /dev/null +++ b/AltKit/Server Protocol/CodableServerError.swift @@ -0,0 +1,126 @@ +// +// CodableServerError.swift +// AltKit +// +// Created by Riley Testut on 3/5/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation + +// Can only automatically conform ALTServerError.Code to Codable, not ALTServerError itself +extension ALTServerError.Code: Codable {} + +extension CodableServerError +{ + enum UserInfoValue: Codable + { + case string(String) + case error(NSError) + + public init(from decoder: Decoder) throws + { + let container = try decoder.singleValueContainer() + + if + let data = try? container.decode(Data.self), + let error = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSError.self, from: data) + { + self = .error(error) + } + else if let string = try? container.decode(String.self) + { + self = .string(string) + } + else + { + throw DecodingError.dataCorruptedError(in: container, debugDescription: "UserInfoValue value cannot be decoded") + } + } + + func encode(to encoder: Encoder) throws + { + var container = encoder.singleValueContainer() + + switch self + { + case .string(let string): try container.encode(string) + case .error(let error): + guard let data = try? NSKeyedArchiver.archivedData(withRootObject: error, requiringSecureCoding: true) else { + let context = EncodingError.Context(codingPath: container.codingPath, debugDescription: "UserInfoValue value \(self) cannot be encoded") + throw EncodingError.invalidValue(self, context) + } + + try container.encode(data) + } + } + } +} + +struct CodableServerError: Codable +{ + var error: ALTServerError { + return ALTServerError(self.errorCode, userInfo: self.userInfo ?? [:]) + } + + private var errorCode: ALTServerError.Code + private var userInfo: [String: Any]? + + private enum CodingKeys: String, CodingKey + { + case errorCode + case userInfo + } + + init(error: ALTServerError) + { + self.errorCode = error.code + + var userInfo = error.userInfo + if let localizedRecoverySuggestion = (error as NSError).localizedRecoverySuggestion + { + userInfo[NSLocalizedRecoverySuggestionErrorKey] = localizedRecoverySuggestion + } + + if !userInfo.isEmpty + { + self.userInfo = userInfo + } + } + + init(from decoder: Decoder) throws + { + let container = try decoder.container(keyedBy: CodingKeys.self) + + let errorCode = try container.decode(Int.self, forKey: .errorCode) + self.errorCode = ALTServerError.Code(rawValue: errorCode) ?? .unknown + + let rawUserInfo = try container.decodeIfPresent([String: UserInfoValue].self, forKey: .userInfo) + + let userInfo = rawUserInfo?.mapValues { (value) -> Any in + switch value + { + case .string(let string): return string + case .error(let error): return error + } + } + self.userInfo = userInfo + } + + func encode(to encoder: Encoder) throws + { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(self.error.code.rawValue, forKey: .errorCode) + + let rawUserInfo = self.userInfo?.compactMapValues { (value) -> UserInfoValue? in + switch value + { + case let string as String: return .string(string) + case let error as NSError: return .error(error) + default: return nil + } + } + try container.encodeIfPresent(rawUserInfo, forKey: .userInfo) + } +} + diff --git a/AltKit/ServerProtocol.swift b/AltKit/Server Protocol/ServerProtocol.swift similarity index 97% rename from AltKit/ServerProtocol.swift rename to AltKit/Server Protocol/ServerProtocol.swift index a386eb42..dcee3c3b 100644 --- a/AltKit/ServerProtocol.swift +++ b/AltKit/Server Protocol/ServerProtocol.swift @@ -267,24 +267,30 @@ public struct PrepareAppRequest: ServerMessageProtocol public var udid: String public var contentSize: Int - public init(udid: String, contentSize: Int) + public var fileURL: URL? + + public init(udid: String, contentSize: Int, fileURL: URL? = nil) { self.udid = udid self.contentSize = contentSize + self.fileURL = fileURL } } public struct BeginInstallationRequest: ServerMessageProtocol { - public var version = 2 + public var version = 3 public var identifier = "BeginInstallationRequest" // If activeProfiles is non-nil, then AltServer should remove all profiles except active ones. public var activeProfiles: Set? - public init(activeProfiles: Set?) + public var bundleIdentifier: String? + + public init(activeProfiles: Set?, bundleIdentifier: String?) { self.activeProfiles = activeProfiles + self.bundleIdentifier = bundleIdentifier } } diff --git a/AltServer/Connections/ALTWiredConnection+Private.h b/AltServer/Connections/ALTWiredConnection+Private.h index 24dc2c85..a6c64d14 100644 --- a/AltServer/Connections/ALTWiredConnection+Private.h +++ b/AltServer/Connections/ALTWiredConnection+Private.h @@ -14,6 +14,8 @@ NS_ASSUME_NONNULL_BEGIN @interface ALTWiredConnection () +@property (nonatomic, readwrite, getter=isConnected) BOOL connected; + @property (nonatomic, readonly) idevice_connection_t connection; - (instancetype)initWithDevice:(ALTDevice *)device connection:(idevice_connection_t)connection; diff --git a/AltServer/Connections/ALTWiredConnection.h b/AltServer/Connections/ALTWiredConnection.h index 05801f98..2a588873 100644 --- a/AltServer/Connections/ALTWiredConnection.h +++ b/AltServer/Connections/ALTWiredConnection.h @@ -8,10 +8,14 @@ #import +#import "AltKit.h" + NS_ASSUME_NONNULL_BEGIN NS_SWIFT_NAME(WiredConnection) -@interface ALTWiredConnection : NSObject +@interface ALTWiredConnection : NSObject + +@property (nonatomic, readonly, getter=isConnected) BOOL connected; @property (nonatomic, copy, readonly) ALTDevice *device; diff --git a/AltServer/Connections/ALTWiredConnection.m b/AltServer/Connections/ALTWiredConnection.m index 75efac24..32ecda98 100644 --- a/AltServer/Connections/ALTWiredConnection.m +++ b/AltServer/Connections/ALTWiredConnection.m @@ -30,8 +30,15 @@ - (void)disconnect { + if (![self isConnected]) + { + return; + } + idevice_disconnect(self.connection); _connection = nil; + + self.connected = NO; } - (void)sendData:(NSData *)data completionHandler:(void (^)(BOOL, NSError * _Nullable))completionHandler @@ -98,4 +105,11 @@ }); } +#pragma mark - NSObject - + +- (NSString *)description +{ + return [NSString stringWithFormat:@"%@ (Wired)", self.device.name]; +} + @end diff --git a/AltServer/Connections/ClientConnection.swift b/AltServer/Connections/ClientConnection.swift deleted file mode 100644 index 33b5562c..00000000 --- a/AltServer/Connections/ClientConnection.swift +++ /dev/null @@ -1,231 +0,0 @@ -// -// ClientConnection.swift -// AltServer -// -// Created by Riley Testut on 1/9/20. -// Copyright © 2020 Riley Testut. All rights reserved. -// - -import Foundation -import Network - -import AltKit -import AltSign - -extension ClientConnection -{ - enum Connection - { - case wireless(NWConnection) - case wired(WiredConnection) - } -} - -class ClientConnection -{ - let connection: Connection - - init(connection: Connection) - { - self.connection = connection - } - - func disconnect() - { - switch self.connection - { - case .wireless(let connection): - switch connection.state - { - case .cancelled, .failed: - print("Disconnecting from \(connection.endpoint)...") - - default: - // State update handler might call this method again. - connection.cancel() - } - - case .wired(let connection): - connection.disconnect() - } - } - - func send(_ response: T, shouldDisconnect: Bool = false, completionHandler: @escaping (Result) -> Void) - { - func finish(_ result: Result) - { - completionHandler(result) - - if shouldDisconnect - { - // Add short delay to prevent us from dropping connection too quickly. - DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) { - self.disconnect() - } - } - } - - do - { - let data = try JSONEncoder().encode(response) - let responseSize = withUnsafeBytes(of: Int32(data.count)) { Data($0) } - - self.send(responseSize) { (result) in - switch result - { - case .failure: finish(.failure(.init(.lostConnection))) - case .success: - - self.send(data) { (result) in - switch result - { - case .failure: finish(.failure(.init(.lostConnection))) - case .success: finish(.success(())) - } - } - } - } - } - catch - { - finish(.failure(.init(.invalidResponse))) - } - } - - func receiveRequest(completionHandler: @escaping (Result) -> Void) - { - let size = MemoryLayout.size - - print("Receiving request size") - self.receiveData(expectedBytes: size) { (result) in - do - { - let data = try result.get() - - print("Receiving request...") - let expectedBytes = Int(data.withUnsafeBytes { $0.load(as: Int32.self) }) - self.receiveData(expectedBytes: expectedBytes) { (result) in - do - { - let data = try result.get() - let request = try JSONDecoder().decode(ServerRequest.self, from: data) - - print("Received installation request:", request) - completionHandler(.success(request)) - } - catch - { - completionHandler(.failure(ALTServerError(error))) - } - } - } - catch - { - completionHandler(.failure(ALTServerError(error))) - } - } - } - - func send(_ data: Data, completionHandler: @escaping (Result) -> Void) - { - switch self.connection - { - case .wireless(let connection): - connection.send(content: data, completion: .contentProcessed { (error) in - if let error = error - { - completionHandler(.failure(error)) - } - else - { - completionHandler(.success(())) - } - }) - - case .wired(let connection): - connection.send(data) { (success, error) in - if !success - { - completionHandler(.failure(ALTServerError(.lostConnection))) - } - else - { - completionHandler(.success(())) - } - } - } - } - - func receiveData(expectedBytes: Int, completionHandler: @escaping (Result) -> Void) - { - func finish(data: Data?, error: Error?) - { - do - { - let data = try self.process(data: data, error: error) - completionHandler(.success(data)) - } - catch - { - completionHandler(.failure(ALTServerError(error))) - } - } - - switch self.connection - { - case .wireless(let connection): - connection.receive(minimumIncompleteLength: expectedBytes, maximumLength: expectedBytes) { (data, _, _, error) in - finish(data: data, error: error) - } - - case .wired(let connection): - connection.receiveData(withExpectedSize: expectedBytes) { (data, error) in - finish(data: data, error: error) - } - } - } -} - -extension ClientConnection: CustomStringConvertible -{ - var description: String { - switch self.connection - { - case .wireless(let connection): return "\(connection.endpoint) (Wireless)" - case .wired(let connection): return "\(connection.device.name) (Wired)" - } - } -} - -private extension ClientConnection -{ - func process(data: Data?, error: Error?) throws -> Data - { - do - { - do - { - guard let data = data else { throw error ?? ALTServerError(.unknown) } - return data - } - catch let error as NWError - { - print("Error receiving data from connection \(connection)", error) - - throw ALTServerError(.lostConnection) - } - catch - { - throw error - } - } - catch let error as ALTServerError - { - throw error - } - catch - { - preconditionFailure("A non-ALTServerError should never be thrown from this method.") - } - } -} diff --git a/AltServer/Connections/ConnectionManager.swift b/AltServer/Connections/ConnectionManager.swift deleted file mode 100644 index fa665e8d..00000000 --- a/AltServer/Connections/ConnectionManager.swift +++ /dev/null @@ -1,535 +0,0 @@ -// -// ConnectionManager.swift -// AltServer -// -// Created by Riley Testut on 5/23/19. -// Copyright © 2019 Riley Testut. All rights reserved. -// - -import Foundation -import Network -import AppKit - -import AltKit - -extension ALTServerError -{ - init(_ error: E) - { - switch error - { - case let error as ALTServerError: self = error - case is DecodingError: self = ALTServerError(.invalidRequest) - case is EncodingError: self = ALTServerError(.invalidResponse) - case let error as NSError: - self = ALTServerError(.unknown, userInfo: error.userInfo) - } - } -} - -extension ConnectionManager -{ - enum State - { - case notRunning - case connecting - case running(NWListener.Service) - case failed(Swift.Error) - } -} - -class ConnectionManager -{ - static let shared = ConnectionManager() - - var stateUpdateHandler: ((State) -> Void)? - - private(set) var state: State = .notRunning { - didSet { - self.stateUpdateHandler?(self.state) - } - } - - private lazy var listener = self.makeListener() - private let dispatchQueue = DispatchQueue(label: "com.rileytestut.AltServer.connections", qos: .utility) - - private var connections = [ClientConnection]() - private var notificationConnections = [ALTDevice: NotificationConnection]() - - private init() - { - NotificationCenter.default.addObserver(self, selector: #selector(ConnectionManager.deviceDidConnect(_:)), name: .deviceManagerDeviceDidConnect, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(ConnectionManager.deviceDidDisconnect(_:)), name: .deviceManagerDeviceDidDisconnect, object: nil) - } - - func start() - { - switch self.state - { - case .notRunning, .failed: self.listener.start(queue: self.dispatchQueue) - default: break - } - } - - func stop() - { - switch self.state - { - case .running: self.listener.cancel() - default: break - } - } - - func disconnect(_ connection: ClientConnection) - { - connection.disconnect() - - if let index = self.connections.firstIndex(where: { $0 === connection }) - { - self.connections.remove(at: index) - } - } -} - -private extension ConnectionManager -{ - func makeListener() -> NWListener - { - let listener = try! NWListener(using: .tcp) - - let service: NWListener.Service - - if let serverID = UserDefaults.standard.serverID?.data(using: .utf8) - { - let txtDictionary = ["serverID": serverID] - let txtData = NetService.data(fromTXTRecord: txtDictionary) - - service = NWListener.Service(name: nil, type: ALTServerServiceType, domain: nil, txtRecord: txtData) - } - else - { - service = NWListener.Service(type: ALTServerServiceType) - } - - listener.service = service - - listener.serviceRegistrationUpdateHandler = { (serviceChange) in - switch serviceChange - { - case .add(.service(let name, let type, let domain, _)): - let service = NWListener.Service(name: name, type: type, domain: domain, txtRecord: nil) - self.state = .running(service) - - default: break - } - } - - listener.stateUpdateHandler = { (state) in - switch state - { - case .ready: break - case .waiting, .setup: self.state = .connecting - case .cancelled: self.state = .notRunning - case .failed(let error): - self.state = .failed(error) - self.start() - - @unknown default: break - } - } - - listener.newConnectionHandler = { [weak self] (connection) in - self?.prepare(connection) - } - - return listener - } - - func prepare(_ connection: NWConnection) - { - let clientConnection = ClientConnection(connection: .wireless(connection)) - - guard !self.connections.contains(where: { $0 === clientConnection }) else { return } - self.connections.append(clientConnection) - - connection.stateUpdateHandler = { [weak self] (state) in - switch state - { - case .setup, .preparing: break - - case .ready: - print("Connected to client:", connection.endpoint) - self?.handleRequest(for: clientConnection) - - case .waiting: - print("Waiting for connection...") - - case .failed(let error): - print("Failed to connect to service \(connection.endpoint).", error) - self?.disconnect(clientConnection) - - case .cancelled: - self?.disconnect(clientConnection) - - @unknown default: break - } - } - - connection.start(queue: self.dispatchQueue) - } -} - -private extension ConnectionManager -{ - func startNotificationConnection(to device: ALTDevice) - { - ALTDeviceManager.shared.startNotificationConnection(to: device) { (connection, error) in - guard let connection = connection else { return } - - let notifications: [CFNotificationName] = [.wiredServerConnectionAvailableRequest, .wiredServerConnectionStartRequest] - connection.startListening(forNotifications: notifications.map { String($0.rawValue) }) { (success, error) in - guard success else { return } - - connection.receivedNotificationHandler = { [weak self, weak connection] (notification) in - guard let self = self, let connection = connection else { return } - self.handle(notification, for: connection) - } - - self.notificationConnections[device] = connection - } - } - } - - func stopNotificationConnection(to device: ALTDevice) - { - guard let connection = self.notificationConnections[device] else { return } - connection.disconnect() - - self.notificationConnections[device] = nil - } - - func handle(_ notification: CFNotificationName, for connection: NotificationConnection) - { - switch notification - { - case .wiredServerConnectionAvailableRequest: - connection.sendNotification(.wiredServerConnectionAvailableResponse) { (success, error) in - if let error = error, !success - { - print("Error sending wired server connection response.", error) - } - else - { - print("Sent wired server connection available response!") - } - } - - case .wiredServerConnectionStartRequest: - ALTDeviceManager.shared.startWiredConnection(to: connection.device) { (wiredConnection, error) in - if let wiredConnection = wiredConnection - { - print("Started wired server connection!") - - let clientConnection = ClientConnection(connection: .wired(wiredConnection)) - self.handleRequest(for: clientConnection) - } - else if let error = error - { - print("Error starting wired server connection.", error) - } - } - - default: break - } - } -} - -private extension ConnectionManager -{ - func handleRequest(for connection: ClientConnection) - { - connection.receiveRequest() { (result) in - print("Received initial request with result:", result) - - switch result - { - case .failure(let error): - let response = ErrorResponse(error: ALTServerError(error)) - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent error response with result:", result) - } - - case .success(.anisetteData(let request)): - self.handleAnisetteDataRequest(request, for: connection) - - case .success(.prepareApp(let request)): - self.handlePrepareAppRequest(request, for: connection) - - case .success(.beginInstallation): break - - case .success(.installProvisioningProfiles(let request)): - self.handleInstallProvisioningProfilesRequest(request, for: connection) - - case .success(.removeProvisioningProfiles(let request)): - self.handleRemoveProvisioningProfilesRequest(request, for: connection) - - case .success(.removeApp(let request)): - self.handleRemoveAppRequest(request, for: connection) - - case .success(.unknown): - let response = ErrorResponse(error: ALTServerError(.unknownRequest)) - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent unknown request response with result:", result) - } - } - } - } - - func handleAnisetteDataRequest(_ request: AnisetteDataRequest, for connection: ClientConnection) - { - AnisetteDataManager.shared.requestAnisetteData { (result) in - switch result - { - case .failure(let error): - let errorResponse = ErrorResponse(error: ALTServerError(error)) - connection.send(errorResponse, shouldDisconnect: true) { (result) in - print("Sent anisette data error response with result:", result) - } - - case .success(let anisetteData): - let response = AnisetteDataResponse(anisetteData: anisetteData) - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent anisette data response with result:", result) - } - } - } - } - - func handlePrepareAppRequest(_ request: PrepareAppRequest, for connection: ClientConnection) - { - var temporaryURL: URL? - - func finish(_ result: Result) - { - if let temporaryURL = temporaryURL - { - do { try FileManager.default.removeItem(at: temporaryURL) } - catch { print("Failed to remove .ipa.", error) } - } - - switch result - { - case .failure(let error): - print("Failed to process request from \(connection).", error) - - let response = ErrorResponse(error: ALTServerError(error)) - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent install app error response to \(connection) with result:", result) - } - - case .success: - print("Processed request from \(connection).") - - let response = InstallationProgressResponse(progress: 1.0) - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent install app response to \(connection) with result:", result) - } - } - } - - self.receiveApp(for: request, from: connection) { (result) in - print("Received app with result:", result) - - switch result - { - case .failure(let error): finish(.failure(error)) - case .success(let fileURL): - temporaryURL = fileURL - - print("Awaiting begin installation request...") - - connection.receiveRequest() { (result) in - print("Received begin installation request with result:", result) - - switch result - { - case .failure(let error): finish(.failure(error)) - case .success(.beginInstallation(let installRequest)): - print("Installing to device \(request.udid)...") - - self.installApp(at: fileURL, toDeviceWithUDID: request.udid, activeProvisioningProfiles: installRequest.activeProfiles, connection: connection) { (result) in - print("Installed to device with result:", result) - switch result - { - case .failure(let error): finish(.failure(error)) - case .success: finish(.success(())) - } - } - - case .success: - let response = ErrorResponse(error: ALTServerError(.unknownRequest)) - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent unknown request error response to \(connection) with result:", result) - } - } - } - } - } - } - - func receiveApp(for request: PrepareAppRequest, from connection: ClientConnection, completionHandler: @escaping (Result) -> Void) - { - connection.receiveData(expectedBytes: request.contentSize) { (result) in - do - { - print("Received app data!") - - let data = try result.get() - - guard ALTDeviceManager.shared.availableDevices.contains(where: { $0.identifier == request.udid }) else { throw ALTServerError(.deviceNotFound) } - - print("Writing app data...") - - let temporaryURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString + ".ipa") - try data.write(to: temporaryURL, options: .atomic) - - print("Wrote app to URL:", temporaryURL) - - completionHandler(.success(temporaryURL)) - } - catch - { - print("Error processing app data:", error) - - completionHandler(.failure(ALTServerError(error))) - } - } - } - - func installApp(at fileURL: URL, toDeviceWithUDID udid: String, activeProvisioningProfiles: Set?, connection: ClientConnection, completionHandler: @escaping (Result) -> Void) - { - let serialQueue = DispatchQueue(label: "com.altstore.ConnectionManager.installQueue", qos: .default) - var isSending = false - - var observation: NSKeyValueObservation? - - let progress = ALTDeviceManager.shared.installApp(at: fileURL, toDeviceWithUDID: udid, activeProvisioningProfiles: activeProvisioningProfiles) { (success, error) in - print("Installed app with result:", error == nil ? "Success" : error!.localizedDescription) - - if let error = error.map({ $0 as? ALTServerError ?? ALTServerError(.unknown) }) - { - completionHandler(.failure(error)) - } - else - { - completionHandler(.success(())) - } - - observation?.invalidate() - observation = nil - } - - observation = progress.observe(\.fractionCompleted, changeHandler: { (progress, change) in - serialQueue.async { - guard !isSending else { return } - isSending = true - - print("Progress:", progress.fractionCompleted) - let response = InstallationProgressResponse(progress: progress.fractionCompleted) - - connection.send(response) { (result) in - serialQueue.async { - isSending = false - } - } - } - }) - } - - func handleInstallProvisioningProfilesRequest(_ request: InstallProvisioningProfilesRequest, for connection: ClientConnection) - { - ALTDeviceManager.shared.installProvisioningProfiles(request.provisioningProfiles, toDeviceWithUDID: request.udid, activeProvisioningProfiles: request.activeProfiles) { (success, error) in - if let error = error, !success - { - print("Failed to install profiles \(request.provisioningProfiles.map { $0.bundleIdentifier }):", error) - - let errorResponse = ErrorResponse(error: ALTServerError(error)) - connection.send(errorResponse, shouldDisconnect: true) { (result) in - print("Sent install profiles error response with result:", result) - } - } - else - { - print("Installed profiles:", request.provisioningProfiles.map { $0.bundleIdentifier }) - - let response = InstallProvisioningProfilesResponse() - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent install profiles response to \(connection) with result:", result) - } - } - } - } - - func handleRemoveProvisioningProfilesRequest(_ request: RemoveProvisioningProfilesRequest, for connection: ClientConnection) - { - ALTDeviceManager.shared.removeProvisioningProfiles(forBundleIdentifiers: request.bundleIdentifiers, fromDeviceWithUDID: request.udid) { (success, error) in - if let error = error, !success - { - print("Failed to remove profiles \(request.bundleIdentifiers):", error) - - let errorResponse = ErrorResponse(error: ALTServerError(error)) - connection.send(errorResponse, shouldDisconnect: true) { (result) in - print("Sent remove profiles error response with result:", result) - } - } - else - { - print("Removed profiles:", request.bundleIdentifiers) - - let response = RemoveProvisioningProfilesResponse() - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent remove profiles success response to \(connection) with result:", result) - } - } - } - } - - func handleRemoveAppRequest(_ request: RemoveAppRequest, for connection: ClientConnection) - { - ALTDeviceManager.shared.removeApp(forBundleIdentifier: request.bundleIdentifier, fromDeviceWithUDID: request.udid) { (success, error) in - if let error = error, !success - { - print("Failed to remove app \(request.bundleIdentifier):", error) - - let errorResponse = ErrorResponse(error: ALTServerError(error)) - connection.send(errorResponse, shouldDisconnect: true) { (result) in - print("Sent remove a[[ error response with result:", result) - } - } - else - { - print("Removed app:", request.bundleIdentifier) - - let response = RemoveAppResponse() - connection.send(response, shouldDisconnect: true) { (result) in - print("Sent remove app success response to \(connection) with result:", result) - } - } - } - } -} - -private extension ConnectionManager -{ - @objc func deviceDidConnect(_ notification: Notification) - { - guard let device = notification.object as? ALTDevice else { return } - self.startNotificationConnection(to: device) - } - - @objc func deviceDidDisconnect(_ notification: Notification) - { - guard let device = notification.object as? ALTDevice else { return } - self.stopNotificationConnection(to: device) - } -} diff --git a/AltServer/Connections/RequestHandler.swift b/AltServer/Connections/RequestHandler.swift new file mode 100644 index 00000000..fefaaf00 --- /dev/null +++ b/AltServer/Connections/RequestHandler.swift @@ -0,0 +1,219 @@ +// +// RequestHandler.swift +// AltServer +// +// Created by Riley Testut on 5/23/19. +// Copyright © 2019 Riley Testut. All rights reserved. +// + +import Foundation +import AltKit + +typealias ConnectionManager = AltKit.ConnectionManager + +private let connectionManager = ConnectionManager(requestHandler: RequestHandler(), + connectionHandlers: [WirelessConnectionHandler(), WiredConnectionHandler()]) + +extension ConnectionManager +{ + static var shared: ConnectionManager { + return connectionManager + } +} + +struct RequestHandler: AltKit.RequestHandler +{ + func handleAnisetteDataRequest(_ request: AnisetteDataRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + { + AnisetteDataManager.shared.requestAnisetteData { (result) in + switch result + { + case .failure(let error): completionHandler(.failure(error)) + case .success(let anisetteData): + let response = AnisetteDataResponse(anisetteData: anisetteData) + completionHandler(.success(response)) + } + } + } + + func handlePrepareAppRequest(_ request: PrepareAppRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + { + var temporaryURL: URL? + + func finish(_ result: Result) + { + if let temporaryURL = temporaryURL + { + do { try FileManager.default.removeItem(at: temporaryURL) } + catch { print("Failed to remove .ipa.", error) } + } + + completionHandler(result) + } + + self.receiveApp(for: request, from: connection) { (result) in + print("Received app with result:", result) + + switch result + { + case .failure(let error): finish(.failure(error)) + case .success(let fileURL): + temporaryURL = fileURL + + print("Awaiting begin installation request...") + + connection.receiveRequest() { (result) in + print("Received begin installation request with result:", result) + + switch result + { + case .failure(let error): finish(.failure(error)) + case .success(.beginInstallation(let installRequest)): + print("Installing app to device \(request.udid)...") + + self.installApp(at: fileURL, toDeviceWithUDID: request.udid, activeProvisioningProfiles: installRequest.activeProfiles, connection: connection) { (result) in + print("Installed app to device with result:", result) + switch result + { + case .failure(let error): finish(.failure(error)) + case .success: + let response = InstallationProgressResponse(progress: 1.0) + finish(.success(response)) + } + } + + case .success: finish(.failure(ALTServerError(.unknownRequest))) + } + } + } + } + } + + func handleInstallProvisioningProfilesRequest(_ request: InstallProvisioningProfilesRequest, for connection: Connection, + completionHandler: @escaping (Result) -> Void) + { + ALTDeviceManager.shared.installProvisioningProfiles(request.provisioningProfiles, toDeviceWithUDID: request.udid, activeProvisioningProfiles: request.activeProfiles) { (success, error) in + if let error = error, !success + { + print("Failed to install profiles \(request.provisioningProfiles.map { $0.bundleIdentifier }):", error) + completionHandler(.failure(ALTServerError(error))) + } + else + { + print("Installed profiles:", request.provisioningProfiles.map { $0.bundleIdentifier }) + + let response = InstallProvisioningProfilesResponse() + completionHandler(.success(response)) + } + } + } + + func handleRemoveProvisioningProfilesRequest(_ request: RemoveProvisioningProfilesRequest, for connection: Connection, + completionHandler: @escaping (Result) -> Void) + { + ALTDeviceManager.shared.removeProvisioningProfiles(forBundleIdentifiers: request.bundleIdentifiers, fromDeviceWithUDID: request.udid) { (success, error) in + if let error = error, !success + { + print("Failed to remove profiles \(request.bundleIdentifiers):", error) + completionHandler(.failure(ALTServerError(error))) + } + else + { + print("Removed profiles:", request.bundleIdentifiers) + + let response = RemoveProvisioningProfilesResponse() + completionHandler(.success(response)) + } + } + } + + func handleRemoveAppRequest(_ request: RemoveAppRequest, for connection: Connection, completionHandler: @escaping (Result) -> Void) + { + ALTDeviceManager.shared.removeApp(forBundleIdentifier: request.bundleIdentifier, fromDeviceWithUDID: request.udid) { (success, error) in + if let error = error, !success + { + print("Failed to remove app \(request.bundleIdentifier):", error) + completionHandler(.failure(ALTServerError(error))) + } + else + { + print("Removed app:", request.bundleIdentifier) + + let response = RemoveAppResponse() + completionHandler(.success(response)) + } + } + } +} + +private extension RequestHandler +{ + func receiveApp(for request: PrepareAppRequest, from connection: Connection, completionHandler: @escaping (Result) -> Void) + { + connection.receiveData(expectedSize: request.contentSize) { (result) in + do + { + print("Received app data!") + + let data = try result.get() + + guard ALTDeviceManager.shared.availableDevices.contains(where: { $0.identifier == request.udid }) else { throw ALTServerError(.deviceNotFound) } + + print("Writing app data...") + + let temporaryURL = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString + ".ipa") + try data.write(to: temporaryURL, options: .atomic) + + print("Wrote app to URL:", temporaryURL) + + completionHandler(.success(temporaryURL)) + } + catch + { + print("Error processing app data:", error) + + completionHandler(.failure(ALTServerError(error))) + } + } + } + + func installApp(at fileURL: URL, toDeviceWithUDID udid: String, activeProvisioningProfiles: Set?, connection: Connection, completionHandler: @escaping (Result) -> Void) + { + let serialQueue = DispatchQueue(label: "com.altstore.ConnectionManager.installQueue", qos: .default) + var isSending = false + + var observation: NSKeyValueObservation? + + let progress = ALTDeviceManager.shared.installApp(at: fileURL, toDeviceWithUDID: udid, activeProvisioningProfiles: activeProvisioningProfiles) { (success, error) in + print("Installed app with result:", error == nil ? "Success" : error!.localizedDescription) + + if let error = error.map { ALTServerError($0) } + { + completionHandler(.failure(error)) + } + else + { + completionHandler(.success(())) + } + + observation?.invalidate() + observation = nil + } + + observation = progress.observe(\.fractionCompleted, changeHandler: { (progress, change) in + serialQueue.async { + guard !isSending else { return } + isSending = true + + print("Progress:", progress.fractionCompleted) + let response = InstallationProgressResponse(progress: progress.fractionCompleted) + + connection.send(response) { (result) in + serialQueue.async { + isSending = false + } + } + } + }) + } +} diff --git a/AltServer/Connections/WiredConnectionHandler.swift b/AltServer/Connections/WiredConnectionHandler.swift new file mode 100644 index 00000000..55fde198 --- /dev/null +++ b/AltServer/Connections/WiredConnectionHandler.swift @@ -0,0 +1,116 @@ +// +// WiredConnectionHandler.swift +// AltServer +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation +import AltKit + +class WiredConnectionHandler: ConnectionHandler +{ + var connectionHandler: ((Connection) -> Void)? + var disconnectionHandler: ((Connection) -> Void)? + + private var notificationConnections = [ALTDevice: NotificationConnection]() + + func startListening() + { + NotificationCenter.default.addObserver(self, selector: #selector(WiredConnectionHandler.deviceDidConnect(_:)), name: .deviceManagerDeviceDidConnect, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(WiredConnectionHandler.deviceDidDisconnect(_:)), name: .deviceManagerDeviceDidDisconnect, object: nil) + } + + func stopListening() + { + NotificationCenter.default.removeObserver(self, name: .deviceManagerDeviceDidConnect, object: nil) + NotificationCenter.default.removeObserver(self, name: .deviceManagerDeviceDidDisconnect, object: nil) + } +} + +private extension WiredConnectionHandler +{ + func startNotificationConnection(to device: ALTDevice) + { + ALTDeviceManager.shared.startNotificationConnection(to: device) { (connection, error) in + guard let connection = connection else { return } + + let notifications: [CFNotificationName] = [.wiredServerConnectionAvailableRequest, .wiredServerConnectionStartRequest] + connection.startListening(forNotifications: notifications.map { String($0.rawValue) }) { (success, error) in + guard success else { return } + + connection.receivedNotificationHandler = { [weak self, weak connection] (notification) in + guard let self = self, let connection = connection else { return } + self.handle(notification, for: connection) + } + + self.notificationConnections[device] = connection + } + } + } + + func stopNotificationConnection(to device: ALTDevice) + { + guard let connection = self.notificationConnections[device] else { return } + connection.disconnect() + + self.notificationConnections[device] = nil + } + + func handle(_ notification: CFNotificationName, for connection: NotificationConnection) + { + switch notification + { + case .wiredServerConnectionAvailableRequest: + connection.sendNotification(.wiredServerConnectionAvailableResponse) { (success, error) in + if let error = error, !success + { + print("Error sending wired server connection response.", error) + } + else + { + print("Sent wired server connection available response!") + } + } + + case .wiredServerConnectionStartRequest: + ALTDeviceManager.shared.startWiredConnection(to: connection.device) { (wiredConnection, error) in + if let wiredConnection = wiredConnection + { + print("Started wired server connection!") + self.connectionHandler?(wiredConnection) + + var observation: NSKeyValueObservation? + observation = wiredConnection.observe(\.isConnected) { [weak self] (connection, change) in + guard !connection.isConnected else { return } + self?.disconnectionHandler?(connection) + + observation?.invalidate() + } + } + else if let error = error + { + print("Error starting wired server connection.", error) + } + } + + default: break + } + } +} + +private extension WiredConnectionHandler +{ + @objc func deviceDidConnect(_ notification: Notification) + { + guard let device = notification.object as? ALTDevice else { return } + self.startNotificationConnection(to: device) + } + + @objc func deviceDidDisconnect(_ notification: Notification) + { + guard let device = notification.object as? ALTDevice else { return } + self.stopNotificationConnection(to: device) + } +} diff --git a/AltServer/Connections/WirelessConnectionHandler.swift b/AltServer/Connections/WirelessConnectionHandler.swift new file mode 100644 index 00000000..d377a456 --- /dev/null +++ b/AltServer/Connections/WirelessConnectionHandler.swift @@ -0,0 +1,150 @@ +// +// WirelessConnectionHandler.swift +// AltKit +// +// Created by Riley Testut on 6/1/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import Foundation +import Network + +import AltKit + +extension WirelessConnectionHandler +{ + public enum State + { + case notRunning + case connecting + case running(NWListener.Service) + case failed(Swift.Error) + } +} + +public class WirelessConnectionHandler: ConnectionHandler +{ + public var connectionHandler: ((Connection) -> Void)? + public var disconnectionHandler: ((Connection) -> Void)? + + public var stateUpdateHandler: ((State) -> Void)? + + public private(set) var state: State = .notRunning { + didSet { + self.stateUpdateHandler?(self.state) + } + } + + private lazy var listener = self.makeListener() + private let dispatchQueue = DispatchQueue(label: "io.altstore.WirelessConnectionListener", qos: .utility) + + public func startListening() + { + switch self.state + { + case .notRunning, .failed: self.listener.start(queue: self.dispatchQueue) + default: break + } + } + + public func stopListening() + { + switch self.state + { + case .running: self.listener.cancel() + default: break + } + } +} + +private extension WirelessConnectionHandler +{ + func makeListener() -> NWListener + { + let listener = try! NWListener(using: .tcp) + + let service: NWListener.Service + + if let serverID = UserDefaults.standard.serverID?.data(using: .utf8) + { + let txtDictionary = ["serverID": serverID] + let txtData = NetService.data(fromTXTRecord: txtDictionary) + + service = NWListener.Service(name: nil, type: ALTServerServiceType, domain: nil, txtRecord: txtData) + } + else + { + service = NWListener.Service(type: ALTServerServiceType) + } + + listener.service = service + + listener.serviceRegistrationUpdateHandler = { (serviceChange) in + switch serviceChange + { + case .add(.service(let name, let type, let domain, _)): + let service = NWListener.Service(name: name, type: type, domain: domain, txtRecord: nil) + self.state = .running(service) + + default: break + } + } + + listener.stateUpdateHandler = { (state) in + switch state + { + case .ready: break + case .waiting, .setup: self.state = .connecting + case .cancelled: self.state = .notRunning + case .failed(let error): self.state = .failed(error) + @unknown default: break + } + } + + listener.newConnectionHandler = { [weak self] (connection) in + self?.prepare(connection) + } + + return listener + } + + func prepare(_ nwConnection: NWConnection) + { + print("Preparing:", nwConnection) + + // Use same instance for all callbacks. + let connection = NetworkConnection(nwConnection) + + nwConnection.stateUpdateHandler = { [weak self] (state) in + switch state + { + case .setup, .preparing: break + + case .ready: + print("Connected to client:", connection) + self?.connectionHandler?(connection) + + case .waiting: + print("Waiting for connection...") + + case .failed(let error): + print("Failed to connect to service \(nwConnection.endpoint).", error) + self?.disconnect(connection) + + case .cancelled: + self?.disconnect(connection) + + @unknown default: break + } + } + + nwConnection.start(queue: self.dispatchQueue) + } + + func disconnect(_ connection: Connection) + { + connection.disconnect() + + self.disconnectionHandler?(connection) + } +} diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 8724c742..7216dbf6 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -23,8 +23,12 @@ BF0F5FC723F394AD0080DB64 /* AltStore3ToAltStore4.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF0F5FC623F394AD0080DB64 /* AltStore3ToAltStore4.xcmappingmodel */; }; BF100C50232D7CD1006A8926 /* AltStoreToAltStore2.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF100C4F232D7CD1006A8926 /* AltStoreToAltStore2.xcmappingmodel */; }; BF100C54232D7DAE006A8926 /* StoreAppPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF100C53232D7DAE006A8926 /* StoreAppPolicy.swift */; }; + BF10EB34248730750055E6DB /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF10EB33248730750055E6DB /* main.swift */; }; BF18B0F122E25DF9005C4CF5 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18B0F022E25DF9005C4CF5 /* ToastView.swift */; }; - BF1E312B229F474900370A3C /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3129229F474900370A3C /* ConnectionManager.swift */; }; + BF18BFF32485828200DD5981 /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF22485828200DD5981 /* ConnectionManager.swift */; }; + BF18BFF724858BDE00DD5981 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF624858BDE00DD5981 /* Connection.swift */; }; + BF18BFFD2485A1E400DD5981 /* WiredConnectionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFFC2485A1E400DD5981 /* WiredConnectionHandler.swift */; }; + BF1E312B229F474900370A3C /* RequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3129229F474900370A3C /* RequestHandler.swift */; }; BF1E315722A061F500370A3C /* ServerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3128229F474900370A3C /* ServerProtocol.swift */; }; BF1E315822A061F900370A3C /* Result+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBAC8852295C90300587369 /* Result+Conveniences.swift */; }; BF1E315A22A0620000370A3C /* NSError+ALTServerError.m in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314922A060F400370A3C /* NSError+ALTServerError.m */; }; @@ -130,7 +134,6 @@ BF580482246A28F7008AE704 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF580481246A28F7008AE704 /* ViewController.swift */; }; BF580487246A28F9008AE704 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BF580486246A28F9008AE704 /* Assets.xcassets */; }; BF58048A246A28F9008AE704 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF580488246A28F9008AE704 /* LaunchScreen.storyboard */; }; - BF580492246A2C5C008AE704 /* Bundle+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */; }; BF580496246A3CB5008AE704 /* UIColor+AltBackup.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF580495246A3CB5008AE704 /* UIColor+AltBackup.swift */; }; BF580498246A3D19008AE704 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF580497246A3D19008AE704 /* UIKit.framework */; }; BF58049B246A432D008AE704 /* NSError+LocalizedFailure.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+LocalizedFailure.swift */; }; @@ -156,9 +159,13 @@ BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */ = {isa = PBXBuildFile; fileRef = BF770E6822BD57DD002A40FE /* Silence.m4a */; }; BF7C627223DBB3B400515A2D /* AltStore2ToAltStore3.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF7C627123DBB3B400515A2D /* AltStore2ToAltStore3.xcmappingmodel */; }; BF7C627423DBB78C00515A2D /* InstalledAppPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF7C627323DBB78C00515A2D /* InstalledAppPolicy.swift */; }; + BF8CAE452489E772004D6CCE /* AnisetteDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8CAE422489E772004D6CCE /* AnisetteDataManager.swift */; }; + BF8CAE462489E772004D6CCE /* AppManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8CAE432489E772004D6CCE /* AppManager.swift */; }; + BF8CAE472489E772004D6CCE /* RequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8CAE442489E772004D6CCE /* RequestHandler.swift */; }; + BF8CAE4C2489F637004D6CCE /* AltDaemon.deb in Resources */ = {isa = PBXBuildFile; fileRef = BF8CAE4A2489F5A0004D6CCE /* AltDaemon.deb */; }; + BF8CAE4E248AEABA004D6CCE /* UIDevice+Jailbreak.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8CAE4D248AEABA004D6CCE /* UIDevice+Jailbreak.swift */; }; BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8F69C122E659F700049BA1 /* AppContentViewController.swift */; }; BF8F69C422E662D300049BA1 /* AppViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF8F69C322E662D300049BA1 /* AppViewController.swift */; }; - BF9A03C623C7DD0D000D08DB /* ClientConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9A03C523C7DD0D000D08DB /* ClientConnection.swift */; }; BF9ABA4522DCFF43008935CF /* BrowseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */; }; BF9ABA4722DD0638008935CF /* BrowseCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4622DD0638008935CF /* BrowseCollectionViewCell.swift */; }; BF9ABA4922DD0742008935CF /* ScreenshotCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */; }; @@ -262,6 +269,12 @@ BFF0B696232242D3007A79E1 /* LicensesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF0B695232242D3007A79E1 /* LicensesViewController.swift */; }; BFF0B6982322CAB8007A79E1 /* InstructionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF0B6972322CAB8007A79E1 /* InstructionsViewController.swift */; }; BFF0B69A2322D7D0007A79E1 /* UIScreen+CompactHeight.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF0B6992322D7D0007A79E1 /* UIScreen+CompactHeight.swift */; }; + BFF767C82489A74E0097E58C /* WirelessConnectionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767C72489A74E0097E58C /* WirelessConnectionHandler.swift */; }; + BFF767CC2489AB5C0097E58C /* ALTServerError+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */; }; + BFF767CE2489ABE90097E58C /* NetworkConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CD2489ABE90097E58C /* NetworkConnection.swift */; }; + BFFCFA582488648D0077BFCE /* LocalConnectionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF10EB3124870B3F0055E6DB /* LocalConnectionHandler.swift */; }; + BFFCFA5B2488649E0077BFCE /* libAltKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF1E315022A0616100370A3C /* libAltKit.a */; }; + EFB988A976C401E5710498B7 /* libPods-AltDaemon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B0B5097D956380B6E11D09C /* libPods-AltDaemon.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -330,9 +343,11 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 06959A23FD240B33CB3EF551 /* Pods-AltDaemon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltDaemon.release.xcconfig"; path = "Target Support Files/Pods-AltDaemon/Pods-AltDaemon.release.xcconfig"; sourceTree = ""; }; 0DE618FA97EA42C3F468D186 /* libPods-AltStore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AltStore.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 11611D46F8A7C8B928E8156B /* Pods-AltServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltServer.debug.xcconfig"; path = "Target Support Files/Pods-AltServer/Pods-AltServer.debug.xcconfig"; sourceTree = ""; }; 589BA531D903B28F292063E5 /* Pods-AltServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltServer.release.xcconfig"; path = "Target Support Files/Pods-AltServer/Pods-AltServer.release.xcconfig"; sourceTree = ""; }; + 5B0B5097D956380B6E11D09C /* libPods-AltDaemon.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AltDaemon.a"; sourceTree = BUILT_PRODUCTS_DIR; }; A136EE677716B80768E9F0A2 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStore.release.xcconfig"; path = "Target Support Files/Pods-AltStore/Pods-AltStore.release.xcconfig"; sourceTree = ""; }; BF02419322F2156E00129732 /* RefreshAttempt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAttempt.swift; sourceTree = ""; }; BF02419522F2199300129732 /* RefreshAttemptsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAttemptsViewController.swift; sourceTree = ""; }; @@ -345,9 +360,17 @@ BF100C46232D7828006A8926 /* AltStore 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 2.xcdatamodel"; sourceTree = ""; }; BF100C4F232D7CD1006A8926 /* AltStoreToAltStore2.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStoreToAltStore2.xcmappingmodel; sourceTree = ""; }; BF100C53232D7DAE006A8926 /* StoreAppPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreAppPolicy.swift; sourceTree = ""; }; + BF10EB3124870B3F0055E6DB /* LocalConnectionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalConnectionHandler.swift; sourceTree = ""; }; + BF10EB33248730750055E6DB /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; BF18B0F022E25DF9005C4CF5 /* ToastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastView.swift; sourceTree = ""; }; + BF18BFE724857D7900DD5981 /* AltDaemon */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = AltDaemon; sourceTree = BUILT_PRODUCTS_DIR; }; + BF18BFF22485828200DD5981 /* ConnectionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionManager.swift; sourceTree = ""; }; + BF18BFF624858BDE00DD5981 /* Connection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = ""; }; + BF18BFFC2485A1E400DD5981 /* WiredConnectionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WiredConnectionHandler.swift; sourceTree = ""; }; + BF18BFFE2485A42800DD5981 /* ALTConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTConnection.h; sourceTree = ""; }; + BF18C0032485B4DE00DD5981 /* AltDaemon-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AltDaemon-Bridging-Header.h"; sourceTree = ""; }; BF1E3128229F474900370A3C /* ServerProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProtocol.swift; sourceTree = ""; }; - BF1E3129229F474900370A3C /* ConnectionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionManager.swift; sourceTree = ""; }; + BF1E3129229F474900370A3C /* RequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestHandler.swift; sourceTree = ""; }; BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+AltStore.swift"; sourceTree = ""; }; BF1E314722A060F300370A3C /* AltStore-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AltStore-Bridging-Header.h"; sourceTree = ""; }; BF1E314822A060F400370A3C /* NSError+ALTServerError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSError+ALTServerError.h"; sourceTree = ""; }; @@ -502,9 +525,13 @@ BF7C627023DBB33300515A2D /* AltStore 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 3.xcdatamodel"; sourceTree = ""; }; BF7C627123DBB3B400515A2D /* AltStore2ToAltStore3.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore2ToAltStore3.xcmappingmodel; sourceTree = ""; }; BF7C627323DBB78C00515A2D /* InstalledAppPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledAppPolicy.swift; sourceTree = ""; }; + BF8CAE422489E772004D6CCE /* AnisetteDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnisetteDataManager.swift; sourceTree = ""; }; + BF8CAE432489E772004D6CCE /* AppManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = ""; }; + BF8CAE442489E772004D6CCE /* RequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestHandler.swift; sourceTree = ""; }; + BF8CAE4A2489F5A0004D6CCE /* AltDaemon.deb */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = AltDaemon.deb; sourceTree = ""; }; + BF8CAE4D248AEABA004D6CCE /* UIDevice+Jailbreak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Jailbreak.swift"; sourceTree = ""; }; BF8F69C122E659F700049BA1 /* AppContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppContentViewController.swift; sourceTree = ""; }; BF8F69C322E662D300049BA1 /* AppViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppViewController.swift; sourceTree = ""; }; - BF9A03C523C7DD0D000D08DB /* ClientConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientConnection.swift; sourceTree = ""; }; BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewController.swift; sourceTree = ""; }; BF9ABA4622DD0638008935CF /* BrowseCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseCollectionViewCell.swift; sourceTree = ""; }; BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotCollectionViewCell.swift; sourceTree = ""; }; @@ -617,6 +644,11 @@ BFF0B695232242D3007A79E1 /* LicensesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicensesViewController.swift; sourceTree = ""; }; BFF0B6972322CAB8007A79E1 /* InstructionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstructionsViewController.swift; sourceTree = ""; }; BFF0B6992322D7D0007A79E1 /* UIScreen+CompactHeight.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScreen+CompactHeight.swift"; sourceTree = ""; }; + BFF767C72489A74E0097E58C /* WirelessConnectionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WirelessConnectionHandler.swift; sourceTree = ""; }; + BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTServerError+Conveniences.swift"; sourceTree = ""; }; + BFF767CD2489ABE90097E58C /* NetworkConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConnection.swift; sourceTree = ""; }; + BFFCFA45248835530077BFCE /* AltDaemon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AltDaemon.entitlements; sourceTree = ""; }; + DA55288EC4433117304BAF39 /* Pods-AltDaemon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltDaemon.debug.xcconfig"; path = "Target Support Files/Pods-AltDaemon/Pods-AltDaemon.debug.xcconfig"; 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 = ""; }; FC3822AB1C4CF1D4CDF7445D /* Pods_AltServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltServer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -629,6 +661,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BF18BFE424857D7900DD5981 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BFFCFA5B2488649E0077BFCE /* libAltKit.a in Frameworks */, + EFB988A976C401E5710498B7 /* libPods-AltDaemon.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BF1E314D22A0616100370A3C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -685,6 +726,8 @@ A136EE677716B80768E9F0A2 /* Pods-AltStore.release.xcconfig */, 11611D46F8A7C8B928E8156B /* Pods-AltServer.debug.xcconfig */, 589BA531D903B28F292063E5 /* Pods-AltServer.release.xcconfig */, + DA55288EC4433117304BAF39 /* Pods-AltDaemon.debug.xcconfig */, + 06959A23FD240B33CB3EF551 /* Pods-AltDaemon.release.xcconfig */, ); path = Pods; sourceTree = ""; @@ -735,19 +778,38 @@ path = Policies; sourceTree = ""; }; + BF18BFE824857D7900DD5981 /* AltDaemon */ = { + isa = PBXGroup; + children = ( + BFFCFA45248835530077BFCE /* AltDaemon.entitlements */, + BF10EB33248730750055E6DB /* main.swift */, + BF8CAE442489E772004D6CCE /* RequestHandler.swift */, + BF10EB3124870B3F0055E6DB /* LocalConnectionHandler.swift */, + BF8CAE422489E772004D6CCE /* AnisetteDataManager.swift */, + BF8CAE432489E772004D6CCE /* AppManager.swift */, + BF18C0032485B4DE00DD5981 /* AltDaemon-Bridging-Header.h */, + ); + path = AltDaemon; + sourceTree = ""; + }; + BF18BFFF2485A75F00DD5981 /* Server Protocol */ = { + isa = PBXGroup; + children = ( + BF1E3128229F474900370A3C /* ServerProtocol.swift */, + BFD44605241188C300EAB90A /* CodableServerError.swift */, + ); + path = "Server Protocol"; + sourceTree = ""; + }; BF1E315122A0616100370A3C /* AltKit */ = { isa = PBXGroup; children = ( BFD52BD222A06EFB000B7ED1 /* AltKit.h */, BF718BD723C93DB700A89F2D /* AltKit.m */, - BFBAC8852295C90300587369 /* Result+Conveniences.swift */, - BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */, - BF1E3128229F474900370A3C /* ServerProtocol.swift */, - BFD44605241188C300EAB90A /* CodableServerError.swift */, - BF1E314822A060F400370A3C /* NSError+ALTServerError.h */, - BF1E314922A060F400370A3C /* NSError+ALTServerError.m */, - BF718BC723C919CC00A89F2D /* CFNotificationName+AltStore.h */, - BF718BC823C919E300A89F2D /* CFNotificationName+AltStore.m */, + BF18BFFF2485A75F00DD5981 /* Server Protocol */, + BFF767CF2489AC240097E58C /* Connections */, + BFF767C32489A6800097E58C /* Extensions */, + BFF767C42489A6980097E58C /* Categories */, ); path = AltKit; sourceTree = ""; @@ -1072,6 +1134,7 @@ BF45872C2298D31600BD7491 /* libimobiledevice */, BF5C5FC6237DF5AE00EDD0C6 /* AltPlugin */, BF58047C246A28F7008AE704 /* AltBackup */, + BF18BFE824857D7900DD5981 /* AltDaemon */, BFD247852284BB3300981D42 /* Frameworks */, BFD2476B2284B9A500981D42 /* Products */, 4460E048E3AC1C9708C4FA33 /* Pods */, @@ -1087,6 +1150,7 @@ BF1E315022A0616100370A3C /* libAltKit.a */, BF5C5FC5237DF5AE00EDD0C6 /* AltPlugin.mailbundle */, BF58047B246A28F7008AE704 /* AltBackup.app */, + BF18BFE724857D7900DD5981 /* AltDaemon */, ); name = Products; sourceTree = ""; @@ -1138,6 +1202,7 @@ BF4713A422976CFC00784A2F /* openssl.framework */, FC3822AB1C4CF1D4CDF7445D /* Pods_AltServer.framework */, 0DE618FA97EA42C3F468D186 /* libPods-AltStore.a */, + 5B0B5097D956380B6E11D09C /* libPods-AltDaemon.a */, ); name = Frameworks; sourceTree = ""; @@ -1177,6 +1242,7 @@ BFB1169C22932DB100BB457C /* apps.json */, BFD247762284B9A700981D42 /* Assets.xcassets */, BF770E6822BD57DD002A40FE /* Silence.m4a */, + BF8CAE4A2489F5A0004D6CCE /* AltDaemon.deb */, ); path = Resources; sourceTree = ""; @@ -1225,6 +1291,7 @@ BF6C336124197D700034FD24 /* NSError+LocalizedFailure.swift */, BF663C4E2433ED8200DAA738 /* FileManager+DirectorySize.swift */, BF6A531F246DC1B0004F59C8 /* FileManager+SharedDirectories.swift */, + BF8CAE4D248AEABA004D6CCE /* UIDevice+Jailbreak.swift */, ); path = Extensions; sourceTree = ""; @@ -1232,8 +1299,9 @@ BFD52BDC22A0A659000B7ED1 /* Connections */ = { isa = PBXGroup; children = ( - BF1E3129229F474900370A3C /* ConnectionManager.swift */, - BF9A03C523C7DD0D000D08DB /* ClientConnection.swift */, + BF1E3129229F474900370A3C /* RequestHandler.swift */, + BFF767C72489A74E0097E58C /* WirelessConnectionHandler.swift */, + BF18BFFC2485A1E400DD5981 /* WiredConnectionHandler.swift */, BF718BCF23C91BD300A89F2D /* ALTWiredConnection.h */, BF718BD223C91C7000A89F2D /* ALTWiredConnection+Private.h */, BF718BD023C91BD300A89F2D /* ALTWiredConnection.m */, @@ -1320,6 +1388,38 @@ path = Authentication; sourceTree = ""; }; + BFF767C32489A6800097E58C /* Extensions */ = { + isa = PBXGroup; + children = ( + BFBAC8852295C90300587369 /* Result+Conveniences.swift */, + BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */, + BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + BFF767C42489A6980097E58C /* Categories */ = { + isa = PBXGroup; + children = ( + BF1E314822A060F400370A3C /* NSError+ALTServerError.h */, + BF1E314922A060F400370A3C /* NSError+ALTServerError.m */, + BF718BC723C919CC00A89F2D /* CFNotificationName+AltStore.h */, + BF718BC823C919E300A89F2D /* CFNotificationName+AltStore.m */, + ); + path = Categories; + sourceTree = ""; + }; + BFF767CF2489AC240097E58C /* Connections */ = { + isa = PBXGroup; + children = ( + BF18BFF22485828200DD5981 /* ConnectionManager.swift */, + BF18BFFE2485A42800DD5981 /* ALTConnection.h */, + BF18BFF624858BDE00DD5981 /* Connection.swift */, + BFF767CD2489ABE90097E58C /* NetworkConnection.swift */, + ); + path = Connections; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -1371,6 +1471,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + BF18BFE624857D7900DD5981 /* AltDaemon */ = { + isa = PBXNativeTarget; + buildConfigurationList = BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */; + buildPhases = ( + BF50DDF3ED17533F566F5915 /* [CP] Check Pods Manifest.lock */, + BF18BFE324857D7900DD5981 /* Sources */, + BF18BFE424857D7900DD5981 /* Frameworks */, + 258892614AC96DBEA6CBA5F5 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AltDaemon; + productName = AltDaemon; + productReference = BF18BFE724857D7900DD5981 /* AltDaemon */; + productType = "com.apple.product-type.library.dynamic"; + }; BF1E314F22A0616100370A3C /* AltKit */ = { isa = PBXNativeTarget; buildConfigurationList = BF1E315422A0616100370A3C /* Build configuration list for PBXNativeTarget "AltKit" */; @@ -1491,10 +1609,14 @@ BFD247622284B9A500981D42 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1140; + LastSwiftUpdateCheck = 1150; LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Riley Testut"; TargetAttributes = { + BF18BFE624857D7900DD5981 = { + CreatedOnToolsVersion = 11.5; + LastSwiftMigration = 1150; + }; BF1E314F22A0616100370A3C = { CreatedOnToolsVersion = 10.2.1; }; @@ -1553,6 +1675,7 @@ BF45872A2298D31600BD7491 /* libimobiledevice */, BF5C5FC4237DF5AE00EDD0C6 /* AltPlugin */, BF58047A246A28F7008AE704 /* AltBackup */, + BF18BFE624857D7900DD5981 /* AltDaemon */, ); }; /* End PBXProject section */ @@ -1587,6 +1710,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + BF8CAE4C2489F637004D6CCE /* AltDaemon.deb in Resources */, BFC57A702416FC7600EB891E /* InstalledAppsCollectionHeaderView.xib in Resources */, BFB4323F22DE852000B7F8BC /* UpdateCollectionViewCell.xib in Resources */, BFE60738231ADF49002B0E8E /* Settings.storyboard in Resources */, @@ -1607,6 +1731,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 258892614AC96DBEA6CBA5F5 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 8C9013C41DD92A1476195C0E /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1641,6 +1782,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AltServer/Pods-AltServer-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + BF50DDF3ED17533F566F5915 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AltDaemon-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; BF7FDA2C23203B6B00B5D3A4 /* Copy Launcher App */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1724,15 +1887,31 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + BF18BFE324857D7900DD5981 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF8CAE452489E772004D6CCE /* AnisetteDataManager.swift in Sources */, + BF8CAE472489E772004D6CCE /* RequestHandler.swift in Sources */, + BF10EB34248730750055E6DB /* main.swift in Sources */, + BFFCFA582488648D0077BFCE /* LocalConnectionHandler.swift in Sources */, + BF8CAE462489E772004D6CCE /* AppManager.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; BF1E314C22A0616100370A3C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( BF718BD823C93DB700A89F2D /* AltKit.m in Sources */, + BFF767CE2489ABE90097E58C /* NetworkConnection.swift in Sources */, + BFF767CC2489AB5C0097E58C /* ALTServerError+Conveniences.swift in Sources */, BF1E315A22A0620000370A3C /* NSError+ALTServerError.m in Sources */, BF1E315822A061F900370A3C /* Result+Conveniences.swift in Sources */, BF718BC923C919E300A89F2D /* CFNotificationName+AltStore.m in Sources */, BFD44606241188C400EAB90A /* CodableServerError.swift in Sources */, + BF18BFF32485828200DD5981 /* ConnectionManager.swift in Sources */, + BF18BFF724858BDE00DD5981 /* Connection.swift in Sources */, BF1E315722A061F500370A3C /* ServerProtocol.swift in Sources */, BF4E8456246F16D700ECCBD4 /* Bundle+AltStore.swift in Sources */, ); @@ -1742,10 +1921,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BFF767C82489A74E0097E58C /* WirelessConnectionHandler.swift in Sources */, BF3F786422CAA41E008FBD20 /* ALTDeviceManager+Installation.swift in Sources */, + BF18BFFD2485A1E400DD5981 /* WiredConnectionHandler.swift in Sources */, BF718BD523C928A300A89F2D /* ALTNotificationConnection.m in Sources */, - BF1E312B229F474900370A3C /* ConnectionManager.swift in Sources */, - BF9A03C623C7DD0D000D08DB /* ClientConnection.swift in Sources */, + BF1E312B229F474900370A3C /* RequestHandler.swift in Sources */, BF718BD123C91BD300A89F2D /* ALTWiredConnection.m in Sources */, BF458690229872EA00BD7491 /* AppDelegate.swift in Sources */, BF4586C52298CDB800BD7491 /* ALTDeviceManager.mm in Sources */, @@ -1819,7 +1999,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BF580492246A2C5C008AE704 /* Bundle+AltStore.swift in Sources */, BF580496246A3CB5008AE704 /* UIColor+AltBackup.swift in Sources */, BF580482246A28F7008AE704 /* ViewController.swift in Sources */, BF44EEF0246B08BA002A52F2 /* BackupController.swift in Sources */, @@ -1854,6 +2033,7 @@ BF54E8212315EF0D000AE0D8 /* ALTPatreonBenefitType.m in Sources */, BFBBE2E122931F81002097FA /* InstalledApp.swift in Sources */, BFE6073A231ADF82002B0E8E /* SettingsViewController.swift in Sources */, + BF8CAE4E248AEABA004D6CCE /* UIDevice+Jailbreak.swift in Sources */, BFE338DF22F0EADB002E24B9 /* FetchSourceOperation.swift in Sources */, BFBBE2DF22931F73002097FA /* StoreApp.swift in Sources */, BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */, @@ -2012,9 +2192,91 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + BF18BFEC24857D7900DD5981 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DA55288EC4433117304BAF39 /* Pods-AltDaemon.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_MODULES_AUTOLINK = NO; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CODE_SIGN_ENTITLEMENTS = AltDaemon/AltDaemon.entitlements; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 6XVY5G3U44; + DYLIB_COMPATIBILITY_VERSION = ""; + DYLIB_CURRENT_VERSION = ""; + EXECUTABLE_EXTENSION = ""; + EXECUTABLE_SUFFIX = ""; + INSTALL_PATH = /usr/bin; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_DYLIB_INSTALL_NAME = /usr/bin/AltDaemon; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = mh_execute; + OTHER_LDFLAGS = ( + "-ObjC", + "-lRoxas", + "-lAltSign", + "-lc++", + "-lcrypto", + "-lssl", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "AltDaemon/AltDaemon-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BF18BFED24857D7900DD5981 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 06959A23FD240B33CB3EF551 /* Pods-AltDaemon.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_MODULES_AUTOLINK = NO; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CODE_SIGN_ENTITLEMENTS = AltDaemon/AltDaemon.entitlements; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 6XVY5G3U44; + DYLIB_COMPATIBILITY_VERSION = ""; + DYLIB_CURRENT_VERSION = ""; + EXECUTABLE_EXTENSION = ""; + EXECUTABLE_SUFFIX = ""; + GCC_OPTIMIZATION_LEVEL = z; + INSTALL_PATH = /usr/bin; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_DYLIB_INSTALL_NAME = /usr/bin/AltDaemon; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = mh_execute; + OTHER_LDFLAGS = ( + "-ObjC", + "-lRoxas", + "-lAltSign", + "-lc++", + "-lcrypto", + "-lssl", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "AltDaemon/AltDaemon-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; BF1E315522A0616100370A3C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_MODULES_AUTOLINK = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 6XVY5G3U44; @@ -2032,6 +2294,7 @@ BF1E315622A0616100370A3C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_MODULES_AUTOLINK = NO; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 6XVY5G3U44; @@ -2499,6 +2762,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BF18BFEC24857D7900DD5981 /* Debug */, + BF18BFED24857D7900DD5981 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; BF1E315422A0616100370A3C /* Build configuration list for PBXNativeTarget "AltKit" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltDaemon.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/AltDaemon.xcscheme new file mode 100644 index 00000000..ef0d1b87 --- /dev/null +++ b/AltStore.xcodeproj/xcshareddata/xcschemes/AltDaemon.xcscheme @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AltStore/Components/ToastView.swift b/AltStore/Components/ToastView.swift index 643f75e7..8fc81407 100644 --- a/AltStore/Components/ToastView.swift +++ b/AltStore/Components/ToastView.swift @@ -8,6 +8,12 @@ import Roxas +extension TimeInterval +{ + static let shortToastViewDuration = 4.0 + static let longToastViewDuration = 8.0 +} + class ToastView: RSTToastView { var preferredDuration: TimeInterval @@ -16,11 +22,11 @@ class ToastView: RSTToastView { if detailedText == nil { - self.preferredDuration = 4.0 + self.preferredDuration = .shortToastViewDuration } else { - self.preferredDuration = 8.0 + self.preferredDuration = .longToastViewDuration } super.init(text: text, detailText: detailedText) @@ -38,7 +44,22 @@ class ToastView: RSTToastView convenience init(error: Error) { - let error = error as NSError + var error = error as NSError + var underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError + + var preferredDuration: TimeInterval? + + if + let unwrappedUnderlyingError = underlyingError, + error.domain == AltServerErrorDomain && error.code == ALTServerError.Code.underlyingError.rawValue + { + // Treat underlyingError as the primary error. + + error = unwrappedUnderlyingError + underlyingError = nil + + preferredDuration = .longToastViewDuration + } let text: String let detailText: String? @@ -46,20 +67,25 @@ class ToastView: RSTToastView if let failure = error.localizedFailure { text = failure - detailText = error.localizedFailureReason ?? error.localizedRecoverySuggestion ?? error.localizedDescription + detailText = error.localizedFailureReason ?? error.localizedRecoverySuggestion ?? underlyingError?.localizedDescription ?? error.localizedDescription } else if let reason = error.localizedFailureReason { text = reason - detailText = error.localizedRecoverySuggestion + detailText = error.localizedRecoverySuggestion ?? underlyingError?.localizedDescription } else { text = error.localizedDescription - detailText = nil + detailText = underlyingError?.localizedDescription } self.init(text: text, detailText: detailText) + + if let preferredDuration = preferredDuration + { + self.preferredDuration = preferredDuration + } } required init(coder aDecoder: NSCoder) { diff --git a/AltStore/Extensions/UIDevice+Jailbreak.swift b/AltStore/Extensions/UIDevice+Jailbreak.swift new file mode 100644 index 00000000..77b73a88 --- /dev/null +++ b/AltStore/Extensions/UIDevice+Jailbreak.swift @@ -0,0 +1,30 @@ +// +// UIDevice+Jailbreak.swift +// AltStore +// +// Created by Riley Testut on 6/5/20. +// Copyright © 2020 Riley Testut. All rights reserved. +// + +import UIKit + +extension UIDevice +{ + var isJailbroken: Bool { + if + FileManager.default.fileExists(atPath: "/Applications/Cydia.app") || + FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") || + FileManager.default.fileExists(atPath: "/bin/bash") || + FileManager.default.fileExists(atPath: "/usr/sbin/sshd") || + FileManager.default.fileExists(atPath: "/etc/apt") || + FileManager.default.fileExists(atPath: "/private/var/lib/apt/") || + UIApplication.shared.canOpenURL(URL(string:"cydia://")!) + { + return true + } + else + { + return false + } + } +} diff --git a/AltStore/Managing Apps/AppManager.swift b/AltStore/Managing Apps/AppManager.swift index f710f71a..2600f3d6 100644 --- a/AltStore/Managing Apps/AppManager.swift +++ b/AltStore/Managing Apps/AppManager.swift @@ -1225,9 +1225,9 @@ private extension AppManager switch error.code { case .deviceNotFound, .lostConnection: - if let server = group.context.server, server.isPreferred || server.isWiredConnection + if let server = group.context.server, server.isPreferred || server.connectionType != .wireless { - // Preferred server (or wired connection), so report errors normally. + // Preferred server (or not random wireless connection), so report errors normally. return error } else diff --git a/AltStore/Model/DatabaseManager.swift b/AltStore/Model/DatabaseManager.swift index 8a627651..323dae06 100644 --- a/AltStore/Model/DatabaseManager.swift +++ b/AltStore/Model/DatabaseManager.swift @@ -172,7 +172,14 @@ private extension DatabaseManager } let fileURL = installedApp.fileURL - if !FileManager.default.fileExists(atPath: fileURL.path) || installedApp.version != localApp.version + + #if DEBUG + let replaceCachedApp = true + #else + let replaceCachedApp = !FileManager.default.fileExists(atPath: fileURL.path) || installedApp.version != localApp.version + #endif + + if replaceCachedApp { FileManager.default.prepareTemporaryURL() { (temporaryFileURL) in do diff --git a/AltStore/Operations/FindServerOperation.swift b/AltStore/Operations/FindServerOperation.swift index e30c1b31..343a4789 100644 --- a/AltStore/Operations/FindServerOperation.swift +++ b/AltStore/Operations/FindServerOperation.swift @@ -10,14 +10,12 @@ import Foundation import AltKit import Roxas -private extension Notification.Name -{ - static let didReceiveWiredServerConnectionResponse = Notification.Name("io.altstore.didReceiveWiredServerConnectionResponse") -} - -private let ReceivedWiredServerConnectionResponse: @convention(c) (CFNotificationCenter?, UnsafeMutableRawPointer?, CFNotificationName?, UnsafeRawPointer?, CFDictionary?) -> Void = +private let ReceivedServerConnectionResponse: @convention(c) (CFNotificationCenter?, UnsafeMutableRawPointer?, CFNotificationName?, UnsafeRawPointer?, CFDictionary?) -> Void = { (center, observer, name, object, userInfo) in - NotificationCenter.default.post(name: .didReceiveWiredServerConnectionResponse, object: nil) + guard let name = name, let observer = observer else { return } + + let operation = unsafeBitCast(observer, to: FindServerOperation.self) + operation.handle(name) } @objc(FindServerOperation) @@ -26,12 +24,13 @@ class FindServerOperation: ResultOperation let context: OperationContext private var isWiredServerConnectionAvailable = false + private var isLocalServerConnectionAvailable = false init(context: OperationContext = OperationContext()) { self.context = context } - + override func main() { super.main() @@ -49,48 +48,68 @@ class FindServerOperation: ResultOperation } let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() + let observer = Unmanaged.passUnretained(self).toOpaque() - // Prepare observers to receive callback from wired server (if connected). - CFNotificationCenterAddObserver(notificationCenter, nil, ReceivedWiredServerConnectionResponse, CFNotificationName.wiredServerConnectionAvailableResponse.rawValue, nil, .deliverImmediately) - NotificationCenter.default.addObserver(self, selector: #selector(FindServerOperation.didReceiveWiredServerConnectionResponse(_:)), name: .didReceiveWiredServerConnectionResponse, object: nil) + // Prepare observers to receive callback from wired connection or background daemon (if available). + CFNotificationCenterAddObserver(notificationCenter, observer, ReceivedServerConnectionResponse, CFNotificationName.wiredServerConnectionAvailableResponse.rawValue, nil, .deliverImmediately) + CFNotificationCenterAddObserver(notificationCenter, observer, ReceivedServerConnectionResponse, CFNotificationName.localServerConnectionAvailableResponse.rawValue, nil, .deliverImmediately) - // Post notification. + // Post notifications. CFNotificationCenterPostNotification(notificationCenter, .wiredServerConnectionAvailableRequest, nil, nil, true) + CFNotificationCenterPostNotification(notificationCenter, .localServerConnectionAvailableRequest, nil, nil, true) // Wait for either callback or timeout. DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) { - if self.isWiredServerConnectionAvailable + if self.isLocalServerConnectionAvailable { - let server = Server(isWiredConnection: true) + // Prefer background daemon, if it exists and is running. + let server = Server(connectionType: .local) + self.finish(.success(server)) + } + else if self.isWiredServerConnectionAvailable + { + let server = Server(connectionType: .wired) + self.finish(.success(server)) + } + else if let server = ServerManager.shared.discoveredServers.first(where: { $0.isPreferred }) + { + // Preferred server. + self.finish(.success(server)) + } + else if let server = ServerManager.shared.discoveredServers.first + { + // Any available server. self.finish(.success(server)) } else { - if let server = ServerManager.shared.discoveredServers.first(where: { $0.isPreferred }) - { - // Preferred server. - self.finish(.success(server)) - } - else if let server = ServerManager.shared.discoveredServers.first - { - // Any available server. - self.finish(.success(server)) - } - else - { - // No servers. - self.finish(.failure(ConnectionError.serverNotFound)) - } + // No servers. + self.finish(.failure(ConnectionError.serverNotFound)) } } } -} - -private extension FindServerOperation -{ - @objc func didReceiveWiredServerConnectionResponse(_ notification: Notification) + + override func finish(_ result: Result) { - self.isWiredServerConnectionAvailable = true + super.finish(result) + + let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() + let observer = Unmanaged.passUnretained(self).toOpaque() + + CFNotificationCenterRemoveObserver(notificationCenter, observer, .wiredServerConnectionAvailableResponse, nil) + CFNotificationCenterRemoveObserver(notificationCenter, observer, .localServerConnectionAvailableResponse, nil) } } +fileprivate extension FindServerOperation +{ + func handle(_ notification: CFNotificationName) + { + switch notification + { + case .wiredServerConnectionAvailableResponse: self.isWiredServerConnectionAvailable = true + case .localServerConnectionAvailableResponse: self.isLocalServerConnectionAvailable = true + default: break + } + } +} diff --git a/AltStore/Operations/InstallAppOperation.swift b/AltStore/Operations/InstallAppOperation.swift index 52fdbabb..b5756de6 100644 --- a/AltStore/Operations/InstallAppOperation.swift +++ b/AltStore/Operations/InstallAppOperation.swift @@ -144,7 +144,7 @@ class InstallAppOperation: ResultOperation }) } - let request = BeginInstallationRequest(activeProfiles: activeProfiles) + let request = BeginInstallationRequest(activeProfiles: activeProfiles, bundleIdentifier: installedApp.resignedBundleIdentifier) connection.send(request) { (result) in switch result { @@ -173,6 +173,21 @@ class InstallAppOperation: ResultOperation { self.cleanUp() + // Only remove refreshed IPA when finished. + if let app = self.context.app + { + let fileURL = InstalledApp.refreshedIPAURL(for: app) + + do + { + try FileManager.default.removeItem(at: fileURL) + } + catch + { + print("Failed to remove refreshed .ipa:", error) + } + } + super.finish(result) } } @@ -223,12 +238,6 @@ private extension InstallAppOperation do { try FileManager.default.removeItem(at: self.context.temporaryDirectory) - - if let app = self.context.app - { - let fileURL = InstalledApp.refreshedIPAURL(for: app) - try FileManager.default.removeItem(at: fileURL) - } } catch { diff --git a/AltStore/Operations/SendAppOperation.swift b/AltStore/Operations/SendAppOperation.swift index 9d8835dc..15c40d1b 100644 --- a/AltStore/Operations/SendAppOperation.swift +++ b/AltStore/Operations/SendAppOperation.swift @@ -76,26 +76,41 @@ private extension SendAppOperation guard let appData = try? Data(contentsOf: fileURL) else { throw OperationError.invalidApp } guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { throw OperationError.unknownUDID } - let request = PrepareAppRequest(udid: udid, contentSize: appData.count) + var request = PrepareAppRequest(udid: udid, contentSize: appData.count) + + if connection.server.connectionType == .local + { + // Background daemons have low memory limit (~6MB as of 13.5), + // so send just the file URL rather than the app data itself. + request.fileURL = fileURL + } - print("Sending request \(request)") connection.send(request) { (result) in switch result { case .failure(let error): completionHandler(.failure(error)) case .success: - print("Sending app data (\(appData.count) bytes)") - connection.send(appData, prependSize: false) { (result) in - switch result - { - case .failure(let error): - print("Failed to send app data (\(appData.count) bytes)") - completionHandler(.failure(error)) - - case .success: - print("Successfully sent app data (\(appData.count) bytes)") - completionHandler(.success(())) + if connection.server.connectionType == .local + { + // Sent file URL, so don't need to send any more. + completionHandler(.success(())) + } + else + { + print("Sending app data (\(appData.count) bytes)...") + + connection.send(appData, prependSize: false) { (result) in + switch result + { + case .failure(let error): + print("Failed to send app data (\(appData.count) bytes)") + completionHandler(.failure(error)) + + case .success: + print("Successfully sent app data (\(appData.count) bytes)") + completionHandler(.success(())) + } } } } diff --git a/AltStore/Resources/AltDaemon.deb b/AltStore/Resources/AltDaemon.deb new file mode 100644 index 00000000..cc0cd44b Binary files /dev/null and b/AltStore/Resources/AltDaemon.deb differ diff --git a/AltStore/Server/Server.swift b/AltStore/Server/Server.swift index 76af2427..28e5af34 100644 --- a/AltStore/Server/Server.swift +++ b/AltStore/Server/Server.swift @@ -10,22 +10,6 @@ import Network import AltKit -extension ALTServerError -{ - init(_ error: E) - { - switch error - { - case let error as ALTServerError: self = error - case is DecodingError: self = ALTServerError(.invalidResponse) - case is EncodingError: self = ALTServerError(.invalidRequest) - default: - assertionFailure("Caught unknown error type") - self = ALTServerError(.unknown) - } - } -} - enum ConnectionError: LocalizedError { case serverNotFound @@ -42,13 +26,23 @@ enum ConnectionError: LocalizedError } } +extension Server +{ + enum ConnectionType + { + case wireless + case wired + case local + } +} + struct Server: Equatable { var identifier: String? = nil var service: NetService? = nil var isPreferred = false - var isWiredConnection = false + var connectionType: ConnectionType = .wireless } extension Server diff --git a/AltStore/Server/ServerManager.swift b/AltStore/Server/ServerManager.swift index 5e8ccf5b..959272c0 100644 --- a/AltStore/Server/ServerManager.swift +++ b/AltStore/Server/ServerManager.swift @@ -94,12 +94,18 @@ extension ServerManager connection.start(queue: self.dispatchQueue) } - if let incomingConnectionsSemaphore = self.incomingConnectionsSemaphore, server.isWiredConnection + if let incomingConnectionsSemaphore = self.incomingConnectionsSemaphore, server.connectionType != .wireless { - print("Waiting for new wired connection...") + print("Waiting for incoming connection...") let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter() - CFNotificationCenterPostNotification(notificationCenter, .wiredServerConnectionStartRequest, nil, nil, true) + + switch server.connectionType + { + case .wired: CFNotificationCenterPostNotification(notificationCenter, .wiredServerConnectionStartRequest, nil, nil, true) + case .local: CFNotificationCenterPostNotification(notificationCenter, .localServerConnectionStartRequest, nil, nil, true) + case .wireless: break + } _ = incomingConnectionsSemaphore.wait(timeout: .now() + 10.0) @@ -114,7 +120,17 @@ extension ServerManager } else if let service = server.service { - let connection = NWConnection(to: .service(name: service.name, type: service.type, domain: service.domain, interface: nil), using: .tcp) + print("Connecting to service:", service) + + let parameters = NWParameters.tcp + + if server.connectionType == .local + { + // Prevent AltStore from initiating connections over multiple interfaces simultaneously 🤷‍♂️ + parameters.requiredInterfaceType = .loopback + } + + let connection = NWConnection(to: .service(name: service.name, type: service.type, domain: service.domain, interface: nil), using: parameters) start(connection) } } diff --git a/AltStore/Settings/Settings.storyboard b/AltStore/Settings/Settings.storyboard index 5a700ca4..c4f22706 100644 --- a/AltStore/Settings/Settings.storyboard +++ b/AltStore/Settings/Settings.storyboard @@ -1,9 +1,9 @@ - + - + @@ -20,7 +20,7 @@ diff --git a/AltStore/Settings/SettingsViewController.swift b/AltStore/Settings/SettingsViewController.swift index 845c9779..b5ee72fd 100644 --- a/AltStore/Settings/SettingsViewController.swift +++ b/AltStore/Settings/SettingsViewController.swift @@ -18,6 +18,7 @@ extension SettingsViewController case account case patreon case backgroundRefresh + case jailbreak case instructions case credits case debug @@ -167,6 +168,16 @@ private extension SettingsViewController case .backgroundRefresh: settingsHeaderFooterView.secondaryLabel.text = NSLocalizedString("Automatically refresh apps in the background when connected to the same WiFi as AltServer.", comment: "") + case .jailbreak: + if isHeader + { + settingsHeaderFooterView.primaryLabel.text = NSLocalizedString("JAILBREAK", comment: "") + } + else + { + settingsHeaderFooterView.secondaryLabel.text = NSLocalizedString("AltDaemon allows AltStore to install and refresh apps without a computer. You can install AltDaemon using Filza or another file manager.", comment: "") + } + case .instructions: break @@ -320,6 +331,7 @@ extension SettingsViewController { case .signIn: return (self.activeTeam == nil) ? 1 : 0 case .account: return (self.activeTeam == nil) ? 0 : 3 + case .jailbreak: return UIDevice.current.isJailbroken ? 1 : 0 default: return super.tableView(tableView, numberOfRowsInSection: section.rawValue) } } @@ -331,8 +343,9 @@ extension SettingsViewController { case .signIn where self.activeTeam != nil: return nil case .account where self.activeTeam == nil: return nil + case .jailbreak where !UIDevice.current.isJailbroken: return nil - case .signIn, .account, .patreon, .credits, .debug: + case .signIn, .account, .patreon, .jailbreak, .credits, .debug: let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderFooterView") as! SettingsHeaderFooterView self.prepare(headerView, for: section, isHeader: true) return headerView @@ -347,8 +360,9 @@ extension SettingsViewController switch section { case .signIn where self.activeTeam != nil: return nil + case .jailbreak where !UIDevice.current.isJailbroken: return nil - case .signIn, .patreon, .backgroundRefresh: + case .signIn, .patreon, .backgroundRefresh, .jailbreak: let footerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "HeaderFooterView") as! SettingsHeaderFooterView self.prepare(footerView, for: section, isHeader: false) return footerView @@ -364,8 +378,9 @@ extension SettingsViewController { case .signIn where self.activeTeam != nil: return 1.0 case .account where self.activeTeam == nil: return 1.0 + case .jailbreak where !UIDevice.current.isJailbroken: return 1.0 - case .signIn, .account, .patreon, .credits, .debug: + case .signIn, .account, .patreon, .jailbreak, .credits, .debug: let height = self.preferredHeight(for: self.prototypeHeaderFooterView, in: section, isHeader: true) return height @@ -380,8 +395,9 @@ extension SettingsViewController { case .signIn where self.activeTeam != nil: return 1.0 case .account where self.activeTeam == nil: return 1.0 + case .jailbreak where !UIDevice.current.isJailbroken: return 1.0 - case .signIn, .patreon, .backgroundRefresh: + case .signIn, .patreon, .backgroundRefresh, .jailbreak: let height = self.preferredHeight(for: self.prototypeHeaderFooterView, in: section, isHeader: false) return height @@ -399,6 +415,14 @@ extension SettingsViewController { case .signIn: self.signIn() case .instructions: break + case .jailbreak: + let fileURL = Bundle.main.url(forResource: "AltDaemon", withExtension: "deb")! + + let activityViewController = UIActivityViewController(activityItems: [fileURL], applicationActivities: nil) + self.present(activityViewController, animated: true, completion: nil) + + tableView.deselectRow(at: indexPath, animated: true) + case .credits: let row = CreditsRow.allCases[indexPath.row] switch row diff --git a/Podfile b/Podfile index 5766df6f..89b3d49c 100644 --- a/Podfile +++ b/Podfile @@ -25,6 +25,17 @@ target 'AltServer' do end +target 'AltDaemon' do + platform :ios, '12.0' + + use_modular_headers! + + # Pods for AltDaemon + pod 'AltSign', :path => 'Dependencies/AltSign' + pod 'Roxas', :path => 'Dependencies/Roxas' + +end + post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| diff --git a/Podfile.lock b/Podfile.lock index 435d8668..947ff8d5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -62,6 +62,6 @@ SPEC CHECKSUMS: Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708 STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68 -PODFILE CHECKSUM: 1317f1da77af3fbb8c90b0d34845d2f0068d488c +PODFILE CHECKSUM: bd28424f8d9916505402972bc06c1925ce9f5026 COCOAPODS: 1.8.4 diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 435d8668..947ff8d5 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -62,6 +62,6 @@ SPEC CHECKSUMS: Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708 STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68 -PODFILE CHECKSUM: 1317f1da77af3fbb8c90b0d34845d2f0068d488c +PODFILE CHECKSUM: bd28424f8d9916505402972bc06c1925ce9f5026 COCOAPODS: 1.8.4 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 2564b429..d17e3f3c 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -181,7 +181,7 @@ 68178896553225CC371A439822E86255 /* UIViewController+TransitionState.h in Headers */ = {isa = PBXBuildFile; fileRef = DC700BEFCDC775BF366DC842E52854DD /* UIViewController+TransitionState.h */; settings = {ATTRIBUTES = (Project, ); }; }; 6917E87E8C8CE780B8A31B0C11A18440 /* Key.h in Headers */ = {isa = PBXBuildFile; fileRef = 79926042DA0FE3AC31BE54B760B6F908 /* Key.h */; settings = {ATTRIBUTES = (Project, ); }; }; 695874C3111A6C110481D87968B7B2ED /* ALTCertificate.m in Sources */ = {isa = PBXBuildFile; fileRef = B348AC7ABB9564CBB9312DCAEA83CCA8 /* ALTCertificate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6B25D76AA9531920602674422A2E3174 /* Pods-AltStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EC9F77AC7ECBA94225DE401B6A8004F2 /* Pods-AltStore-dummy.m */; }; + 6B25D76AA9531920602674422A2E3174 /* Pods-AltStore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C9132C40CB4837DADEB046E727F867FB /* Pods-AltStore-dummy.m */; }; 6BEAFA9ACE3022B335DA0811B01D9D31 /* des_old.h in Headers */ = {isa = PBXBuildFile; fileRef = 442C72B32657E76148EBC3129ED2B08F /* des_old.h */; settings = {ATTRIBUTES = (Project, ); }; }; 6F0AEBA27C394CAD36373D4BC635A627 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = C72FC0FB6B8986A4FB1980229B73DDEE /* mztools.c */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; 6F30FECE94464AE2FEE52B10A54E2E53 /* Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE107E4A9765C8FEB873EB1DD6945AE5 /* Node.cpp */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; @@ -295,7 +295,7 @@ B48A7C9B5400E62C541570902B447BF4 /* NSBundle+Extensions.m in Sources */ = {isa = PBXBuildFile; fileRef = BE8BC9C468CBA45218B0935330923A03 /* NSBundle+Extensions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; B49C6C4BB263813111865E9E6C1B5763 /* RSTOperation_Subclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 214A7740331D44B14BED994D0AD62890 /* RSTOperation_Subclasses.h */; settings = {ATTRIBUTES = (Project, ); }; }; B521A6187844EE5CEFEFE07A5D1DA298 /* cms.h in Headers */ = {isa = PBXBuildFile; fileRef = 037FB3B672D2D4A5D48669AB61EA914F /* cms.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B592B30E0A198D1F2E99F9E42FD1F332 /* Pods-AltServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E8434827ABB58D1C0275F5BDE3717F16 /* Pods-AltServer-dummy.m */; }; + B592B30E0A198D1F2E99F9E42FD1F332 /* Pods-AltServer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C63B22556372BD6A596092190AC874E3 /* Pods-AltServer-dummy.m */; }; B5C917462DB73F1880C6D1CE4665A4FA /* txt_db.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E9AC3ACB0E77B051E9401069DA4F792 /* txt_db.h */; settings = {ATTRIBUTES = (Project, ); }; }; B619F619AAEC640C10789093CDABC708 /* node_list.h in Headers */ = {isa = PBXBuildFile; fileRef = FDBED95D85CFE5DE2E1A73C8BDE40AF8 /* node_list.h */; settings = {ATTRIBUTES = (Project, ); }; }; B6CF49653D8AECE522F2393D5F7E0E25 /* cccmac.h in Headers */ = {isa = PBXBuildFile; fileRef = 2119733D600F6F015CE868CFBBA5E2E1 /* cccmac.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -329,7 +329,7 @@ C8D3B91FF9292E6606553941712BAB4C /* ldid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAFA796C2028D51219FED104E02BBA2E /* ldid.cpp */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; C8D7A5021858F9A7BE3FFF4FCE4FC8F1 /* stack.h in Headers */ = {isa = PBXBuildFile; fileRef = D6B718DB69C902E4BB79FFC1C7E66C65 /* stack.h */; settings = {ATTRIBUTES = (Project, ); }; }; CABB5C4666EF8BA07A6CE46F825D6F16 /* obj_mac.h in Headers */ = {isa = PBXBuildFile; fileRef = 5496E932BB2B72CA3794430120AD503D /* obj_mac.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CB3B06F6B2DA11115709519F68A7E443 /* Pods-AltStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 695286014335265E05C28AD7B887F02F /* Pods-AltStore-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CB3B06F6B2DA11115709519F68A7E443 /* Pods-AltStore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B51BFE6F7A28BF6D5614373C24DB981 /* Pods-AltStore-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; }; CBD35A6A8664554106B1D3299A860A9B /* NSUserDefaults+DynamicProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 82BCE1984F56DA8A1D3B838D10199799 /* NSUserDefaults+DynamicProperties.h */; settings = {ATTRIBUTES = (Project, ); }; }; CC77C0103FFB833464F050472CFAA06B /* ccn.h in Headers */ = {isa = PBXBuildFile; fileRef = C556A67CD97EE39683D31C0B9F0918EB /* ccn.h */; settings = {ATTRIBUTES = (Project, ); }; }; CCA8A63BEDECA611CADF620A05A9EC5C /* ccdrbg_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 29DDEEEB045FDE52E9750BDC8D15D561 /* ccdrbg_impl.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -341,6 +341,7 @@ CFC146CDF3E73A5DE481651447554DB6 /* ALTDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EA1938AA1B5E8390790EC972AF13407 /* ALTDevice.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; D05C23FC782B87DE30EB6C19C2E22ECF /* ALTAppleAPI_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 490F5F18CD5B71977FAEF4CD4BDCC5F9 /* ALTAppleAPI_Private.h */; settings = {ATTRIBUTES = (Project, ); }; }; D155BE42D57F338F2E08EF48457F5654 /* ALTProvisioningProfile.m in Sources */ = {isa = PBXBuildFile; fileRef = F908C96C7967FF6B7D5D5B285844D269 /* ALTProvisioningProfile.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D2517BDBD1ABC11CE0956092866DE325 /* Pods-AltDaemon-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 546B88CFC6EBED3C7F26035C1D82B8B7 /* Pods-AltDaemon-dummy.m */; }; D377ED8648D9A1CE9B36AFD6447CC5B0 /* unzip.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A8A48D68CE5B5EF610D60AE61C9F584 /* unzip.h */; settings = {ATTRIBUTES = (Project, ); }; }; D38417833634FBF5417E1710E58C0082 /* UIKit+ActivityIndicating.h in Headers */ = {isa = PBXBuildFile; fileRef = 226B01F8B34FFE63742C089DDE49D208 /* UIKit+ActivityIndicating.h */; settings = {ATTRIBUTES = (Project, ); }; }; D392A50B49F1B4A91D2F1F7F9A5215D7 /* sha.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B27464FED48BC6328C2539851FAA825 /* sha.h */; settings = {ATTRIBUTES = (Project, ); }; }; @@ -384,7 +385,7 @@ EE29F8F3123CE9D8110AA5DE779B972B /* UITableViewCell+CellContent.m in Sources */ = {isa = PBXBuildFile; fileRef = F3A77F6E48BAFA480142E4AA3CD6A301 /* UITableViewCell+CellContent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; F030BF3436D9DE224E357140463045D3 /* ccdrbg.h in Headers */ = {isa = PBXBuildFile; fileRef = 66BACEB5A46F609F5EC73F3A2E4AAEA3 /* ccdrbg.h */; settings = {ATTRIBUTES = (Project, ); }; }; F0DCCE9786B72C8EF925C5294A68A03A /* RSTCellContentDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = C7C523F13B0698E9E1E0C8BC56663CDD /* RSTCellContentDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F56FF4EABEF80FA5EC5D6AA4A348031C /* Pods-AltServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A3F93787631B5439B1EA07C44C1097A /* Pods-AltServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F56FF4EABEF80FA5EC5D6AA4A348031C /* Pods-AltServer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E6C49955A91A9BF96052D43477EE8A79 /* Pods-AltServer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F643A81BFE5A686AF434AB8EC619E68F /* UITableView+CellContent.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AE6D1449D7BFE1D6B397E971652F9B /* UITableView+CellContent.h */; settings = {ATTRIBUTES = (Project, ); }; }; F6570E449D7D7F7CC8D0F6A7471304DC /* RSTHasher.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FF4DFCBD550423E377A4B95FF98BFC4 /* RSTHasher.h */; settings = {ATTRIBUTES = (Project, ); }; }; F6DCF78E53424519321B9FA4BF334107 /* RSTHelperFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D056070FF1CAD623E04B056987D215E /* RSTHelperFile.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; @@ -432,6 +433,13 @@ remoteGlobalIDString = B5D1BA64AC676FF46408FCDE19A05767; remoteInfo = Roxas; }; + B1324C39ACC0CCA590E2F6C1CEE2A8A0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B5D1BA64AC676FF46408FCDE19A05767; + remoteInfo = Roxas; + }; C24230D37E930D006BF95D0AD49EEC82 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; @@ -446,6 +454,13 @@ remoteGlobalIDString = 062A64896E847A6749F58B6BA9A931B1; remoteInfo = Nuke; }; + EB92C48D1AC6614C7A547B50D0514BC5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 951A9DDCF9D2F851D1EC2B8CCD08ADFA; + remoteInfo = AltSign; + }; EFC1BC25A31E50DAEF6382D28E7E2F7B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; @@ -457,6 +472,7 @@ /* Begin PBXFileReference section */ 005E0CD4F4EEA460F60A980AB9F94EB4 /* KeychainAccess-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-prefix.pch"; sourceTree = ""; }; + 0100FAF2D9192354B5AD97C5ACA2892A /* Pods-AltServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.debug.xcconfig"; sourceTree = ""; }; 01EE98A5766917099B441607B08AEF3B /* RSTDynamicDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTDynamicDataSource.h; path = Roxas/RSTDynamicDataSource.h; sourceTree = ""; }; 026DC37EEB01428D873261F3CB427FE8 /* Roxas.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Roxas.modulemap; sourceTree = ""; }; 02B30122F755FA8B1BAE13CA00BA4D40 /* blowfish.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = blowfish.h; path = Dependencies/OpenSSL/ios/include/openssl/blowfish.h; sourceTree = ""; }; @@ -469,6 +485,7 @@ 059702EBFD928AE0189CA3F830C3616E /* ALTCertificateRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ALTCertificateRequest.m; sourceTree = ""; }; 0609BCE55DD9CFA3B184D68CE9D8D29B /* UISpringTimingParameters+Conveniences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISpringTimingParameters+Conveniences.m"; path = "Roxas/UISpringTimingParameters+Conveniences.m"; sourceTree = ""; }; 0751F7694817D0E796E34BDA38D20A3B /* ccmd5.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmd5.h; path = Dependencies/corecrypto/ccmd5.h; sourceTree = ""; }; + 09CBBA5767A1426DCF3A11FFFCCD6C9A /* Pods-AltStore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStore-acknowledgements.markdown"; sourceTree = ""; }; 0A0CAD2F5EF0037CACB181692CCEFC6F /* RSTLaunchViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTLaunchViewController.m; path = Roxas/RSTLaunchViewController.m; sourceTree = ""; }; 0A42A9A1EEFA70A1653FD7A3CEA23219 /* cc_debug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc_debug.h; path = Dependencies/corecrypto/cc_debug.h; sourceTree = ""; }; 0AF287DBC0725AF33B14CD9BE967E93D /* ccsrp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccsrp.h; path = Dependencies/corecrypto/ccsrp.h; sourceTree = ""; }; @@ -476,14 +493,13 @@ 0D056070FF1CAD623E04B056987D215E /* RSTHelperFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTHelperFile.m; path = Roxas/RSTHelperFile.m; sourceTree = ""; }; 0D0916ED915FE3469729DB8CD31E623C /* UIAlertAction+Actions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertAction+Actions.h"; path = "Roxas/UIAlertAction+Actions.h"; sourceTree = ""; }; 0D659CD2AA9C92DF6E9B43DA90AF27AC /* ebcdic.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ebcdic.h; path = Dependencies/OpenSSL/ios/include/openssl/ebcdic.h; sourceTree = ""; }; - 0D7CC1D321A7EFF4B480E5BAC0685CFC /* Pods-AltStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStore.modulemap"; sourceTree = ""; }; 0E8386150C1F216DF0D0047940058BCF /* e_os2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = e_os2.h; path = Dependencies/OpenSSL/ios/include/openssl/e_os2.h; sourceTree = ""; }; 0FF4DFCBD550423E377A4B95FF98BFC4 /* RSTHasher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTHasher.h; path = Roxas/RSTHasher.h; sourceTree = ""; }; 107026048A6314BCB6551F23F23AEFD4 /* Boolean.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = Boolean.cpp; sourceTree = ""; }; 1096054AEB4A5C2B7057CD805622BD3E /* ccder_encode_eckey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccder_encode_eckey.h; path = Dependencies/corecrypto/ccder_encode_eckey.h; sourceTree = ""; }; 1104F3DB9BFE2FD485E07DFDCE51C324 /* STPrivilegedTask-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "STPrivilegedTask-dummy.m"; sourceTree = ""; }; 1169B08138008F968889C891FB8233CD /* ccrng_rsafips_test.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrng_rsafips_test.h; path = Dependencies/corecrypto/ccrng_rsafips_test.h; sourceTree = ""; }; - 1215053FA027E4CE849DAF4D00697FF1 /* Pods-AltServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.release.xcconfig"; sourceTree = ""; }; + 1192029049EFACF019572AE1D7C92004 /* Pods-AltStore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-acknowledgements.plist"; sourceTree = ""; }; 14CFEC626B7EA4CA5CD713FE6CC97FDC /* NSPredicate+Search.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSPredicate+Search.m"; path = "Roxas/NSPredicate+Search.m"; sourceTree = ""; }; 14EAE44A37B74218DAE2706E4BA6711D /* plist.c */ = {isa = PBXFileReference; includeInIndex = 1; path = plist.c; sourceTree = ""; }; 15401FF4A3F7C90F76DE04FB0BBF5A00 /* AppCenter.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppCenter.xcconfig; sourceTree = ""; }; @@ -510,7 +526,6 @@ 1DF21761F51793B1E79B815C42A7224C /* AltSign.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AltSign.xcconfig; sourceTree = ""; }; 1E0ADF893622CFC816C5CF2BD893648E /* time64.c */ = {isa = PBXFileReference; includeInIndex = 1; path = time64.c; sourceTree = ""; }; 1E4C74EB97AA653EB2B4ED3024626A52 /* bplist.c */ = {isa = PBXFileReference; includeInIndex = 1; path = bplist.c; sourceTree = ""; }; - 1FDDB64DD95C45BA9E30FFB7ECFB9C30 /* Pods-AltServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltServer.modulemap"; sourceTree = ""; }; 2119733D600F6F015CE868CFBBA5E2E1 /* cccmac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cccmac.h; path = Dependencies/corecrypto/cccmac.h; sourceTree = ""; }; 214A7740331D44B14BED994D0AD62890 /* RSTOperation_Subclasses.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperation_Subclasses.h; path = Roxas/RSTOperation_Subclasses.h; sourceTree = ""; }; 21622C57776B02F7072D150F0B8361ED /* SUAppcast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcast.h; path = Sparkle.framework/Versions/A/Headers/SUAppcast.h; sourceTree = ""; }; @@ -527,6 +542,7 @@ 289381B8EDD6B16F3DF7EFEE1612E74A /* pem2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = pem2.h; path = Dependencies/OpenSSL/ios/include/openssl/pem2.h; sourceTree = ""; }; 28CC4C54E2CCB470E999C3B9B45DDEB0 /* STPrivilegedTask.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = STPrivilegedTask.modulemap; sourceTree = ""; }; 29839951F935B229EC6919D9B7379D26 /* RSTCellContentPrefetchingDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentPrefetchingDataSource.h; path = Roxas/RSTCellContentPrefetchingDataSource.h; sourceTree = ""; }; + 29D47FB44A4B93E67977EA7DA41FDBFE /* Pods-AltDaemon-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltDaemon-resources.sh"; sourceTree = ""; }; 29DDEEEB045FDE52E9750BDC8D15D561 /* ccdrbg_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdrbg_impl.h; path = Dependencies/corecrypto/ccdrbg_impl.h; sourceTree = ""; }; 2A31A3F9BAB499BD3B13B3F6F7BFA8A1 /* Nuke.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nuke.modulemap; sourceTree = ""; }; 2AB59EF78CE48305009BCBE5CFD27596 /* Data.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = Data.cpp; sourceTree = ""; }; @@ -550,9 +566,9 @@ 38090EB442D3768A7A0B8A9E04F17CE8 /* ccrng_pbkdf2_prng.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrng_pbkdf2_prng.h; path = Dependencies/corecrypto/ccrng_pbkdf2_prng.h; sourceTree = ""; }; 3847A3DB493D2B9BD693D49F7F252F93 /* aes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = aes.h; path = Dependencies/OpenSSL/ios/include/openssl/aes.h; sourceTree = ""; }; 389771695B320767CE9FE0680E37A623 /* cczp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cczp.h; path = Dependencies/corecrypto/cczp.h; sourceTree = ""; }; + 38B25887E1C1D20811EEFC7E4F30E75E /* Pods-AltDaemon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltDaemon.release.xcconfig"; sourceTree = ""; }; 39C8B442E4F1D331FA20406BD841D05A /* ts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ts.h; path = Dependencies/OpenSSL/ios/include/openssl/ts.h; sourceTree = ""; }; 39F52AFBCFA9F816FF726CF258D87FB2 /* ui.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ui.h; path = Dependencies/OpenSSL/ios/include/openssl/ui.h; sourceTree = ""; }; - 3A44D4EBF7CD579B73B275F0F125F846 /* Pods-AltServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.debug.xcconfig"; sourceTree = ""; }; 3B785D124B1FE49B3A725737AE70E203 /* Roxas-Prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Roxas-Prefix.pch"; path = "Roxas/Roxas-Prefix.pch"; sourceTree = ""; }; 3BFD8D7E4F26C273FA16D730BBE09E13 /* SPUURLRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUURLRequest.h; path = Sparkle.framework/Versions/A/Headers/SPUURLRequest.h; sourceTree = ""; }; 3C6E6C40CF28ADEC88B15ECDF2F3E884 /* SPUDownloaderSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderSession.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderSession.h; sourceTree = ""; }; @@ -561,6 +577,7 @@ 3E050D4CE1C16A0C2923D75EE79FCD4E /* cc_runtime_config.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc_runtime_config.h; path = Dependencies/corecrypto/cc_runtime_config.h; sourceTree = ""; }; 407C9DAC0B6F7CB610C85D0263AE17B8 /* opensslconf-arm64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "opensslconf-arm64.h"; path = "Dependencies/OpenSSL/ios/include/openssl/opensslconf-arm64.h"; sourceTree = ""; }; 413693D82E21BB52B74898987363EA99 /* cast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cast.h; path = Dependencies/OpenSSL/ios/include/openssl/cast.h; sourceTree = ""; }; + 415A2399B6A802A272A86233D7C9DA25 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.release.xcconfig"; sourceTree = ""; }; 41CB48690B18FAE99417885EF7E6E767 /* cchmac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cchmac.h; path = Dependencies/corecrypto/cchmac.h; sourceTree = ""; }; 42D5F4993737B5DFAA5F5E6FB06C2BB8 /* ALTAppleAPISession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppleAPISession.h; sourceTree = ""; }; 4405793D5AF1EFD9D2BDA30AA0D2E514 /* libRoxas.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libRoxas.a; path = libRoxas.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -569,11 +586,12 @@ 4537E82F32214FD7818D7CD91F603D5B /* conf_api.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = conf_api.h; path = Dependencies/OpenSSL/ios/include/openssl/conf_api.h; sourceTree = ""; }; 46BDD3848FE0E636C85F4304CF3FB840 /* pem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = pem.h; path = Dependencies/OpenSSL/ios/include/openssl/pem.h; sourceTree = ""; }; 474C34D18454CBF5A04B49C2055FBBAB /* ssl2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ssl2.h; path = Dependencies/OpenSSL/ios/include/openssl/ssl2.h; sourceTree = ""; }; + 4773ABB518FBF6876DAC8F0AE260A54B /* Pods-AltDaemon-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltDaemon-acknowledgements.markdown"; sourceTree = ""; }; 47F936C4BE30E448468E5D325E02CD12 /* ALTSigner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTSigner.h; sourceTree = ""; }; 490F5F18CD5B71977FAEF4CD4BDCC5F9 /* ALTAppleAPI_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppleAPI_Private.h; sourceTree = ""; }; 4920980B5315FFD0E2EBB7F30EF2BFC5 /* RSTCellContentDataSource_Subclasses.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentDataSource_Subclasses.h; path = Roxas/RSTCellContentDataSource_Subclasses.h; sourceTree = ""; }; 493A0B3CB13D03370FC0105ACD627968 /* whrlpool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = whrlpool.h; path = Dependencies/OpenSSL/ios/include/openssl/whrlpool.h; sourceTree = ""; }; - 4A3F93787631B5439B1EA07C44C1097A /* Pods-AltServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltServer-umbrella.h"; sourceTree = ""; }; + 49B0F76928525434803E52E609201454 /* libPods-AltDaemon.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-AltDaemon.a"; path = "libPods-AltDaemon.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4AFC2A8BFD44BF4705CDB538A5A700C9 /* UIViewController+TransitionState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+TransitionState.m"; path = "Roxas/UIViewController+TransitionState.m"; sourceTree = ""; }; 4BFFC3AD9DB5992D2F577A558958972F /* SPUDownloaderDeprecated.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderDeprecated.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderDeprecated.h; sourceTree = ""; }; 4C4EB1FF702E3A1ACF22B0FD9AEFDFAE /* md4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = md4.h; path = Dependencies/OpenSSL/ios/include/openssl/md4.h; sourceTree = ""; }; @@ -591,12 +609,14 @@ 520E4EFA88F054B4BFBE69E7598ED29D /* RSTCollectionViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCollectionViewCell.h; path = Roxas/RSTCollectionViewCell.h; sourceTree = ""; }; 52758575FDE408FC483B772F1A509906 /* ccripemd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccripemd.h; path = Dependencies/corecrypto/ccripemd.h; sourceTree = ""; }; 5317E660654C64DB949B1E59A273A07C /* alt_ldid.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = alt_ldid.cpp; sourceTree = ""; }; + 546B88CFC6EBED3C7F26035C1D82B8B7 /* Pods-AltDaemon-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltDaemon-dummy.m"; sourceTree = ""; }; 5496E932BB2B72CA3794430120AD503D /* obj_mac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = obj_mac.h; path = Dependencies/OpenSSL/ios/include/openssl/obj_mac.h; sourceTree = ""; }; 557113703F2557617D59ADA3DB5FD9E8 /* mdc2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mdc2.h; path = Dependencies/OpenSSL/ios/include/openssl/mdc2.h; sourceTree = ""; }; 568687E6B6B277681DE9A457F089DF57 /* RSTBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTBlockOperation.h; path = Roxas/RSTBlockOperation.h; sourceTree = ""; }; 568A2EC5A1E112757032C27664AC2E1C /* ccpbkdf2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccpbkdf2.h; path = Dependencies/corecrypto/ccpbkdf2.h; sourceTree = ""; }; 577F20AC9D1D37C21171DE3BC57EB4B8 /* RSTCellContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentView.h; path = Roxas/RSTCellContentView.h; sourceTree = ""; }; 58093B01C1E44E948FEDBDB15079C7C6 /* alt_ldid.hpp */ = {isa = PBXFileReference; includeInIndex = 1; path = alt_ldid.hpp; sourceTree = ""; }; + 5835BCCA38BE408715F2124CE34EE05A /* Pods-AltServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltServer.modulemap"; sourceTree = ""; }; 5894D9DE89EF3AD8F90F2B9359464119 /* cctest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cctest.h; path = Dependencies/corecrypto/cctest.h; sourceTree = ""; }; 58BC72BB52DEC3634030DEDACD3B932E /* RSTCellContentChangeOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentChangeOperation.h; path = Roxas/RSTCellContentChangeOperation.h; sourceTree = ""; }; 5997619C66BBB2F2D0E31C562EA522F9 /* hmac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = hmac.h; path = Dependencies/OpenSSL/ios/include/openssl/hmac.h; sourceTree = ""; }; @@ -611,11 +631,11 @@ 5E6C305E38932B0284A040A773DFF879 /* RSTCollectionViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCollectionViewCell.m; path = Roxas/RSTCollectionViewCell.m; sourceTree = ""; }; 5F0027637207387F612B8391E5111E9D /* STPrivilegedTask-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-prefix.pch"; sourceTree = ""; }; 60987BC87BDAE2562C44DF9109931565 /* RSTCellContentChange.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentChange.m; path = Roxas/RSTCellContentChange.m; sourceTree = ""; }; + 60B0985C122B155F5C155FCB90F30B94 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.debug.xcconfig"; sourceTree = ""; }; 61472883BDD4214BDDEEA2288061A605 /* RSTSearchController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTSearchController.m; path = Roxas/RSTSearchController.m; sourceTree = ""; }; 61501C1661FD2F24B7E32026E45D5AA1 /* x509_vfy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = x509_vfy.h; path = Dependencies/OpenSSL/ios/include/openssl/x509_vfy.h; sourceTree = ""; }; 61A98FE2E2A5A1751790C7E5E36372B5 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = ""; }; 61C5B1B207DD52BC5ACAB62A5A6DEF64 /* tls1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = tls1.h; path = Dependencies/OpenSSL/ios/include/openssl/tls1.h; sourceTree = ""; }; - 61DDF5B83CA12D93D7CBD4F0B3242860 /* Pods-AltStore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStore-acknowledgements.markdown"; sourceTree = ""; }; 631B9239A14B8849600FF2BE44308CD2 /* UITableView+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+CellContent.m"; path = "Roxas/UITableView+CellContent.m"; sourceTree = ""; }; 63413445A679C0467BDE3CAE89B94D34 /* STPrivilegedTask.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = STPrivilegedTask.xcconfig; sourceTree = ""; }; 65625EB922D2287FB6B5065FA82D7CA8 /* RSTPlaceholderView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RSTPlaceholderView.xib; path = Roxas/RSTPlaceholderView.xib; sourceTree = ""; }; @@ -626,11 +646,9 @@ 6701293BB9F23B8CF472B900EFFCDE04 /* NSError+ALTErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSError+ALTErrors.m"; sourceTree = ""; }; 676644EB1805E96CE47F7882733262B3 /* libPods-AltStore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-AltStore.a"; path = "libPods-AltStore.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 67DF21072AF32876EAA108A94774E489 /* bn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bn.h; path = Dependencies/OpenSSL/ios/include/openssl/bn.h; sourceTree = ""; }; - 67F9C672B6F11F0BC41900AED4C10DE0 /* Pods-AltServer-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltServer-acknowledgements.markdown"; sourceTree = ""; }; 6858F0A591CF832F5B248EE55B17F5A0 /* RSTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTError.m; path = Roxas/RSTError.m; sourceTree = ""; }; 68D8D3A708227C0506574E6358D79A3D /* ALTAppGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppGroup.h; sourceTree = ""; }; 694E6932887B1C0D0912130564BB474B /* asn1t.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = asn1t.h; path = Dependencies/OpenSSL/ios/include/openssl/asn1t.h; sourceTree = ""; }; - 695286014335265E05C28AD7B887F02F /* Pods-AltStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStore-umbrella.h"; sourceTree = ""; }; 69BC2DC6AC50B0C61B4F7E90078ECBCB /* cc_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc_priv.h; path = Dependencies/corecrypto/cc_priv.h; sourceTree = ""; }; 69BCF448A4351DCC0562F34132ABDD71 /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h; sourceTree = ""; }; 69ECB6396AFAB0A666321652A0E61F09 /* RSTOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperation.h; path = Roxas/RSTOperation.h; sourceTree = ""; }; @@ -642,6 +660,7 @@ 6E2FE91417F00A47CBBD4CAFC7944947 /* UICollectionViewCell+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewCell+CellContent.h"; path = "Roxas/UICollectionViewCell+CellContent.h"; sourceTree = ""; }; 6E64CA484C441CC0643B335135212607 /* RSTNibView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTNibView.h; path = Roxas/RSTNibView.h; sourceTree = ""; }; 6E917D3B3ADB864E9C69574812B5733D /* UIView+AnimatedHide.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+AnimatedHide.m"; path = "Roxas/UIView+AnimatedHide.m"; sourceTree = ""; }; + 702E803654797D70C915837AF7D76C6B /* Pods-AltServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-Info.plist"; sourceTree = ""; }; 705EFF4E047D0012135E9FC6B039DAAE /* UICollectionViewCell+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewCell+CellContent.m"; path = "Roxas/UICollectionViewCell+CellContent.m"; sourceTree = ""; }; 709FED73AB0971FF10898C166D5C34DD /* pkcs12.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = pkcs12.h; path = Dependencies/OpenSSL/ios/include/openssl/pkcs12.h; sourceTree = ""; }; 71121C9D9F2640ECC1FAA0F3FCDA607F /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUStandardVersionComparator.h; path = Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h; sourceTree = ""; }; @@ -656,8 +675,10 @@ 7861F7E486DBFDA791F172183A52B4CF /* ccecies.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccecies.h; path = Dependencies/corecrypto/ccecies.h; sourceTree = ""; }; 7870A8AD5E4B6B18B10B9DD5A40084E5 /* UICollectionViewCell+Nibs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewCell+Nibs.m"; path = "Roxas/UICollectionViewCell+Nibs.m"; sourceTree = ""; }; 79926042DA0FE3AC31BE54B760B6F908 /* Key.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Key.h; sourceTree = ""; }; + 79DC23F753EEAEA1F99B4F772AC87CEB /* Pods-AltDaemon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltDaemon.debug.xcconfig"; sourceTree = ""; }; 7AC3A57327833C46EF9AEA88A5664D69 /* ALTModel+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ALTModel+Internal.h"; sourceTree = ""; }; 7AC49781BB0CCCCFBFFF6EEFB0867FEF /* ccmd2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmd2.h; path = Dependencies/corecrypto/ccmd2.h; sourceTree = ""; }; + 7B51BFE6F7A28BF6D5614373C24DB981 /* Pods-AltStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStore-umbrella.h"; sourceTree = ""; }; 7B937B69AB1B177FA5B33FAC4EF2B1F9 /* ALTAppID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppID.h; sourceTree = ""; }; 7B93E8672E3990ED78D813FADC50EECF /* ssl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ssl.h; path = Dependencies/OpenSSL/ios/include/openssl/ssl.h; sourceTree = ""; }; 7C02717986AF7E99DD42B70931BDE20A /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; @@ -675,8 +696,9 @@ 81B1303346FA0756C50186333EFB1F84 /* AppCenterCrashes.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppCenterCrashes.framework; path = "AppCenter-SDK-Apple/iOS/AppCenterCrashes.framework"; sourceTree = ""; }; 81FEA74DB1902FB97CE333C1CEDB224A /* ccrng_system.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrng_system.h; path = Dependencies/corecrypto/ccrng_system.h; sourceTree = ""; }; 82341B13B5AF5BB883018AF6C0C29A35 /* Uid.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Uid.h; sourceTree = ""; }; - 827E121948344EAD1A1BAD926CD89E2C /* Pods-AltServer-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-acknowledgements.plist"; sourceTree = ""; }; + 82392F6B02D2A2D62197B66C2056B9B9 /* Pods-AltStore-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltStore-resources.sh"; sourceTree = ""; }; 82BCE1984F56DA8A1D3B838D10199799 /* NSUserDefaults+DynamicProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSUserDefaults+DynamicProperties.h"; path = "Roxas/NSUserDefaults+DynamicProperties.h"; sourceTree = ""; }; + 83727454E3DD81F758E0BDADE642B5C9 /* Pods-AltDaemon-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltDaemon-acknowledgements.plist"; sourceTree = ""; }; 83BB07F284FD8A5C58CFAFC534D68D48 /* ALTAnisetteData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ALTAnisetteData.m; sourceTree = ""; }; 863044A19021CE9383C742A072B8641C /* UICollectionView+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionView+CellContent.h"; path = "Roxas/UICollectionView+CellContent.h"; sourceTree = ""; }; 86BC9D65F62DE91B357F9221B01D3DD9 /* KeychainAccess.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KeychainAccess.modulemap; sourceTree = ""; }; @@ -699,14 +721,12 @@ 8C8CB396F5F3F3E83C4FCE36B8954F1B /* zip.c */ = {isa = PBXFileReference; includeInIndex = 1; name = zip.c; path = Dependencies/minizip/zip.c; sourceTree = ""; }; 8D56DC21CF454680EB780E780B5BC4A3 /* RSTRelationshipPreservingMergePolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTRelationshipPreservingMergePolicy.h; path = Roxas/RSTRelationshipPreservingMergePolicy.h; sourceTree = ""; }; 8DC59D60A54C55B6E1685B2CAB5D5A35 /* SUVersionDisplayProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionDisplayProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h; sourceTree = ""; }; - 8E59788A401232096F8BFE2CF38011B3 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.release.xcconfig"; sourceTree = ""; }; 8E59C3A64EF23452AA58698B0F5F2A39 /* RSTToastView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTToastView.h; path = Roxas/RSTToastView.h; sourceTree = ""; }; 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods_AltServer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_AltServer.framework; path = "Pods-AltServer.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 8F5832C9D79544C20373B7A1438E6671 /* AltSign.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AltSign.h; path = AltSign/AltSign.h; sourceTree = ""; }; 8F5E1856E53AF0DB69BD508F9A6D3D10 /* opensslconf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = opensslconf.h; path = Dependencies/OpenSSL/ios/include/openssl/opensslconf.h; sourceTree = ""; }; 903DA55629D1B8B8172C106D1027247B /* ccec25519_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccec25519_priv.h; path = Dependencies/corecrypto/ccec25519_priv.h; sourceTree = ""; }; 911AB656234F15A99CA82B25BA46A6DF /* cc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc.h; path = Dependencies/corecrypto/cc.h; sourceTree = ""; }; - 91203FEFD09BD6533A223ACCB6D53735 /* Pods-AltServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-Info.plist"; sourceTree = ""; }; 91372A6AD9FBF98E332A9431BA39D4D1 /* RSTNibView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTNibView.m; path = Roxas/RSTNibView.m; sourceTree = ""; }; 92199C8E1E8E1DFC2347DB246CA7F1DA /* ImagePreheater.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePreheater.swift; path = Sources/ImagePreheater.swift; sourceTree = ""; }; 92B239E2FA94463894D8553410190216 /* plist.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = plist.h; sourceTree = ""; }; @@ -728,6 +748,7 @@ 99A34B91E3966B3C42216C9E4A2D4CFF /* ecdsa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ecdsa.h; path = Dependencies/OpenSSL/ios/include/openssl/ecdsa.h; sourceTree = ""; }; 99C7B66B038F2B0D0975A387F4E73F29 /* ccchacha20poly1305.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccchacha20poly1305.h; path = Dependencies/corecrypto/ccchacha20poly1305.h; sourceTree = ""; }; 9A43A3EB159CA9C66ED383CAB0E128A6 /* ossl_typ.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ossl_typ.h; path = Dependencies/OpenSSL/ios/include/openssl/ossl_typ.h; sourceTree = ""; }; + 9A5F712C8D5959F1E477A2D285AB9A07 /* Pods-AltServer-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltServer-acknowledgements.markdown"; sourceTree = ""; }; 9A69C6F20E3BBAE1C8C90A58CBA3DB0C /* ALTAccount.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAccount.h; sourceTree = ""; }; 9A8A48D68CE5B5EF610D60AE61C9F584 /* unzip.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = unzip.h; path = Dependencies/minizip/unzip.h; sourceTree = ""; }; 9ACE8C95ED09F41B08C4DF0B178B37EA /* objects.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = objects.h; path = Dependencies/OpenSSL/ios/include/openssl/objects.h; sourceTree = ""; }; @@ -753,8 +774,8 @@ A65888B0E090B10E6170D43D8E1C0F6F /* STPrivilegedTask-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "STPrivilegedTask-Info.plist"; sourceTree = ""; }; A6C7A3F8405342E0CFCF2C6C5F9B0A3D /* dh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = dh.h; path = Dependencies/OpenSSL/ios/include/openssl/dh.h; sourceTree = ""; }; A6CB7BCDAD00CC9657632FA0DF9599EC /* ccdh_gp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdh_gp.h; path = Dependencies/corecrypto/ccdh_gp.h; sourceTree = ""; }; + A79744C0D952ADD34EC8CCD2D1501838 /* Pods-AltServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.release.xcconfig"; sourceTree = ""; }; A8093B399024794431159E69E5C18C92 /* ccmode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmode.h; path = Dependencies/corecrypto/ccmode.h; sourceTree = ""; }; - A82A21359DA7189002E88491D87FB6BE /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.debug.xcconfig"; sourceTree = ""; }; A8918968EFD5B0DD448B57256A730D5A /* RSTCellContentChange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentChange.h; path = Roxas/RSTCellContentChange.h; sourceTree = ""; }; AA460D4136BE705CF537D99DB76207FF /* ALTAnisetteData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAnisetteData.h; sourceTree = ""; }; AA7D8EE75A3FE7F4EB2ECBCABDA9330D /* ccchacha20poly1305_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccchacha20poly1305_priv.h; path = Dependencies/corecrypto/ccchacha20poly1305_priv.h; sourceTree = ""; }; @@ -782,11 +803,11 @@ B831FF60290BCF3108FDBC1BD6525103 /* Dictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Dictionary.h; sourceTree = ""; }; B87FE5286C1FD482F82C01FCB38DB158 /* ccrc4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrc4.h; path = Dependencies/corecrypto/ccrc4.h; sourceTree = ""; }; B88B0C4661B00E43F453B1A81826157A /* STPrivilegedTask-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-umbrella.h"; sourceTree = ""; }; + B8B4E51528ACF4ED0E62FD2946936A77 /* Pods-AltServer-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltServer-frameworks.sh"; sourceTree = ""; }; B9B1CEF2EED0B01E64AB78B582825997 /* ALTApplication.mm */ = {isa = PBXFileReference; includeInIndex = 1; path = ALTApplication.mm; sourceTree = ""; }; B9C77F574EE4D8FCC56A32497585256D /* ccdh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdh.h; path = Dependencies/corecrypto/ccdh.h; sourceTree = ""; }; BAF50E693DDCD83078B5CA7F1DA5D5B8 /* ALTAppleAPISession.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ALTAppleAPISession.m; sourceTree = ""; }; BB3E62EAAE23B1F6A4465CC181048F4E /* ALTApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTApplication.h; sourceTree = ""; }; - BC6F74406EF976ECC3669BD38B0ECED4 /* Pods-AltServer-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltServer-frameworks.sh"; sourceTree = ""; }; BD03248F0F2BB2C459A7CC45CDF38647 /* RSTHasher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTHasher.m; path = Roxas/RSTHasher.m; sourceTree = ""; }; BE3254B479A7B3EC6F741494E430EA42 /* ioapi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ioapi.h; path = Dependencies/minizip/ioapi.h; sourceTree = ""; }; BE86423754DE6F326E05DA81C8610E5B /* ccrsa_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrsa_priv.h; path = Dependencies/corecrypto/ccrsa_priv.h; sourceTree = ""; }; @@ -794,7 +815,6 @@ BEFC63944685F87ABCA6731E33ECA843 /* RSTSeparatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTSeparatorView.h; path = Roxas/RSTSeparatorView.h; sourceTree = ""; }; BF327FF6D10BE735B3541D8135486FAC /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = ""; }; BFC87DA394F783CD7D6834276283DE6F /* ImageRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageRequest.swift; path = Sources/ImageRequest.swift; sourceTree = ""; }; - C0D26B225AB108A39AD161E5C626DFCA /* Pods-AltStore-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltStore-resources.sh"; sourceTree = ""; }; C1E18A24C4A563BC4DDCA5EF6254C778 /* mztools.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mztools.h; path = Dependencies/minizip/mztools.h; sourceTree = ""; }; C1EBD0BA39E3F8B25F16880B710E2C5B /* opensslconf-armv7s.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "opensslconf-armv7s.h"; path = "Dependencies/OpenSSL/ios/include/openssl/opensslconf-armv7s.h"; sourceTree = ""; }; C208E8E78D20910EAC3E2EF269C195EC /* SUAppcastItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcastItem.h; path = Sparkle.framework/Versions/A/Headers/SUAppcastItem.h; sourceTree = ""; }; @@ -804,11 +824,13 @@ C4F3A4BFDFD12AB4EB01F4BCA312A94D /* crypt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = crypt.h; path = Dependencies/minizip/crypt.h; sourceTree = ""; }; C50FB407DB2A72F5D827B19042A714F8 /* rc4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = rc4.h; path = Dependencies/OpenSSL/ios/include/openssl/rc4.h; sourceTree = ""; }; C556A67CD97EE39683D31C0B9F0918EB /* ccn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccn.h; path = Dependencies/corecrypto/ccn.h; sourceTree = ""; }; + C63B22556372BD6A596092190AC874E3 /* Pods-AltServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltServer-dummy.m"; sourceTree = ""; }; C65850A307D6D5D8B9CBB2C7795093CC /* ccdrbg_factory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdrbg_factory.h; path = Dependencies/corecrypto/ccdrbg_factory.h; sourceTree = ""; }; C72FC0FB6B8986A4FB1980229B73DDEE /* mztools.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mztools.c; path = Dependencies/minizip/mztools.c; sourceTree = ""; }; C7C523F13B0698E9E1E0C8BC56663CDD /* RSTCellContentDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentDataSource.m; path = Roxas/RSTCellContentDataSource.m; sourceTree = ""; }; C8158E0DE7EA9639894587255DB9F03C /* fipspost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fipspost.h; path = Dependencies/corecrypto/fipspost.h; sourceTree = ""; }; C906AF9E4AF1DA84489A450180EE84AE /* node.c */ = {isa = PBXFileReference; includeInIndex = 1; path = node.c; sourceTree = ""; }; + C9132C40CB4837DADEB046E727F867FB /* Pods-AltStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStore-dummy.m"; sourceTree = ""; }; CA894C38E3874FEC9FCD1A4BC67184F7 /* RSTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTError.h; path = Roxas/RSTError.h; sourceTree = ""; }; CB4FFC20503BA7993FDFB654063591EC /* cchkdf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cchkdf.h; path = Dependencies/corecrypto/cchkdf.h; sourceTree = ""; }; CB732A4A4314642DEF76FAB814B59DF8 /* SUUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUUpdater.h; path = Sparkle.framework/Versions/A/Headers/SUUpdater.h; sourceTree = ""; }; @@ -846,18 +868,17 @@ E57351A0D30872C6AADDD2E5294EF95A /* ocsp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ocsp.h; path = Dependencies/OpenSSL/ios/include/openssl/ocsp.h; sourceTree = ""; }; E58E9ACAA603F0479C9159E248BDD542 /* bio.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bio.h; path = Dependencies/OpenSSL/ios/include/openssl/bio.h; sourceTree = ""; }; E6064D2203D88A9ACE189177C3722660 /* NSPredicate+Search.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSPredicate+Search.h"; path = "Roxas/NSPredicate+Search.h"; sourceTree = ""; }; + E6C49955A91A9BF96052D43477EE8A79 /* Pods-AltServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltServer-umbrella.h"; sourceTree = ""; }; E7223D60AEAF953DAF7871518753EBB9 /* RSTPersistentContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTPersistentContainer.m; path = Roxas/RSTPersistentContainer.m; sourceTree = ""; }; E7709D93E2CB7C73F6D5FA5E3032EAC6 /* AltSign.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = AltSign.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; E77CC6E8557F17BBC9A36A2847A51100 /* RSTArrayDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTArrayDataSource.h; path = Roxas/RSTArrayDataSource.h; sourceTree = ""; }; E8196FCC04FA21317C838435B5F4FCA1 /* RSTTintedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTTintedImageView.h; path = Roxas/RSTTintedImageView.h; sourceTree = ""; }; - E8434827ABB58D1C0275F5BDE3717F16 /* Pods-AltServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltServer-dummy.m"; sourceTree = ""; }; E8EE7F078656FABB8F6821D10FF994BB /* libKeychainAccess.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libKeychainAccess.a; path = libKeychainAccess.a; sourceTree = BUILT_PRODUCTS_DIR; }; E92A1B8716EB4DF6BF0A824E1662069E /* ccmode_siv_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmode_siv_priv.h; path = Dependencies/corecrypto/ccmode_siv_priv.h; sourceTree = ""; }; E9AB7E00EF57815340C28751AFAD3798 /* ptrarray.c */ = {isa = PBXFileReference; includeInIndex = 1; path = ptrarray.c; sourceTree = ""; }; EA706258C6F1B1F2B19EF8197E8F4349 /* unzip.c */ = {isa = PBXFileReference; includeInIndex = 1; name = unzip.c; path = Dependencies/minizip/unzip.c; sourceTree = ""; }; EB20FCA19FFC2313BFF8BBE3AA934288 /* RSTSearchController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTSearchController.h; path = Roxas/RSTSearchController.h; sourceTree = ""; }; EB343A74480E905489EFD2CBA6F6339E /* ImagePipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePipeline.swift; path = Sources/ImagePipeline.swift; sourceTree = ""; }; - EC9F77AC7ECBA94225DE401B6A8004F2 /* Pods-AltStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStore-dummy.m"; sourceTree = ""; }; ECB70FB9A0943AD3C24308D934E452AC /* ImageTaskMetrics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTaskMetrics.swift; path = Sources/ImageTaskMetrics.swift; sourceTree = ""; }; ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = STPrivilegedTask.framework; path = STPrivilegedTask.framework; sourceTree = BUILT_PRODUCTS_DIR; }; ED35088C8A16722DEF3F72976FF9CEA4 /* ccec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccec.h; path = Dependencies/corecrypto/ccec.h; sourceTree = ""; }; @@ -869,6 +890,7 @@ F255B45E106FBFFFBF10D506992EC655 /* RSTDynamicDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTDynamicDataSource.m; path = Roxas/RSTDynamicDataSource.m; sourceTree = ""; }; F2CF961D1535400D1D9228FD823EE7D9 /* Real.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Real.h; sourceTree = ""; }; F35FA9FBDE25A463886F53B66B39A748 /* NSError+ALTErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSError+ALTErrors.h"; sourceTree = ""; }; + F36150F4B2D5DD35C5AE24D34254DD5B /* Pods-AltServer-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-acknowledgements.plist"; sourceTree = ""; }; F3A77F6E48BAFA480142E4AA3CD6A301 /* UITableViewCell+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+CellContent.m"; path = "Roxas/UITableViewCell+CellContent.m"; sourceTree = ""; }; F41304FE31EBAE0769092641DA09FD04 /* ccz_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccz_priv.h; path = Dependencies/corecrypto/ccz_priv.h; sourceTree = ""; }; F456D30A7BC124649CB25DFC1B8C8D83 /* Sparkle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Sparkle.h; path = Sparkle.framework/Versions/A/Headers/Sparkle.h; sourceTree = ""; }; @@ -885,13 +907,13 @@ F9E154EE6519BD64EF44E725EC3AFB89 /* UIImage+Manipulation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Manipulation.m"; path = "Roxas/UIImage+Manipulation.m"; sourceTree = ""; }; FA30F634D3EEACD6C9E258E0551D357A /* STPrivilegedTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = STPrivilegedTask.h; sourceTree = ""; }; FA31890BE5D6782EE2C66D17C3FA5F73 /* RSTOperationQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTOperationQueue.m; path = Roxas/RSTOperationQueue.m; sourceTree = ""; }; - FAED4B69775DE96F8861BCA8BF35E38B /* Pods-AltStore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-acknowledgements.plist"; sourceTree = ""; }; FAFA796C2028D51219FED104E02BBA2E /* ldid.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = ldid.cpp; sourceTree = ""; }; FB0B4256965EEBCC93E6D0A895696520 /* ccdigest_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdigest_priv.h; path = Dependencies/corecrypto/ccdigest_priv.h; sourceTree = ""; }; FB6237E2F93A403AB9147341A339398E /* asn1_mac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = asn1_mac.h; path = Dependencies/OpenSSL/ios/include/openssl/asn1_mac.h; sourceTree = ""; }; FC422EC5FAE52EEE9570A6C6CD463B9C /* UICollectionViewCell+Nibs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewCell+Nibs.h"; path = "Roxas/UICollectionViewCell+Nibs.h"; sourceTree = ""; }; FC9139A28E7A28DDB6875A26A978DCBB /* UIKit+ActivityIndicating.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIKit+ActivityIndicating.m"; path = "Roxas/UIKit+ActivityIndicating.m"; sourceTree = ""; }; FCEACD7381B4CD496C8776BA4B4DDECD /* cccast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cccast.h; path = Dependencies/corecrypto/cccast.h; sourceTree = ""; }; + FD54352444A7AFFFB59DA62203AF58BE /* Pods-AltStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStore.modulemap"; sourceTree = ""; }; FDBED95D85CFE5DE2E1A73C8BDE40AF8 /* node_list.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = node_list.h; sourceTree = ""; }; FE3B0942ABD1EF218327EAFDB5930E8F /* ccz.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccz.h; path = Dependencies/corecrypto/ccz.h; sourceTree = ""; }; FF6A87F5B921A4731A72BAA58BC686B5 /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = ""; }; @@ -928,6 +950,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C60D4971328D3B30E809D85DF9AC9C1C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; DF55D5C41519A5A52DAE534296270AF5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -1025,6 +1054,20 @@ path = Sparkle; sourceTree = ""; }; + 21B07EE04CFA7F279AE8450F26AA35AD /* Pods-AltDaemon */ = { + isa = PBXGroup; + children = ( + 4773ABB518FBF6876DAC8F0AE260A54B /* Pods-AltDaemon-acknowledgements.markdown */, + 83727454E3DD81F758E0BDADE642B5C9 /* Pods-AltDaemon-acknowledgements.plist */, + 546B88CFC6EBED3C7F26035C1D82B8B7 /* Pods-AltDaemon-dummy.m */, + 29D47FB44A4B93E67977EA7DA41FDBFE /* Pods-AltDaemon-resources.sh */, + 79DC23F753EEAEA1F99B4F772AC87CEB /* Pods-AltDaemon.debug.xcconfig */, + 38B25887E1C1D20811EEFC7E4F30E75E /* Pods-AltDaemon.release.xcconfig */, + ); + name = "Pods-AltDaemon"; + path = "Target Support Files/Pods-AltDaemon"; + sourceTree = ""; + }; 27C9B3764A8EC89602B2168BCD3B0541 /* Nuke */ = { isa = PBXGroup; children = ( @@ -1056,22 +1099,6 @@ path = AltSign/Model; sourceTree = ""; }; - 29BB281BA7D464B1749908A7D7B87093 /* Pods-AltStore */ = { - isa = PBXGroup; - children = ( - 0D7CC1D321A7EFF4B480E5BAC0685CFC /* Pods-AltStore.modulemap */, - 61DDF5B83CA12D93D7CBD4F0B3242860 /* Pods-AltStore-acknowledgements.markdown */, - FAED4B69775DE96F8861BCA8BF35E38B /* Pods-AltStore-acknowledgements.plist */, - EC9F77AC7ECBA94225DE401B6A8004F2 /* Pods-AltStore-dummy.m */, - C0D26B225AB108A39AD161E5C626DFCA /* Pods-AltStore-resources.sh */, - 695286014335265E05C28AD7B887F02F /* Pods-AltStore-umbrella.h */, - A82A21359DA7189002E88491D87FB6BE /* Pods-AltStore.debug.xcconfig */, - 8E59788A401232096F8BFE2CF38011B3 /* Pods-AltStore.release.xcconfig */, - ); - name = "Pods-AltStore"; - path = "Target Support Files/Pods-AltStore"; - sourceTree = ""; - }; 2ADBE40AD4FBCECB7EC3654624D470B5 /* src */ = { isa = PBXGroup; children = ( @@ -1100,6 +1127,31 @@ path = Dependencies/ldid/libplist/src; sourceTree = ""; }; + 2C6DD3243036D912CFF08FC91260A033 /* Products */ = { + isa = PBXGroup; + children = ( + 97376E80213BC9E42F08C1C3E739327F /* libAltSign.a */, + E8EE7F078656FABB8F6821D10FF994BB /* libKeychainAccess.a */, + 2DAD7D76FC007F48AE48F2FD15BF01BB /* libNuke.a */, + 49B0F76928525434803E52E609201454 /* libPods-AltDaemon.a */, + 676644EB1805E96CE47F7882733262B3 /* libPods-AltStore.a */, + 4405793D5AF1EFD9D2BDA30AA0D2E514 /* libRoxas.a */, + 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods_AltServer.framework */, + ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask.framework */, + ); + name = Products; + sourceTree = ""; + }; + 30C5E295E48CEDE7497C55DE64DBC687 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 21B07EE04CFA7F279AE8450F26AA35AD /* Pods-AltDaemon */, + 7F5AD92236E83BA3EB39205EBAB8A9B8 /* Pods-AltServer */, + 843530E93DA12B817029E9018B03DD06 /* Pods-AltStore */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; 3598F2B00D4321009D713747EEC1E46B /* Capabilities */ = { isa = PBXGroup; children = ( @@ -1178,20 +1230,6 @@ path = "../Target Support Files/Sparkle"; sourceTree = ""; }; - 4E801E465E7C325D42C6ADBADF282456 /* Products */ = { - isa = PBXGroup; - children = ( - 97376E80213BC9E42F08C1C3E739327F /* libAltSign.a */, - E8EE7F078656FABB8F6821D10FF994BB /* libKeychainAccess.a */, - 2DAD7D76FC007F48AE48F2FD15BF01BB /* libNuke.a */, - 676644EB1805E96CE47F7882733262B3 /* libPods-AltStore.a */, - 4405793D5AF1EFD9D2BDA30AA0D2E514 /* libRoxas.a */, - 8EBF5043034AFB3A6A8F28C373BF0EC0 /* Pods_AltServer.framework */, - ECB81C33948E641ABE3B268D296018CC /* STPrivilegedTask.framework */, - ); - name = Products; - sourceTree = ""; - }; 509C180E6A90B89D30B2070FD2CB5026 /* include */ = { isa = PBXGroup; children = ( @@ -1407,6 +1445,39 @@ path = AltSign/Categories; sourceTree = ""; }; + 7F5AD92236E83BA3EB39205EBAB8A9B8 /* Pods-AltServer */ = { + isa = PBXGroup; + children = ( + 5835BCCA38BE408715F2124CE34EE05A /* Pods-AltServer.modulemap */, + 9A5F712C8D5959F1E477A2D285AB9A07 /* Pods-AltServer-acknowledgements.markdown */, + F36150F4B2D5DD35C5AE24D34254DD5B /* Pods-AltServer-acknowledgements.plist */, + C63B22556372BD6A596092190AC874E3 /* Pods-AltServer-dummy.m */, + B8B4E51528ACF4ED0E62FD2946936A77 /* Pods-AltServer-frameworks.sh */, + 702E803654797D70C915837AF7D76C6B /* Pods-AltServer-Info.plist */, + E6C49955A91A9BF96052D43477EE8A79 /* Pods-AltServer-umbrella.h */, + 0100FAF2D9192354B5AD97C5ACA2892A /* Pods-AltServer.debug.xcconfig */, + A79744C0D952ADD34EC8CCD2D1501838 /* Pods-AltServer.release.xcconfig */, + ); + name = "Pods-AltServer"; + path = "Target Support Files/Pods-AltServer"; + sourceTree = ""; + }; + 843530E93DA12B817029E9018B03DD06 /* Pods-AltStore */ = { + isa = PBXGroup; + children = ( + FD54352444A7AFFFB59DA62203AF58BE /* Pods-AltStore.modulemap */, + 09CBBA5767A1426DCF3A11FFFCCD6C9A /* Pods-AltStore-acknowledgements.markdown */, + 1192029049EFACF019572AE1D7C92004 /* Pods-AltStore-acknowledgements.plist */, + C9132C40CB4837DADEB046E727F867FB /* Pods-AltStore-dummy.m */, + 82392F6B02D2A2D62197B66C2056B9B9 /* Pods-AltStore-resources.sh */, + 7B51BFE6F7A28BF6D5614373C24DB981 /* Pods-AltStore-umbrella.h */, + 60B0985C122B155F5C155FCB90F30B94 /* Pods-AltStore.debug.xcconfig */, + 415A2399B6A802A272A86233D7C9DA25 /* Pods-AltStore.release.xcconfig */, + ); + name = "Pods-AltStore"; + path = "Target Support Files/Pods-AltStore"; + sourceTree = ""; + }; 9307E5FFD57ACBE2597611F16A6139DA /* Frameworks */ = { isa = PBXGroup; children = ( @@ -1423,32 +1494,6 @@ name = Frameworks; sourceTree = ""; }; - A25CEE5A93D9C8F43DE9AB2C39CEE220 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - A623B766890FCB34E7F40129A4502B63 /* Pods-AltServer */, - 29BB281BA7D464B1749908A7D7B87093 /* Pods-AltStore */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - A623B766890FCB34E7F40129A4502B63 /* Pods-AltServer */ = { - isa = PBXGroup; - children = ( - 1FDDB64DD95C45BA9E30FFB7ECFB9C30 /* Pods-AltServer.modulemap */, - 67F9C672B6F11F0BC41900AED4C10DE0 /* Pods-AltServer-acknowledgements.markdown */, - 827E121948344EAD1A1BAD926CD89E2C /* Pods-AltServer-acknowledgements.plist */, - E8434827ABB58D1C0275F5BDE3717F16 /* Pods-AltServer-dummy.m */, - BC6F74406EF976ECC3669BD38B0ECED4 /* Pods-AltServer-frameworks.sh */, - 91203FEFD09BD6533A223ACCB6D53735 /* Pods-AltServer-Info.plist */, - 4A3F93787631B5439B1EA07C44C1097A /* Pods-AltServer-umbrella.h */, - 3A44D4EBF7CD579B73B275F0F125F846 /* Pods-AltServer.debug.xcconfig */, - 1215053FA027E4CE849DAF4D00697FF1 /* Pods-AltServer.release.xcconfig */, - ); - name = "Pods-AltServer"; - path = "Target Support Files/Pods-AltServer"; - sourceTree = ""; - }; A8E8EC855E36F4AD2F328CCDAA64BFAB /* Pod */ = { isa = PBXGroup; children = ( @@ -1689,8 +1734,8 @@ AF69713775B03B86677F3D2E78371BDA /* Development Pods */, C080C886C9E2F80D52E3E86A62E5B711 /* Frameworks */, C27EC5BB44921E86A3540A05A3E4DE34 /* Pods */, - 4E801E465E7C325D42C6ADBADF282456 /* Products */, - A25CEE5A93D9C8F43DE9AB2C39CEE220 /* Targets Support Files */, + 2C6DD3243036D912CFF08FC91260A033 /* Products */, + 30C5E295E48CEDE7497C55DE64DBC687 /* Targets Support Files */, ); sourceTree = ""; }; @@ -1851,6 +1896,13 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 0C5FFA2756F2B38D09CD34ABD1FC2356 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5A0720C096941A3006070216308EE5E4 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2275,6 +2327,25 @@ productReference = 97376E80213BC9E42F08C1C3E739327F /* libAltSign.a */; productType = "com.apple.product-type.library.static"; }; + A7A6DC28A6D60809855FE404C6A3EA29 /* Pods-AltDaemon */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0D7F14884B35286EA8908CE5B7BE6DFC /* Build configuration list for PBXNativeTarget "Pods-AltDaemon" */; + buildPhases = ( + 0C5FFA2756F2B38D09CD34ABD1FC2356 /* Headers */, + 1D0BC9C1B9B61E3D8F6D25D2B03BF8EF /* Sources */, + C60D4971328D3B30E809D85DF9AC9C1C /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 654042244EF3A473B122D0548F1E7D5F /* PBXTargetDependency */, + 4A8907B54AA4AE05FA8507388DF4C44F /* PBXTargetDependency */, + ); + name = "Pods-AltDaemon"; + productName = "Pods-AltDaemon"; + productReference = 49B0F76928525434803E52E609201454 /* libPods-AltDaemon.a */; + productType = "com.apple.product-type.library.static"; + }; B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */ = { isa = PBXNativeTarget; buildConfigurationList = 729F25285E2C7B6E2B1F4A22919FEC8C /* Build configuration list for PBXNativeTarget "Roxas" */; @@ -2310,7 +2381,7 @@ Base, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 4E801E465E7C325D42C6ADBADF282456 /* Products */; + productRefGroup = 2C6DD3243036D912CFF08FC91260A033 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -2318,6 +2389,7 @@ A3282A5B2437E609EEB85861D7ECE717 /* AppCenter */, 615C831BCE925ED486B225B87E44926D /* KeychainAccess */, 062A64896E847A6749F58B6BA9A931B1 /* Nuke */, + A7A6DC28A6D60809855FE404C6A3EA29 /* Pods-AltDaemon */, 89B529DD288896C2EFC49575065F70FB /* Pods-AltServer */, 7083360F3F274C756CA77375F9D2A2BD /* Pods-AltStore */, B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */, @@ -2396,6 +2468,14 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1D0BC9C1B9B61E3D8F6D25D2B03BF8EF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D2517BDBD1ABC11CE0956092866DE325 /* Pods-AltDaemon-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 1D542A07EC16C65863169B12C3EFA1AE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2571,12 +2651,24 @@ target = A3282A5B2437E609EEB85861D7ECE717 /* AppCenter */; targetProxy = C24230D37E930D006BF95D0AD49EEC82 /* PBXContainerItemProxy */; }; + 4A8907B54AA4AE05FA8507388DF4C44F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Roxas; + target = B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */; + targetProxy = B1324C39ACC0CCA590E2F6C1CEE2A8A0 /* PBXContainerItemProxy */; + }; 5DC764A2079E6566B6F43A6E4DC9F4AF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Roxas; target = B5D1BA64AC676FF46408FCDE19A05767 /* Roxas */; targetProxy = AEF8A1FC207CBD08591F3D9033C2F05B /* PBXContainerItemProxy */; }; + 654042244EF3A473B122D0548F1E7D5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = AltSign; + target = 951A9DDCF9D2F851D1EC2B8CCD08ADFA /* AltSign */; + targetProxy = EB92C48D1AC6614C7A547B50D0514BC5 /* PBXContainerItemProxy */; + }; 6E8C33961EA95A1968B7F180F87A0A68 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = STPrivilegedTask; @@ -2632,7 +2724,7 @@ }; 03A826C198089C15D11AC65F5BED730D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3A44D4EBF7CD579B73B275F0F125F846 /* Pods-AltServer.debug.xcconfig */; + baseConfigurationReference = 0100FAF2D9192354B5AD97C5ACA2892A /* Pods-AltServer.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; @@ -2776,6 +2868,28 @@ }; name = Debug; }; + 1993FA6D3A63D76A42298DDD4D69750B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 79DC23F753EEAEA1F99B4F772AC87CEB /* Pods-AltDaemon.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + MACH_O_TYPE = staticlib; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; 21221507EB6C5017FA40BD87C8A5AE87 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 98D79D75B1A90F9F6A3DDAF54FF3C81A /* Sparkle.xcconfig */; @@ -2891,7 +3005,7 @@ }; 81F1B766BA25BC1DF5BB72B95C79D4F4 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8E59788A401232096F8BFE2CF38011B3 /* Pods-AltStore.release.xcconfig */; + baseConfigurationReference = 415A2399B6A802A272A86233D7C9DA25 /* Pods-AltStore.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -3009,9 +3123,32 @@ }; name = Debug; }; + C8E31C3BA27894CDC72F7EA65DE99EF0 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 38B25887E1C1D20811EEFC7E4F30E75E /* Pods-AltDaemon.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + MACH_O_TYPE = staticlib; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; D2269E4D719DBA594A24DD1B71DB0AA0 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A82A21359DA7189002E88491D87FB6BE /* Pods-AltStore.debug.xcconfig */; + baseConfigurationReference = 60B0985C122B155F5C155FCB90F30B94 /* Pods-AltStore.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; @@ -3137,7 +3274,7 @@ }; E8921B3E2DFC77CDA00FEE1D9EA36AA0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1215053FA027E4CE849DAF4D00697FF1 /* Pods-AltServer.release.xcconfig */; + baseConfigurationReference = A79744C0D952ADD34EC8CCD2D1501838 /* Pods-AltServer.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; @@ -3217,6 +3354,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 0D7F14884B35286EA8908CE5B7BE6DFC /* Build configuration list for PBXNativeTarget "Pods-AltDaemon" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1993FA6D3A63D76A42298DDD4D69750B /* Debug */, + C8E31C3BA27894CDC72F7EA65DE99EF0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 2C8D06A2289713323892B3638F08AC0B /* Build configuration list for PBXAggregateTarget "Sparkle" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-acknowledgements.markdown b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-acknowledgements.markdown new file mode 100644 index 00000000..102af753 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-acknowledgements.plist b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-acknowledgements.plist new file mode 100644 index 00000000..7acbad1e --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-dummy.m b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-dummy.m new file mode 100644 index 00000000..ef97f98d --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_AltDaemon : NSObject +@end +@implementation PodsDummy_Pods_AltDaemon +@end diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Debug-input-files.xcfilelist new file mode 100644 index 00000000..7e2a13c2 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Debug-input-files.xcfilelist @@ -0,0 +1,4 @@ +${PODS_ROOT}/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources.sh +${PODS_ROOT}/../Dependencies/AltSign/AltSign/Resources/apple.pem +${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTCollectionViewCell.xib +${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTPlaceholderView.xib \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Debug-output-files.xcfilelist new file mode 100644 index 00000000..cf0ea406 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Debug-output-files.xcfilelist @@ -0,0 +1,3 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/apple.pem +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RSTCollectionViewCell.nib +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RSTPlaceholderView.nib \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Release-input-files.xcfilelist new file mode 100644 index 00000000..7e2a13c2 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Release-input-files.xcfilelist @@ -0,0 +1,4 @@ +${PODS_ROOT}/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources.sh +${PODS_ROOT}/../Dependencies/AltSign/AltSign/Resources/apple.pem +${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTCollectionViewCell.xib +${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTPlaceholderView.xib \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Release-output-files.xcfilelist new file mode 100644 index 00000000..cf0ea406 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources-Release-output-files.xcfilelist @@ -0,0 +1,3 @@ +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/apple.pem +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RSTCollectionViewCell.nib +${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RSTPlaceholderView.nib \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources.sh b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources.sh new file mode 100755 index 00000000..eddfe6e1 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon-resources.sh @@ -0,0 +1,133 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then + # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy + # resources to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +case "${TARGETED_DEVICE_FAMILY:-}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" || true + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "${PODS_ROOT}/../Dependencies/AltSign/AltSign/Resources/apple.pem" + install_resource "${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTCollectionViewCell.xib" + install_resource "${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTPlaceholderView.xib" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "${PODS_ROOT}/../Dependencies/AltSign/AltSign/Resources/apple.pem" + install_resource "${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTCollectionViewCell.xib" + install_resource "${PODS_ROOT}/../Dependencies/Roxas/Roxas/RSTPlaceholderView.xib" +fi + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + else + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" + fi +fi diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon.debug.xcconfig b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon.debug.xcconfig new file mode 100644 index 00000000..04b744c9 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon.debug.xcconfig @@ -0,0 +1,11 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AltSign" "${PODS_ROOT}/Headers/Public/Roxas" "$(SRCROOT)/../Dependencies/AltSign/Dependencies/ldid/libplist/include" "$(SRCROOT)/../Dependencies/AltSign/Dependencies/ldid/libplist/src" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AltSign" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" "${PODS_ROOT}/../Dependencies/AltSign/Dependencies/OpenSSL/ios/lib" +OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Public/AltSign/AltSign.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/Roxas/Roxas.modulemap" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AltSign" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AltSign" -l"Roxas" -l"c++" -l"crypto" -l"ssl" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/AltSign/AltSign.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/Roxas/Roxas.modulemap" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon.release.xcconfig b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon.release.xcconfig new file mode 100644 index 00000000..04b744c9 --- /dev/null +++ b/Pods/Target Support Files/Pods-AltDaemon/Pods-AltDaemon.release.xcconfig @@ -0,0 +1,11 @@ +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AltSign" "${PODS_ROOT}/Headers/Public/Roxas" "$(SRCROOT)/../Dependencies/AltSign/Dependencies/ldid/libplist/include" "$(SRCROOT)/../Dependencies/AltSign/Dependencies/ldid/libplist/src" +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AltSign" "${PODS_CONFIGURATION_BUILD_DIR}/Roxas" "${PODS_ROOT}/../Dependencies/AltSign/Dependencies/OpenSSL/ios/lib" +OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_ROOT}/Headers/Public/AltSign/AltSign.modulemap" -fmodule-map-file="${PODS_ROOT}/Headers/Public/Roxas/Roxas.modulemap" -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AltSign" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AltSign" -l"Roxas" -l"c++" -l"crypto" -l"ssl" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/AltSign/AltSign.modulemap" -Xcc -fmodule-map-file="${PODS_ROOT}/Headers/Public/Roxas/Roxas.modulemap" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES