Merge branch 'jailbreak' into develop

This commit is contained in:
Riley Testut
2020-06-08 11:33:57 -07:00
64 changed files with 2698 additions and 1043 deletions

View File

@@ -0,0 +1,36 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import <Foundation/Foundation.h>
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<NSString *, NSString *> *)appleIDHeadersForRequest:(NSURLRequest *)request;
@end
@interface LSApplicationWorkspace : NSObject
@property (class, readonly) LSApplicationWorkspace *defaultWorkspace;
- (BOOL)installApplication:(NSURL *)fileURL withOptions:(nullable NSDictionary<NSString *, id> *)options error:(NSError *_Nullable *)error;
- (BOOL)uninstallApplication:(NSString *)bundleIdentifier withOptions:(nullable NSDictionary *)options;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>6XVY5G3U44.com.rileytestut.AltDaemon</string>
<key>get-task-allow</key>
<true/>
<key>platform-application</key>
<true/>
<key>com.apple.authkit.client.private</key>
<true/>
<key>com.apple.private.mobileinstall.allowedSPI</key>
<array>
<string>Install</string>
<string>Uninstall</string>
<string>InstallForLaunchServices</string>
<string>UninstallForLaunchServices</string>
<string>InstallLocalProvisioned</string>
</array>
</dict>
</plist>

View File

@@ -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: "<MacBookPro15,1> <Mac OS X;10.15.2;19C57> <com.apple.AuthKit/1 (com.apple.dt.Xcode/3594.4.19)>",
date: date,
locale: .current,
timeZone: .current)
return anisetteData
}
}

126
AltDaemon/AppManager.swift Normal file
View File

@@ -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<String>?, completionHandler: @escaping (Result<Void, Error>) -> 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, Error>) -> 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<ALTProvisioningProfile>, activeProfiles: Set<String>?, completionHandler: @escaping (Result<Void, Error>) -> 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<String>, completionHandler: @escaping (Result<Void, Error>) -> 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))
}
}
}
}

View File

@@ -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)
}
}

View File

@@ -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<RequestHandler>
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<AnisetteDataResponse, Error>) -> 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<InstallationProgressResponse, Error>) -> 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<InstallProvisioningProfilesResponse, Error>) -> 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<RemoveProvisioningProfilesResponse, Error>) -> 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<RemoveAppResponse, Error>) -> 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))
}
}
}
}

14
AltDaemon/main.swift Normal file
View File

@@ -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()
}

View File

@@ -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

View File

@@ -0,0 +1,2 @@
#!/bin/sh
launchctl load /Library/LaunchDaemons/com.rileytestut.altdaemon.plist

View File

@@ -0,0 +1,2 @@
#!/bin/sh
launchctl unload /Library/LaunchDaemons/com.rileytestut.altdaemon.plist >> /dev/null 2>&1

2
AltDaemon/package/DEBIAN/prerm Executable file
View File

@@ -0,0 +1,2 @@
#!/bin/sh
launchctl unload /Library/LaunchDaemons/com.rileytestut.altdaemon.plist

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.rileytestut.altdaemon</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/AltDaemon</string>
</array>
<key>UserName</key>
<string>mobile</string>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

Binary file not shown.

View File

@@ -8,5 +8,6 @@
#import "NSError+ALTServerError.h"
#import "CFNotificationName+AltStore.h"
#import "ALTConnection.h"
extern uint16_t ALTDeviceListeningSocket;

View File

@@ -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

View File

@@ -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");

View File

@@ -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:

View File

@@ -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)
}
}

View File

@@ -0,0 +1,23 @@
//
// ALTConnection.h
// AltKit
//
// Created by Riley Testut on 6/1/20.
// Copyright © 2020 Riley Testut. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(Connection)
@protocol ALTConnection <NSObject>
- (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

View File

@@ -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, ALTServerError>) -> 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<Data, ALTServerError>) -> 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<T: Encodable>(_ response: T, shouldDisconnect: Bool = false, completionHandler: @escaping (Result<Void, ALTServerError>) -> Void)
{
func finish(_ result: Result<Void, ALTServerError>)
{
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<ServerRequest, ALTServerError>) -> Void)
{
let size = MemoryLayout<Int32>.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)))
}
}
}
}

View File

@@ -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<AnisetteDataResponse, Error>) -> Void)
func handlePrepareAppRequest(_ request: PrepareAppRequest, for connection: Connection, completionHandler: @escaping (Result<InstallationProgressResponse, Error>) -> Void)
func handleInstallProvisioningProfilesRequest(_ request: InstallProvisioningProfilesRequest, for connection: Connection,
completionHandler: @escaping (Result<InstallProvisioningProfilesResponse, Error>) -> Void)
func handleRemoveProvisioningProfilesRequest(_ request: RemoveProvisioningProfilesRequest, for connection: Connection,
completionHandler: @escaping (Result<RemoveProvisioningProfilesResponse, Error>) -> Void)
func handleRemoveAppRequest(_ request: RemoveAppRequest, for connection: Connection, completionHandler: @escaping (Result<RemoveAppResponse, Error>) -> Void)
}
public protocol ConnectionHandler: AnyObject
{
var connectionHandler: ((Connection) -> Void)? { get set }
var disconnectionHandler: ((Connection) -> Void)? { get set }
func startListening()
func stopListening()
}
public class ConnectionManager<RequestHandlerType: RequestHandler>
{
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<T: ServerMessageProtocol>(_ result: Result<T, Error>)
{
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<ErrorResponse, Error>.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<ErrorResponse, Error>.failure(ALTServerError(.unknownRequest)))
}
}
}
}

View File

@@ -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)"
}
}

View File

@@ -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<E: Error>(_ 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<E: Error>(_ code: ALTServerError.Code, underlyingError: E)
{
self = ALTServerError(code, userInfo: [NSUnderlyingErrorKey: underlyingError])
}
}

View File

@@ -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)
}
}

View File

@@ -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<String>?
public init(activeProfiles: Set<String>?)
public var bundleIdentifier: String?
public init(activeProfiles: Set<String>?, bundleIdentifier: String?)
{
self.activeProfiles = activeProfiles
self.bundleIdentifier = bundleIdentifier
}
}

View File

@@ -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;

View File

@@ -8,10 +8,14 @@
#import <AltSign/AltSign.h>
#import "AltKit.h"
NS_ASSUME_NONNULL_BEGIN
NS_SWIFT_NAME(WiredConnection)
@interface ALTWiredConnection : NSObject
@interface ALTWiredConnection : NSObject <ALTConnection>
@property (nonatomic, readonly, getter=isConnected) BOOL connected;
@property (nonatomic, copy, readonly) ALTDevice *device;

View File

@@ -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

View File

@@ -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<T: Encodable>(_ response: T, shouldDisconnect: Bool = false, completionHandler: @escaping (Result<Void, ALTServerError>) -> Void)
{
func finish(_ result: Result<Void, ALTServerError>)
{
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<ServerRequest, ALTServerError>) -> Void)
{
let size = MemoryLayout<Int32>.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, Error>) -> 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<Data, Error>) -> 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.")
}
}
}

View File

@@ -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<E: Error>(_ 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<Void, ALTServerError>)
{
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<URL, ALTServerError>) -> 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<String>?, connection: ClientConnection, completionHandler: @escaping (Result<Void, ALTServerError>) -> 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)
}
}

View File

@@ -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<RequestHandler>
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<AnisetteDataResponse, Error>) -> 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<InstallationProgressResponse, Error>) -> Void)
{
var temporaryURL: URL?
func finish(_ result: Result<InstallationProgressResponse, Error>)
{
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<InstallProvisioningProfilesResponse, Error>) -> 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<RemoveProvisioningProfilesResponse, Error>) -> 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<RemoveAppResponse, Error>) -> 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<URL, ALTServerError>) -> 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<String>?, connection: Connection, completionHandler: @escaping (Result<Void, ALTServerError>) -> 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
}
}
}
})
}
}

View File

@@ -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)
}
}

View File

@@ -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)
}
}

View File

@@ -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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
BF02419322F2156E00129732 /* RefreshAttempt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAttempt.swift; sourceTree = "<group>"; };
BF02419522F2199300129732 /* RefreshAttemptsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAttemptsViewController.swift; sourceTree = "<group>"; };
@@ -345,9 +360,17 @@
BF100C46232D7828006A8926 /* AltStore 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 2.xcdatamodel"; sourceTree = "<group>"; };
BF100C4F232D7CD1006A8926 /* AltStoreToAltStore2.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStoreToAltStore2.xcmappingmodel; sourceTree = "<group>"; };
BF100C53232D7DAE006A8926 /* StoreAppPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoreAppPolicy.swift; sourceTree = "<group>"; };
BF10EB3124870B3F0055E6DB /* LocalConnectionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalConnectionHandler.swift; sourceTree = "<group>"; };
BF10EB33248730750055E6DB /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
BF18B0F022E25DF9005C4CF5 /* ToastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastView.swift; sourceTree = "<group>"; };
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 = "<group>"; };
BF18BFF624858BDE00DD5981 /* Connection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = "<group>"; };
BF18BFFC2485A1E400DD5981 /* WiredConnectionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WiredConnectionHandler.swift; sourceTree = "<group>"; };
BF18BFFE2485A42800DD5981 /* ALTConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTConnection.h; sourceTree = "<group>"; };
BF18C0032485B4DE00DD5981 /* AltDaemon-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AltDaemon-Bridging-Header.h"; sourceTree = "<group>"; };
BF1E3128229F474900370A3C /* ServerProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerProtocol.swift; sourceTree = "<group>"; };
BF1E3129229F474900370A3C /* ConnectionManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionManager.swift; sourceTree = "<group>"; };
BF1E3129229F474900370A3C /* RequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestHandler.swift; sourceTree = "<group>"; };
BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+AltStore.swift"; sourceTree = "<group>"; };
BF1E314722A060F300370A3C /* AltStore-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AltStore-Bridging-Header.h"; sourceTree = "<group>"; };
BF1E314822A060F400370A3C /* NSError+ALTServerError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSError+ALTServerError.h"; sourceTree = "<group>"; };
@@ -502,9 +525,13 @@
BF7C627023DBB33300515A2D /* AltStore 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 3.xcdatamodel"; sourceTree = "<group>"; };
BF7C627123DBB3B400515A2D /* AltStore2ToAltStore3.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore2ToAltStore3.xcmappingmodel; sourceTree = "<group>"; };
BF7C627323DBB78C00515A2D /* InstalledAppPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstalledAppPolicy.swift; sourceTree = "<group>"; };
BF8CAE422489E772004D6CCE /* AnisetteDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnisetteDataManager.swift; sourceTree = "<group>"; };
BF8CAE432489E772004D6CCE /* AppManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppManager.swift; sourceTree = "<group>"; };
BF8CAE442489E772004D6CCE /* RequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestHandler.swift; sourceTree = "<group>"; };
BF8CAE4A2489F5A0004D6CCE /* AltDaemon.deb */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = AltDaemon.deb; sourceTree = "<group>"; };
BF8CAE4D248AEABA004D6CCE /* UIDevice+Jailbreak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDevice+Jailbreak.swift"; sourceTree = "<group>"; };
BF8F69C122E659F700049BA1 /* AppContentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppContentViewController.swift; sourceTree = "<group>"; };
BF8F69C322E662D300049BA1 /* AppViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppViewController.swift; sourceTree = "<group>"; };
BF9A03C523C7DD0D000D08DB /* ClientConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientConnection.swift; sourceTree = "<group>"; };
BF9ABA4422DCFF43008935CF /* BrowseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseViewController.swift; sourceTree = "<group>"; };
BF9ABA4622DD0638008935CF /* BrowseCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowseCollectionViewCell.swift; sourceTree = "<group>"; };
BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotCollectionViewCell.swift; sourceTree = "<group>"; };
@@ -617,6 +644,11 @@
BFF0B695232242D3007A79E1 /* LicensesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicensesViewController.swift; sourceTree = "<group>"; };
BFF0B6972322CAB8007A79E1 /* InstructionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstructionsViewController.swift; sourceTree = "<group>"; };
BFF0B6992322D7D0007A79E1 /* UIScreen+CompactHeight.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScreen+CompactHeight.swift"; sourceTree = "<group>"; };
BFF767C72489A74E0097E58C /* WirelessConnectionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WirelessConnectionHandler.swift; sourceTree = "<group>"; };
BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTServerError+Conveniences.swift"; sourceTree = "<group>"; };
BFF767CD2489ABE90097E58C /* NetworkConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConnection.swift; sourceTree = "<group>"; };
BFFCFA45248835530077BFCE /* AltDaemon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AltDaemon.entitlements; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>";
@@ -735,19 +778,38 @@
path = Policies;
sourceTree = "<group>";
};
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 = "<group>";
};
BF18BFFF2485A75F00DD5981 /* Server Protocol */ = {
isa = PBXGroup;
children = (
BF1E3128229F474900370A3C /* ServerProtocol.swift */,
BFD44605241188C300EAB90A /* CodableServerError.swift */,
);
path = "Server Protocol";
sourceTree = "<group>";
};
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 = "<group>";
@@ -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 = "<group>";
@@ -1138,6 +1202,7 @@
BF4713A422976CFC00784A2F /* openssl.framework */,
FC3822AB1C4CF1D4CDF7445D /* Pods_AltServer.framework */,
0DE618FA97EA42C3F468D186 /* libPods-AltStore.a */,
5B0B5097D956380B6E11D09C /* libPods-AltDaemon.a */,
);
name = Frameworks;
sourceTree = "<group>";
@@ -1177,6 +1242,7 @@
BFB1169C22932DB100BB457C /* apps.json */,
BFD247762284B9A700981D42 /* Assets.xcassets */,
BF770E6822BD57DD002A40FE /* Silence.m4a */,
BF8CAE4A2489F5A0004D6CCE /* AltDaemon.deb */,
);
path = Resources;
sourceTree = "<group>";
@@ -1225,6 +1291,7 @@
BF6C336124197D700034FD24 /* NSError+LocalizedFailure.swift */,
BF663C4E2433ED8200DAA738 /* FileManager+DirectorySize.swift */,
BF6A531F246DC1B0004F59C8 /* FileManager+SharedDirectories.swift */,
BF8CAE4D248AEABA004D6CCE /* UIDevice+Jailbreak.swift */,
);
path = Extensions;
sourceTree = "<group>";
@@ -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 = "<group>";
};
BFF767C32489A6800097E58C /* Extensions */ = {
isa = PBXGroup;
children = (
BFBAC8852295C90300587369 /* Result+Conveniences.swift */,
BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */,
BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
BFF767C42489A6980097E58C /* Categories */ = {
isa = PBXGroup;
children = (
BF1E314822A060F400370A3C /* NSError+ALTServerError.h */,
BF1E314922A060F400370A3C /* NSError+ALTServerError.m */,
BF718BC723C919CC00A89F2D /* CFNotificationName+AltStore.h */,
BF718BC823C919E300A89F2D /* CFNotificationName+AltStore.m */,
);
path = Categories;
sourceTree = "<group>";
};
BFF767CF2489AC240097E58C /* Connections */ = {
isa = PBXGroup;
children = (
BF18BFF22485828200DD5981 /* ConnectionManager.swift */,
BF18BFFE2485A42800DD5981 /* ALTConnection.h */,
BF18BFF624858BDE00DD5981 /* Connection.swift */,
BFF767CD2489ABE90097E58C /* NetworkConnection.swift */,
);
path = Connections;
sourceTree = "<group>";
};
/* 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 = (

View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1150"
version = "1.3">
<BuildAction
parallelizeBuildables = "NO"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "A7A6DC28A6D60809855FE404C6A3EA29"
BuildableName = "libPods-AltDaemon.a"
BlueprintName = "Pods-AltDaemon"
ReferencedContainer = "container:Pods/Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BF1E314F22A0616100370A3C"
BuildableName = "libAltKit.a"
BlueprintName = "AltKit"
ReferencedContainer = "container:AltStore.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BF18BFE624857D7900DD5981"
BuildableName = "AltDaemon"
BlueprintName = "AltDaemon"
ReferencedContainer = "container:AltStore.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BF18BFE624857D7900DD5981"
BuildableName = "AltDaemon"
BlueprintName = "AltDaemon"
ReferencedContainer = "container:AltStore.xcodeproj">
</BuildableReference>
</MacroExpansion>
<EnvironmentVariables>
<EnvironmentVariable
key = "THEOS"
value = "~/theos"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "BF18BFE624857D7900DD5981"
BuildableName = "AltDaemon"
BlueprintName = "AltDaemon"
ReferencedContainer = "container:AltStore.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -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) {

View File

@@ -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
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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<Server>
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<Server>
}
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<Server, Error>)
{
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
}
}
}

View File

@@ -144,7 +144,7 @@ class InstallAppOperation: ResultOperation<InstalledApp>
})
}
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<InstalledApp>
{
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
{

View File

@@ -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(()))
}
}
}
}

Binary file not shown.

View File

@@ -10,22 +10,6 @@ import Network
import AltKit
extension ALTServerError
{
init<E: Error>(_ 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

View File

@@ -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)
}
}

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16092.1" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="5Rz-4h-jJ8">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="5Rz-4h-jJ8">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16082.1"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -20,7 +20,7 @@
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<label key="tableFooterView" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="AltStore 1.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="bUR-rp-Nw2">
<rect key="frame" x="0.0" y="905.5" width="375" height="25"/>
<rect key="frame" x="0.0" y="996.5" width="375" height="25"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="1" alpha="0.69999999999999996" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -237,10 +237,40 @@
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="" id="9ht-ML-85l">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="wYS-qW-u8S" rowHeight="51" style="IBUITableViewCellStyleDefault" id="ndZ-OC-MWv" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="501.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ndZ-OC-MWv" id="Tuq-2M-9df">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Install AltDaemon" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="wYS-qW-u8S">
<rect key="frame" x="30" y="0.0" width="315" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
<inset key="separatorInset" minX="30" minY="0.0" maxX="30" maxY="0.0"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="style">
<integer key="value" value="0"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
</userDefinedRuntimeAttributes>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="" id="eHy-qI-w5w">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="30h-59-88f" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="501.5" width="375" height="51"/>
<rect key="frame" x="0.0" y="592.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="30h-59-88f" id="7qD-DW-Jls">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
@@ -280,7 +310,7 @@
<tableViewSection headerTitle="" id="J90-vn-u2O">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="i4T-2q-jF3" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="592.5" width="375" height="51"/>
<rect key="frame" x="0.0" y="683.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="i4T-2q-jF3" id="VTQ-H4-aCM">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
@@ -324,7 +354,7 @@
</userDefinedRuntimeAttributes>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="0MT-ht-Sit" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="643.5" width="375" height="51"/>
<rect key="frame" x="0.0" y="734.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0MT-ht-Sit" id="OZp-WM-5H7">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
@@ -368,7 +398,7 @@
</userDefinedRuntimeAttributes>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="O5R-Al-lGj" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="694.5" width="375" height="51"/>
<rect key="frame" x="0.0" y="785.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="O5R-Al-lGj" id="CrG-Mr-xQq">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
@@ -408,7 +438,7 @@
<tableViewSection headerTitle="" id="OMa-EK-hRI">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="FMZ-as-Ljo" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="785.5" width="375" height="51"/>
<rect key="frame" x="0.0" y="876.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="FMZ-as-Ljo" id="JzL-Of-A3T">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
@@ -441,7 +471,7 @@
</userDefinedRuntimeAttributes>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Qca-pU-sJh" customClass="InsetGroupTableViewCell" customModule="AltStore" customModuleProvider="target">
<rect key="frame" x="0.0" y="836.5" width="375" height="51"/>
<rect key="frame" x="0.0" y="927.5" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Qca-pU-sJh" id="QtU-8J-VQN">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
@@ -608,7 +638,7 @@
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" layoutMarginsFollowReadableWidth="YES" contentInsetAdjustmentBehavior="never" indicatorStyle="white" editable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oQQ-pR-oKc">
<rect key="frame" x="0.0" y="44" width="375" height="574"/>
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
<mutableString key="text">Jay Freeman (ldid)
<string key="text">Jay Freeman (ldid)
Copyright (C) 2007-2012 Jay Freeman (saurik)
libimobiledevice
@@ -685,7 +715,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
ICONS
Settings by i cons from the Noun Project</mutableString>
Settings by i cons from the Noun Project</string>
<color key="textColor" white="1" alpha="0.75" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>

View File

@@ -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

11
Podfile
View File

@@ -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|

View File

@@ -62,6 +62,6 @@ SPEC CHECKSUMS:
Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708
STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68
PODFILE CHECKSUM: 1317f1da77af3fbb8c90b0d34845d2f0068d488c
PODFILE CHECKSUM: bd28424f8d9916505402972bc06c1925ce9f5026
COCOAPODS: 1.8.4

2
Pods/Manifest.lock generated
View File

@@ -62,6 +62,6 @@ SPEC CHECKSUMS:
Sparkle: 3f75576db8b0265adef36c43249d747f22d0b708
STPrivilegedTask: 56c3397238a1ec07720fb877a044898373cd2c68
PODFILE CHECKSUM: 1317f1da77af3fbb8c90b0d34845d2f0068d488c
PODFILE CHECKSUM: bd28424f8d9916505402972bc06c1925ce9f5026
COCOAPODS: 1.8.4

View File

@@ -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 = "<group>"; };
0100FAF2D9192354B5AD97C5ACA2892A /* Pods-AltServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.debug.xcconfig"; sourceTree = "<group>"; };
01EE98A5766917099B441607B08AEF3B /* RSTDynamicDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTDynamicDataSource.h; path = Roxas/RSTDynamicDataSource.h; sourceTree = "<group>"; };
026DC37EEB01428D873261F3CB427FE8 /* Roxas.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Roxas.modulemap; sourceTree = "<group>"; };
02B30122F755FA8B1BAE13CA00BA4D40 /* blowfish.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = blowfish.h; path = Dependencies/OpenSSL/ios/include/openssl/blowfish.h; sourceTree = "<group>"; };
@@ -469,6 +485,7 @@
059702EBFD928AE0189CA3F830C3616E /* ALTCertificateRequest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ALTCertificateRequest.m; sourceTree = "<group>"; };
0609BCE55DD9CFA3B184D68CE9D8D29B /* UISpringTimingParameters+Conveniences.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISpringTimingParameters+Conveniences.m"; path = "Roxas/UISpringTimingParameters+Conveniences.m"; sourceTree = "<group>"; };
0751F7694817D0E796E34BDA38D20A3B /* ccmd5.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmd5.h; path = Dependencies/corecrypto/ccmd5.h; sourceTree = "<group>"; };
09CBBA5767A1426DCF3A11FFFCCD6C9A /* Pods-AltStore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStore-acknowledgements.markdown"; sourceTree = "<group>"; };
0A0CAD2F5EF0037CACB181692CCEFC6F /* RSTLaunchViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTLaunchViewController.m; path = Roxas/RSTLaunchViewController.m; sourceTree = "<group>"; };
0A42A9A1EEFA70A1653FD7A3CEA23219 /* cc_debug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc_debug.h; path = Dependencies/corecrypto/cc_debug.h; sourceTree = "<group>"; };
0AF287DBC0725AF33B14CD9BE967E93D /* ccsrp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccsrp.h; path = Dependencies/corecrypto/ccsrp.h; sourceTree = "<group>"; };
@@ -476,14 +493,13 @@
0D056070FF1CAD623E04B056987D215E /* RSTHelperFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTHelperFile.m; path = Roxas/RSTHelperFile.m; sourceTree = "<group>"; };
0D0916ED915FE3469729DB8CD31E623C /* UIAlertAction+Actions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertAction+Actions.h"; path = "Roxas/UIAlertAction+Actions.h"; sourceTree = "<group>"; };
0D659CD2AA9C92DF6E9B43DA90AF27AC /* ebcdic.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ebcdic.h; path = Dependencies/OpenSSL/ios/include/openssl/ebcdic.h; sourceTree = "<group>"; };
0D7CC1D321A7EFF4B480E5BAC0685CFC /* Pods-AltStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStore.modulemap"; sourceTree = "<group>"; };
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 = "<group>"; };
0FF4DFCBD550423E377A4B95FF98BFC4 /* RSTHasher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTHasher.h; path = Roxas/RSTHasher.h; sourceTree = "<group>"; };
107026048A6314BCB6551F23F23AEFD4 /* Boolean.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = Boolean.cpp; sourceTree = "<group>"; };
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 = "<group>"; };
1104F3DB9BFE2FD485E07DFDCE51C324 /* STPrivilegedTask-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "STPrivilegedTask-dummy.m"; sourceTree = "<group>"; };
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 = "<group>"; };
1215053FA027E4CE849DAF4D00697FF1 /* Pods-AltServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.release.xcconfig"; sourceTree = "<group>"; };
1192029049EFACF019572AE1D7C92004 /* Pods-AltStore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-acknowledgements.plist"; sourceTree = "<group>"; };
14CFEC626B7EA4CA5CD713FE6CC97FDC /* NSPredicate+Search.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSPredicate+Search.m"; path = "Roxas/NSPredicate+Search.m"; sourceTree = "<group>"; };
14EAE44A37B74218DAE2706E4BA6711D /* plist.c */ = {isa = PBXFileReference; includeInIndex = 1; path = plist.c; sourceTree = "<group>"; };
15401FF4A3F7C90F76DE04FB0BBF5A00 /* AppCenter.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AppCenter.xcconfig; sourceTree = "<group>"; };
@@ -510,7 +526,6 @@
1DF21761F51793B1E79B815C42A7224C /* AltSign.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AltSign.xcconfig; sourceTree = "<group>"; };
1E0ADF893622CFC816C5CF2BD893648E /* time64.c */ = {isa = PBXFileReference; includeInIndex = 1; path = time64.c; sourceTree = "<group>"; };
1E4C74EB97AA653EB2B4ED3024626A52 /* bplist.c */ = {isa = PBXFileReference; includeInIndex = 1; path = bplist.c; sourceTree = "<group>"; };
1FDDB64DD95C45BA9E30FFB7ECFB9C30 /* Pods-AltServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltServer.modulemap"; sourceTree = "<group>"; };
2119733D600F6F015CE868CFBBA5E2E1 /* cccmac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cccmac.h; path = Dependencies/corecrypto/cccmac.h; sourceTree = "<group>"; };
214A7740331D44B14BED994D0AD62890 /* RSTOperation_Subclasses.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperation_Subclasses.h; path = Roxas/RSTOperation_Subclasses.h; sourceTree = "<group>"; };
21622C57776B02F7072D150F0B8361ED /* SUAppcast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcast.h; path = Sparkle.framework/Versions/A/Headers/SUAppcast.h; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
28CC4C54E2CCB470E999C3B9B45DDEB0 /* STPrivilegedTask.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = STPrivilegedTask.modulemap; sourceTree = "<group>"; };
29839951F935B229EC6919D9B7379D26 /* RSTCellContentPrefetchingDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentPrefetchingDataSource.h; path = Roxas/RSTCellContentPrefetchingDataSource.h; sourceTree = "<group>"; };
29D47FB44A4B93E67977EA7DA41FDBFE /* Pods-AltDaemon-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltDaemon-resources.sh"; sourceTree = "<group>"; };
29DDEEEB045FDE52E9750BDC8D15D561 /* ccdrbg_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdrbg_impl.h; path = Dependencies/corecrypto/ccdrbg_impl.h; sourceTree = "<group>"; };
2A31A3F9BAB499BD3B13B3F6F7BFA8A1 /* Nuke.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nuke.modulemap; sourceTree = "<group>"; };
2AB59EF78CE48305009BCBE5CFD27596 /* Data.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = Data.cpp; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
3847A3DB493D2B9BD693D49F7F252F93 /* aes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = aes.h; path = Dependencies/OpenSSL/ios/include/openssl/aes.h; sourceTree = "<group>"; };
389771695B320767CE9FE0680E37A623 /* cczp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cczp.h; path = Dependencies/corecrypto/cczp.h; sourceTree = "<group>"; };
38B25887E1C1D20811EEFC7E4F30E75E /* Pods-AltDaemon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltDaemon.release.xcconfig"; sourceTree = "<group>"; };
39C8B442E4F1D331FA20406BD841D05A /* ts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ts.h; path = Dependencies/OpenSSL/ios/include/openssl/ts.h; sourceTree = "<group>"; };
39F52AFBCFA9F816FF726CF258D87FB2 /* ui.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ui.h; path = Dependencies/OpenSSL/ios/include/openssl/ui.h; sourceTree = "<group>"; };
3A44D4EBF7CD579B73B275F0F125F846 /* Pods-AltServer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.debug.xcconfig"; sourceTree = "<group>"; };
3B785D124B1FE49B3A725737AE70E203 /* Roxas-Prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "Roxas-Prefix.pch"; path = "Roxas/Roxas-Prefix.pch"; sourceTree = "<group>"; };
3BFD8D7E4F26C273FA16D730BBE09E13 /* SPUURLRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUURLRequest.h; path = Sparkle.framework/Versions/A/Headers/SPUURLRequest.h; sourceTree = "<group>"; };
3C6E6C40CF28ADEC88B15ECDF2F3E884 /* SPUDownloaderSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderSession.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderSession.h; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
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 = "<group>"; };
413693D82E21BB52B74898987363EA99 /* cast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cast.h; path = Dependencies/OpenSSL/ios/include/openssl/cast.h; sourceTree = "<group>"; };
415A2399B6A802A272A86233D7C9DA25 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.release.xcconfig"; sourceTree = "<group>"; };
41CB48690B18FAE99417885EF7E6E767 /* cchmac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cchmac.h; path = Dependencies/corecrypto/cchmac.h; sourceTree = "<group>"; };
42D5F4993737B5DFAA5F5E6FB06C2BB8 /* ALTAppleAPISession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppleAPISession.h; sourceTree = "<group>"; };
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 = "<group>"; };
46BDD3848FE0E636C85F4304CF3FB840 /* pem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = pem.h; path = Dependencies/OpenSSL/ios/include/openssl/pem.h; sourceTree = "<group>"; };
474C34D18454CBF5A04B49C2055FBBAB /* ssl2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ssl2.h; path = Dependencies/OpenSSL/ios/include/openssl/ssl2.h; sourceTree = "<group>"; };
4773ABB518FBF6876DAC8F0AE260A54B /* Pods-AltDaemon-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltDaemon-acknowledgements.markdown"; sourceTree = "<group>"; };
47F936C4BE30E448468E5D325E02CD12 /* ALTSigner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTSigner.h; sourceTree = "<group>"; };
490F5F18CD5B71977FAEF4CD4BDCC5F9 /* ALTAppleAPI_Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppleAPI_Private.h; sourceTree = "<group>"; };
4920980B5315FFD0E2EBB7F30EF2BFC5 /* RSTCellContentDataSource_Subclasses.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentDataSource_Subclasses.h; path = Roxas/RSTCellContentDataSource_Subclasses.h; sourceTree = "<group>"; };
493A0B3CB13D03370FC0105ACD627968 /* whrlpool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = whrlpool.h; path = Dependencies/OpenSSL/ios/include/openssl/whrlpool.h; sourceTree = "<group>"; };
4A3F93787631B5439B1EA07C44C1097A /* Pods-AltServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltServer-umbrella.h"; sourceTree = "<group>"; };
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 = "<group>"; };
4BFFC3AD9DB5992D2F577A558958972F /* SPUDownloaderDeprecated.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPUDownloaderDeprecated.h; path = Sparkle.framework/Versions/A/Headers/SPUDownloaderDeprecated.h; sourceTree = "<group>"; };
4C4EB1FF702E3A1ACF22B0FD9AEFDFAE /* md4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = md4.h; path = Dependencies/OpenSSL/ios/include/openssl/md4.h; sourceTree = "<group>"; };
@@ -591,12 +609,14 @@
520E4EFA88F054B4BFBE69E7598ED29D /* RSTCollectionViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCollectionViewCell.h; path = Roxas/RSTCollectionViewCell.h; sourceTree = "<group>"; };
52758575FDE408FC483B772F1A509906 /* ccripemd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccripemd.h; path = Dependencies/corecrypto/ccripemd.h; sourceTree = "<group>"; };
5317E660654C64DB949B1E59A273A07C /* alt_ldid.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = alt_ldid.cpp; sourceTree = "<group>"; };
546B88CFC6EBED3C7F26035C1D82B8B7 /* Pods-AltDaemon-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltDaemon-dummy.m"; sourceTree = "<group>"; };
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 = "<group>"; };
557113703F2557617D59ADA3DB5FD9E8 /* mdc2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mdc2.h; path = Dependencies/OpenSSL/ios/include/openssl/mdc2.h; sourceTree = "<group>"; };
568687E6B6B277681DE9A457F089DF57 /* RSTBlockOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTBlockOperation.h; path = Roxas/RSTBlockOperation.h; sourceTree = "<group>"; };
568A2EC5A1E112757032C27664AC2E1C /* ccpbkdf2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccpbkdf2.h; path = Dependencies/corecrypto/ccpbkdf2.h; sourceTree = "<group>"; };
577F20AC9D1D37C21171DE3BC57EB4B8 /* RSTCellContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentView.h; path = Roxas/RSTCellContentView.h; sourceTree = "<group>"; };
58093B01C1E44E948FEDBDB15079C7C6 /* alt_ldid.hpp */ = {isa = PBXFileReference; includeInIndex = 1; path = alt_ldid.hpp; sourceTree = "<group>"; };
5835BCCA38BE408715F2124CE34EE05A /* Pods-AltServer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltServer.modulemap"; sourceTree = "<group>"; };
5894D9DE89EF3AD8F90F2B9359464119 /* cctest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cctest.h; path = Dependencies/corecrypto/cctest.h; sourceTree = "<group>"; };
58BC72BB52DEC3634030DEDACD3B932E /* RSTCellContentChangeOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentChangeOperation.h; path = Roxas/RSTCellContentChangeOperation.h; sourceTree = "<group>"; };
5997619C66BBB2F2D0E31C562EA522F9 /* hmac.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = hmac.h; path = Dependencies/OpenSSL/ios/include/openssl/hmac.h; sourceTree = "<group>"; };
@@ -611,11 +631,11 @@
5E6C305E38932B0284A040A773DFF879 /* RSTCollectionViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCollectionViewCell.m; path = Roxas/RSTCollectionViewCell.m; sourceTree = "<group>"; };
5F0027637207387F612B8391E5111E9D /* STPrivilegedTask-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-prefix.pch"; sourceTree = "<group>"; };
60987BC87BDAE2562C44DF9109931565 /* RSTCellContentChange.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentChange.m; path = Roxas/RSTCellContentChange.m; sourceTree = "<group>"; };
60B0985C122B155F5C155FCB90F30B94 /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.debug.xcconfig"; sourceTree = "<group>"; };
61472883BDD4214BDDEEA2288061A605 /* RSTSearchController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTSearchController.m; path = Roxas/RSTSearchController.m; sourceTree = "<group>"; };
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 = "<group>"; };
61A98FE2E2A5A1751790C7E5E36372B5 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
61C5B1B207DD52BC5ACAB62A5A6DEF64 /* tls1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = tls1.h; path = Dependencies/OpenSSL/ios/include/openssl/tls1.h; sourceTree = "<group>"; };
61DDF5B83CA12D93D7CBD4F0B3242860 /* Pods-AltStore-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltStore-acknowledgements.markdown"; sourceTree = "<group>"; };
631B9239A14B8849600FF2BE44308CD2 /* UITableView+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+CellContent.m"; path = "Roxas/UITableView+CellContent.m"; sourceTree = "<group>"; };
63413445A679C0467BDE3CAE89B94D34 /* STPrivilegedTask.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = STPrivilegedTask.xcconfig; sourceTree = "<group>"; };
65625EB922D2287FB6B5065FA82D7CA8 /* RSTPlaceholderView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = RSTPlaceholderView.xib; path = Roxas/RSTPlaceholderView.xib; sourceTree = "<group>"; };
@@ -626,11 +646,9 @@
6701293BB9F23B8CF472B900EFFCDE04 /* NSError+ALTErrors.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSError+ALTErrors.m"; sourceTree = "<group>"; };
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 = "<group>"; };
67F9C672B6F11F0BC41900AED4C10DE0 /* Pods-AltServer-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltServer-acknowledgements.markdown"; sourceTree = "<group>"; };
6858F0A591CF832F5B248EE55B17F5A0 /* RSTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTError.m; path = Roxas/RSTError.m; sourceTree = "<group>"; };
68D8D3A708227C0506574E6358D79A3D /* ALTAppGroup.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppGroup.h; sourceTree = "<group>"; };
694E6932887B1C0D0912130564BB474B /* asn1t.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = asn1t.h; path = Dependencies/OpenSSL/ios/include/openssl/asn1t.h; sourceTree = "<group>"; };
695286014335265E05C28AD7B887F02F /* Pods-AltStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStore-umbrella.h"; sourceTree = "<group>"; };
69BC2DC6AC50B0C61B4F7E90078ECBCB /* cc_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc_priv.h; path = Dependencies/corecrypto/cc_priv.h; sourceTree = "<group>"; };
69BCF448A4351DCC0562F34132ABDD71 /* SUVersionComparisonProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionComparisonProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h; sourceTree = "<group>"; };
69ECB6396AFAB0A666321652A0E61F09 /* RSTOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTOperation.h; path = Roxas/RSTOperation.h; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
6E64CA484C441CC0643B335135212607 /* RSTNibView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTNibView.h; path = Roxas/RSTNibView.h; sourceTree = "<group>"; };
6E917D3B3ADB864E9C69574812B5733D /* UIView+AnimatedHide.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+AnimatedHide.m"; path = "Roxas/UIView+AnimatedHide.m"; sourceTree = "<group>"; };
702E803654797D70C915837AF7D76C6B /* Pods-AltServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-Info.plist"; sourceTree = "<group>"; };
705EFF4E047D0012135E9FC6B039DAAE /* UICollectionViewCell+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewCell+CellContent.m"; path = "Roxas/UICollectionViewCell+CellContent.m"; sourceTree = "<group>"; };
709FED73AB0971FF10898C166D5C34DD /* pkcs12.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = pkcs12.h; path = Dependencies/OpenSSL/ios/include/openssl/pkcs12.h; sourceTree = "<group>"; };
71121C9D9F2640ECC1FAA0F3FCDA607F /* SUStandardVersionComparator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUStandardVersionComparator.h; path = Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h; sourceTree = "<group>"; };
@@ -656,8 +675,10 @@
7861F7E486DBFDA791F172183A52B4CF /* ccecies.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccecies.h; path = Dependencies/corecrypto/ccecies.h; sourceTree = "<group>"; };
7870A8AD5E4B6B18B10B9DD5A40084E5 /* UICollectionViewCell+Nibs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionViewCell+Nibs.m"; path = "Roxas/UICollectionViewCell+Nibs.m"; sourceTree = "<group>"; };
79926042DA0FE3AC31BE54B760B6F908 /* Key.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Key.h; sourceTree = "<group>"; };
79DC23F753EEAEA1F99B4F772AC87CEB /* Pods-AltDaemon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltDaemon.debug.xcconfig"; sourceTree = "<group>"; };
7AC3A57327833C46EF9AEA88A5664D69 /* ALTModel+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ALTModel+Internal.h"; sourceTree = "<group>"; };
7AC49781BB0CCCCFBFFF6EEFB0867FEF /* ccmd2.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmd2.h; path = Dependencies/corecrypto/ccmd2.h; sourceTree = "<group>"; };
7B51BFE6F7A28BF6D5614373C24DB981 /* Pods-AltStore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltStore-umbrella.h"; sourceTree = "<group>"; };
7B937B69AB1B177FA5B33FAC4EF2B1F9 /* ALTAppID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAppID.h; sourceTree = "<group>"; };
7B93E8672E3990ED78D813FADC50EECF /* ssl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ssl.h; path = Dependencies/OpenSSL/ios/include/openssl/ssl.h; sourceTree = "<group>"; };
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 = "<group>"; };
81FEA74DB1902FB97CE333C1CEDB224A /* ccrng_system.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrng_system.h; path = Dependencies/corecrypto/ccrng_system.h; sourceTree = "<group>"; };
82341B13B5AF5BB883018AF6C0C29A35 /* Uid.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Uid.h; sourceTree = "<group>"; };
827E121948344EAD1A1BAD926CD89E2C /* Pods-AltServer-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-acknowledgements.plist"; sourceTree = "<group>"; };
82392F6B02D2A2D62197B66C2056B9B9 /* Pods-AltStore-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltStore-resources.sh"; sourceTree = "<group>"; };
82BCE1984F56DA8A1D3B838D10199799 /* NSUserDefaults+DynamicProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSUserDefaults+DynamicProperties.h"; path = "Roxas/NSUserDefaults+DynamicProperties.h"; sourceTree = "<group>"; };
83727454E3DD81F758E0BDADE642B5C9 /* Pods-AltDaemon-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltDaemon-acknowledgements.plist"; sourceTree = "<group>"; };
83BB07F284FD8A5C58CFAFC534D68D48 /* ALTAnisetteData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ALTAnisetteData.m; sourceTree = "<group>"; };
863044A19021CE9383C742A072B8641C /* UICollectionView+CellContent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionView+CellContent.h"; path = "Roxas/UICollectionView+CellContent.h"; sourceTree = "<group>"; };
86BC9D65F62DE91B357F9221B01D3DD9 /* KeychainAccess.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KeychainAccess.modulemap; sourceTree = "<group>"; };
@@ -699,14 +721,12 @@
8C8CB396F5F3F3E83C4FCE36B8954F1B /* zip.c */ = {isa = PBXFileReference; includeInIndex = 1; name = zip.c; path = Dependencies/minizip/zip.c; sourceTree = "<group>"; };
8D56DC21CF454680EB780E780B5BC4A3 /* RSTRelationshipPreservingMergePolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTRelationshipPreservingMergePolicy.h; path = Roxas/RSTRelationshipPreservingMergePolicy.h; sourceTree = "<group>"; };
8DC59D60A54C55B6E1685B2CAB5D5A35 /* SUVersionDisplayProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUVersionDisplayProtocol.h; path = Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h; sourceTree = "<group>"; };
8E59788A401232096F8BFE2CF38011B3 /* Pods-AltStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.release.xcconfig"; sourceTree = "<group>"; };
8E59C3A64EF23452AA58698B0F5F2A39 /* RSTToastView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTToastView.h; path = Roxas/RSTToastView.h; sourceTree = "<group>"; };
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 = "<group>"; };
8F5E1856E53AF0DB69BD508F9A6D3D10 /* opensslconf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = opensslconf.h; path = Dependencies/OpenSSL/ios/include/openssl/opensslconf.h; sourceTree = "<group>"; };
903DA55629D1B8B8172C106D1027247B /* ccec25519_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccec25519_priv.h; path = Dependencies/corecrypto/ccec25519_priv.h; sourceTree = "<group>"; };
911AB656234F15A99CA82B25BA46A6DF /* cc.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cc.h; path = Dependencies/corecrypto/cc.h; sourceTree = "<group>"; };
91203FEFD09BD6533A223ACCB6D53735 /* Pods-AltServer-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-Info.plist"; sourceTree = "<group>"; };
91372A6AD9FBF98E332A9431BA39D4D1 /* RSTNibView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTNibView.m; path = Roxas/RSTNibView.m; sourceTree = "<group>"; };
92199C8E1E8E1DFC2347DB246CA7F1DA /* ImagePreheater.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePreheater.swift; path = Sources/ImagePreheater.swift; sourceTree = "<group>"; };
92B239E2FA94463894D8553410190216 /* plist.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = plist.h; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
99C7B66B038F2B0D0975A387F4E73F29 /* ccchacha20poly1305.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccchacha20poly1305.h; path = Dependencies/corecrypto/ccchacha20poly1305.h; sourceTree = "<group>"; };
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 = "<group>"; };
9A5F712C8D5959F1E477A2D285AB9A07 /* Pods-AltServer-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-AltServer-acknowledgements.markdown"; sourceTree = "<group>"; };
9A69C6F20E3BBAE1C8C90A58CBA3DB0C /* ALTAccount.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAccount.h; sourceTree = "<group>"; };
9A8A48D68CE5B5EF610D60AE61C9F584 /* unzip.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = unzip.h; path = Dependencies/minizip/unzip.h; sourceTree = "<group>"; };
9ACE8C95ED09F41B08C4DF0B178B37EA /* objects.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = objects.h; path = Dependencies/OpenSSL/ios/include/openssl/objects.h; sourceTree = "<group>"; };
@@ -753,8 +774,8 @@
A65888B0E090B10E6170D43D8E1C0F6F /* STPrivilegedTask-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "STPrivilegedTask-Info.plist"; sourceTree = "<group>"; };
A6C7A3F8405342E0CFCF2C6C5F9B0A3D /* dh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = dh.h; path = Dependencies/OpenSSL/ios/include/openssl/dh.h; sourceTree = "<group>"; };
A6CB7BCDAD00CC9657632FA0DF9599EC /* ccdh_gp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdh_gp.h; path = Dependencies/corecrypto/ccdh_gp.h; sourceTree = "<group>"; };
A79744C0D952ADD34EC8CCD2D1501838 /* Pods-AltServer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltServer.release.xcconfig"; sourceTree = "<group>"; };
A8093B399024794431159E69E5C18C92 /* ccmode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccmode.h; path = Dependencies/corecrypto/ccmode.h; sourceTree = "<group>"; };
A82A21359DA7189002E88491D87FB6BE /* Pods-AltStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-AltStore.debug.xcconfig"; sourceTree = "<group>"; };
A8918968EFD5B0DD448B57256A730D5A /* RSTCellContentChange.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTCellContentChange.h; path = Roxas/RSTCellContentChange.h; sourceTree = "<group>"; };
AA460D4136BE705CF537D99DB76207FF /* ALTAnisetteData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTAnisetteData.h; sourceTree = "<group>"; };
AA7D8EE75A3FE7F4EB2ECBCABDA9330D /* ccchacha20poly1305_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccchacha20poly1305_priv.h; path = Dependencies/corecrypto/ccchacha20poly1305_priv.h; sourceTree = "<group>"; };
@@ -782,11 +803,11 @@
B831FF60290BCF3108FDBC1BD6525103 /* Dictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Dictionary.h; sourceTree = "<group>"; };
B87FE5286C1FD482F82C01FCB38DB158 /* ccrc4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrc4.h; path = Dependencies/corecrypto/ccrc4.h; sourceTree = "<group>"; };
B88B0C4661B00E43F453B1A81826157A /* STPrivilegedTask-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "STPrivilegedTask-umbrella.h"; sourceTree = "<group>"; };
B8B4E51528ACF4ED0E62FD2946936A77 /* Pods-AltServer-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltServer-frameworks.sh"; sourceTree = "<group>"; };
B9B1CEF2EED0B01E64AB78B582825997 /* ALTApplication.mm */ = {isa = PBXFileReference; includeInIndex = 1; path = ALTApplication.mm; sourceTree = "<group>"; };
B9C77F574EE4D8FCC56A32497585256D /* ccdh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdh.h; path = Dependencies/corecrypto/ccdh.h; sourceTree = "<group>"; };
BAF50E693DDCD83078B5CA7F1DA5D5B8 /* ALTAppleAPISession.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = ALTAppleAPISession.m; sourceTree = "<group>"; };
BB3E62EAAE23B1F6A4465CC181048F4E /* ALTApplication.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ALTApplication.h; sourceTree = "<group>"; };
BC6F74406EF976ECC3669BD38B0ECED4 /* Pods-AltServer-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltServer-frameworks.sh"; sourceTree = "<group>"; };
BD03248F0F2BB2C459A7CC45CDF38647 /* RSTHasher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTHasher.m; path = Roxas/RSTHasher.m; sourceTree = "<group>"; };
BE3254B479A7B3EC6F741494E430EA42 /* ioapi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ioapi.h; path = Dependencies/minizip/ioapi.h; sourceTree = "<group>"; };
BE86423754DE6F326E05DA81C8610E5B /* ccrsa_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccrsa_priv.h; path = Dependencies/corecrypto/ccrsa_priv.h; sourceTree = "<group>"; };
@@ -794,7 +815,6 @@
BEFC63944685F87ABCA6731E33ECA843 /* RSTSeparatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTSeparatorView.h; path = Roxas/RSTSeparatorView.h; sourceTree = "<group>"; };
BF327FF6D10BE735B3541D8135486FAC /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = "<group>"; };
BFC87DA394F783CD7D6834276283DE6F /* ImageRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageRequest.swift; path = Sources/ImageRequest.swift; sourceTree = "<group>"; };
C0D26B225AB108A39AD161E5C626DFCA /* Pods-AltStore-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-AltStore-resources.sh"; sourceTree = "<group>"; };
C1E18A24C4A563BC4DDCA5EF6254C778 /* mztools.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mztools.h; path = Dependencies/minizip/mztools.h; sourceTree = "<group>"; };
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 = "<group>"; };
C208E8E78D20910EAC3E2EF269C195EC /* SUAppcastItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUAppcastItem.h; path = Sparkle.framework/Versions/A/Headers/SUAppcastItem.h; sourceTree = "<group>"; };
@@ -804,11 +824,13 @@
C4F3A4BFDFD12AB4EB01F4BCA312A94D /* crypt.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = crypt.h; path = Dependencies/minizip/crypt.h; sourceTree = "<group>"; };
C50FB407DB2A72F5D827B19042A714F8 /* rc4.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = rc4.h; path = Dependencies/OpenSSL/ios/include/openssl/rc4.h; sourceTree = "<group>"; };
C556A67CD97EE39683D31C0B9F0918EB /* ccn.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccn.h; path = Dependencies/corecrypto/ccn.h; sourceTree = "<group>"; };
C63B22556372BD6A596092190AC874E3 /* Pods-AltServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltServer-dummy.m"; sourceTree = "<group>"; };
C65850A307D6D5D8B9CBB2C7795093CC /* ccdrbg_factory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdrbg_factory.h; path = Dependencies/corecrypto/ccdrbg_factory.h; sourceTree = "<group>"; };
C72FC0FB6B8986A4FB1980229B73DDEE /* mztools.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mztools.c; path = Dependencies/minizip/mztools.c; sourceTree = "<group>"; };
C7C523F13B0698E9E1E0C8BC56663CDD /* RSTCellContentDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTCellContentDataSource.m; path = Roxas/RSTCellContentDataSource.m; sourceTree = "<group>"; };
C8158E0DE7EA9639894587255DB9F03C /* fipspost.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fipspost.h; path = Dependencies/corecrypto/fipspost.h; sourceTree = "<group>"; };
C906AF9E4AF1DA84489A450180EE84AE /* node.c */ = {isa = PBXFileReference; includeInIndex = 1; path = node.c; sourceTree = "<group>"; };
C9132C40CB4837DADEB046E727F867FB /* Pods-AltStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStore-dummy.m"; sourceTree = "<group>"; };
CA894C38E3874FEC9FCD1A4BC67184F7 /* RSTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTError.h; path = Roxas/RSTError.h; sourceTree = "<group>"; };
CB4FFC20503BA7993FDFB654063591EC /* cchkdf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cchkdf.h; path = Dependencies/corecrypto/cchkdf.h; sourceTree = "<group>"; };
CB732A4A4314642DEF76FAB814B59DF8 /* SUUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SUUpdater.h; path = Sparkle.framework/Versions/A/Headers/SUUpdater.h; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
E58E9ACAA603F0479C9159E248BDD542 /* bio.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = bio.h; path = Dependencies/OpenSSL/ios/include/openssl/bio.h; sourceTree = "<group>"; };
E6064D2203D88A9ACE189177C3722660 /* NSPredicate+Search.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSPredicate+Search.h"; path = "Roxas/NSPredicate+Search.h"; sourceTree = "<group>"; };
E6C49955A91A9BF96052D43477EE8A79 /* Pods-AltServer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-AltServer-umbrella.h"; sourceTree = "<group>"; };
E7223D60AEAF953DAF7871518753EBB9 /* RSTPersistentContainer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTPersistentContainer.m; path = Roxas/RSTPersistentContainer.m; sourceTree = "<group>"; };
E7709D93E2CB7C73F6D5FA5E3032EAC6 /* AltSign.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = AltSign.podspec; sourceTree = "<group>"; 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 = "<group>"; };
E8196FCC04FA21317C838435B5F4FCA1 /* RSTTintedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTTintedImageView.h; path = Roxas/RSTTintedImageView.h; sourceTree = "<group>"; };
E8434827ABB58D1C0275F5BDE3717F16 /* Pods-AltServer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltServer-dummy.m"; sourceTree = "<group>"; };
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 = "<group>"; };
E9AB7E00EF57815340C28751AFAD3798 /* ptrarray.c */ = {isa = PBXFileReference; includeInIndex = 1; path = ptrarray.c; sourceTree = "<group>"; };
EA706258C6F1B1F2B19EF8197E8F4349 /* unzip.c */ = {isa = PBXFileReference; includeInIndex = 1; name = unzip.c; path = Dependencies/minizip/unzip.c; sourceTree = "<group>"; };
EB20FCA19FFC2313BFF8BBE3AA934288 /* RSTSearchController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RSTSearchController.h; path = Roxas/RSTSearchController.h; sourceTree = "<group>"; };
EB343A74480E905489EFD2CBA6F6339E /* ImagePipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePipeline.swift; path = Sources/ImagePipeline.swift; sourceTree = "<group>"; };
EC9F77AC7ECBA94225DE401B6A8004F2 /* Pods-AltStore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-AltStore-dummy.m"; sourceTree = "<group>"; };
ECB70FB9A0943AD3C24308D934E452AC /* ImageTaskMetrics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTaskMetrics.swift; path = Sources/ImageTaskMetrics.swift; sourceTree = "<group>"; };
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 = "<group>"; };
@@ -869,6 +890,7 @@
F255B45E106FBFFFBF10D506992EC655 /* RSTDynamicDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTDynamicDataSource.m; path = Roxas/RSTDynamicDataSource.m; sourceTree = "<group>"; };
F2CF961D1535400D1D9228FD823EE7D9 /* Real.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Real.h; sourceTree = "<group>"; };
F35FA9FBDE25A463886F53B66B39A748 /* NSError+ALTErrors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSError+ALTErrors.h"; sourceTree = "<group>"; };
F36150F4B2D5DD35C5AE24D34254DD5B /* Pods-AltServer-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltServer-acknowledgements.plist"; sourceTree = "<group>"; };
F3A77F6E48BAFA480142E4AA3CD6A301 /* UITableViewCell+CellContent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+CellContent.m"; path = "Roxas/UITableViewCell+CellContent.m"; sourceTree = "<group>"; };
F41304FE31EBAE0769092641DA09FD04 /* ccz_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccz_priv.h; path = Dependencies/corecrypto/ccz_priv.h; sourceTree = "<group>"; };
F456D30A7BC124649CB25DFC1B8C8D83 /* Sparkle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Sparkle.h; path = Sparkle.framework/Versions/A/Headers/Sparkle.h; sourceTree = "<group>"; };
@@ -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 = "<group>"; };
FA30F634D3EEACD6C9E258E0551D357A /* STPrivilegedTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = STPrivilegedTask.h; sourceTree = "<group>"; };
FA31890BE5D6782EE2C66D17C3FA5F73 /* RSTOperationQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RSTOperationQueue.m; path = Roxas/RSTOperationQueue.m; sourceTree = "<group>"; };
FAED4B69775DE96F8861BCA8BF35E38B /* Pods-AltStore-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-AltStore-acknowledgements.plist"; sourceTree = "<group>"; };
FAFA796C2028D51219FED104E02BBA2E /* ldid.cpp */ = {isa = PBXFileReference; includeInIndex = 1; path = ldid.cpp; sourceTree = "<group>"; };
FB0B4256965EEBCC93E6D0A895696520 /* ccdigest_priv.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccdigest_priv.h; path = Dependencies/corecrypto/ccdigest_priv.h; sourceTree = "<group>"; };
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 = "<group>"; };
FC422EC5FAE52EEE9570A6C6CD463B9C /* UICollectionViewCell+Nibs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionViewCell+Nibs.h"; path = "Roxas/UICollectionViewCell+Nibs.h"; sourceTree = "<group>"; };
FC9139A28E7A28DDB6875A26A978DCBB /* UIKit+ActivityIndicating.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIKit+ActivityIndicating.m"; path = "Roxas/UIKit+ActivityIndicating.m"; sourceTree = "<group>"; };
FCEACD7381B4CD496C8776BA4B4DDECD /* cccast.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = cccast.h; path = Dependencies/corecrypto/cccast.h; sourceTree = "<group>"; };
FD54352444A7AFFFB59DA62203AF58BE /* Pods-AltStore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-AltStore.modulemap"; sourceTree = "<group>"; };
FDBED95D85CFE5DE2E1A73C8BDE40AF8 /* node_list.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = node_list.h; sourceTree = "<group>"; };
FE3B0942ABD1EF218327EAFDB5930E8F /* ccz.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ccz.h; path = Dependencies/corecrypto/ccz.h; sourceTree = "<group>"; };
FF6A87F5B921A4731A72BAA58BC686B5 /* KeychainAccess-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KeychainAccess-umbrella.h"; sourceTree = "<group>"; };
@@ -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 = "<group>";
};
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 = "<group>";
};
27C9B3764A8EC89602B2168BCD3B0541 /* Nuke */ = {
isa = PBXGroup;
children = (
@@ -1056,22 +1099,6 @@
path = AltSign/Model;
sourceTree = "<group>";
};
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 = "<group>";
};
2ADBE40AD4FBCECB7EC3654624D470B5 /* src */ = {
isa = PBXGroup;
children = (
@@ -1100,6 +1127,31 @@
path = Dependencies/ldid/libplist/src;
sourceTree = "<group>";
};
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 = "<group>";
};
30C5E295E48CEDE7497C55DE64DBC687 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
21B07EE04CFA7F279AE8450F26AA35AD /* Pods-AltDaemon */,
7F5AD92236E83BA3EB39205EBAB8A9B8 /* Pods-AltServer */,
843530E93DA12B817029E9018B03DD06 /* Pods-AltStore */,
);
name = "Targets Support Files";
sourceTree = "<group>";
};
3598F2B00D4321009D713747EEC1E46B /* Capabilities */ = {
isa = PBXGroup;
children = (
@@ -1178,20 +1230,6 @@
path = "../Target Support Files/Sparkle";
sourceTree = "<group>";
};
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 = "<group>";
};
509C180E6A90B89D30B2070FD2CB5026 /* include */ = {
isa = PBXGroup;
children = (
@@ -1407,6 +1445,39 @@
path = AltSign/Categories;
sourceTree = "<group>";
};
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 = "<group>";
};
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 = "<group>";
};
9307E5FFD57ACBE2597611F16A6139DA /* Frameworks */ = {
isa = PBXGroup;
children = (
@@ -1423,32 +1494,6 @@
name = Frameworks;
sourceTree = "<group>";
};
A25CEE5A93D9C8F43DE9AB2C39CEE220 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
A623B766890FCB34E7F40129A4502B63 /* Pods-AltServer */,
29BB281BA7D464B1749908A7D7B87093 /* Pods-AltStore */,
);
name = "Targets Support Files";
sourceTree = "<group>";
};
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 = "<group>";
};
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 = "<group>";
};
@@ -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 = (

View File

@@ -0,0 +1,3 @@
# Acknowledgements
This application makes use of the following third party libraries:
Generated by CocoaPods - https://cocoapods.org

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>FooterText</key>
<string>This application makes use of the following third party libraries:</string>
<key>Title</key>
<string>Acknowledgements</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string>
<key>Title</key>
<string></string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
</array>
<key>StringsTable</key>
<string>Acknowledgements</string>
<key>Title</key>
<string>Acknowledgements</string>
</dict>
</plist>

View File

@@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_Pods_AltDaemon : NSObject
@end
@implementation PodsDummy_Pods_AltDaemon
@end

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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