2020-06-04 19:48:02 -07:00
|
|
|
//
|
2020-09-22 15:11:42 -07:00
|
|
|
// DaemonRequestHandler.swift
|
|
|
|
|
// AltDaemon
|
2020-06-04 19:48:02 -07:00
|
|
|
//
|
|
|
|
|
// Created by Riley Testut on 6/1/20.
|
|
|
|
|
// Copyright © 2019 Riley Testut. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import Foundation
|
2023-03-01 13:15:22 -05:00
|
|
|
import Shared
|
|
|
|
|
import SideKit
|
2023-03-02 00:40:11 -05:00
|
|
|
import os.log
|
2020-06-04 19:48:02 -07:00
|
|
|
|
2020-08-31 13:58:44 -07:00
|
|
|
typealias DaemonConnectionManager = ConnectionManager<DaemonRequestHandler>
|
2020-06-04 19:48:02 -07:00
|
|
|
|
2020-08-31 13:58:44 -07:00
|
|
|
private let connectionManager = ConnectionManager(requestHandler: DaemonRequestHandler(),
|
2020-09-22 15:11:42 -07:00
|
|
|
connectionHandlers: [XPCConnectionHandler()])
|
2020-06-04 19:48:02 -07:00
|
|
|
|
2023-03-01 00:48:36 -05:00
|
|
|
extension DaemonConnectionManager {
|
2020-06-04 19:48:02 -07:00
|
|
|
static var shared: ConnectionManager {
|
2023-03-01 00:48:36 -05:00
|
|
|
connectionManager
|
2020-06-04 19:48:02 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-01 00:48:36 -05:00
|
|
|
struct DaemonRequestHandler: RequestHandler {
|
|
|
|
|
func handleAnisetteDataRequest(_: AnisetteDataRequest, for _: Connection, completionHandler: @escaping (Result<AnisetteDataResponse, Error>) -> Void) {
|
|
|
|
|
do {
|
2020-06-04 19:48:02 -07:00
|
|
|
let anisetteData = try AnisetteDataManager.shared.requestAnisetteData()
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-04 19:48:02 -07:00
|
|
|
let response = AnisetteDataResponse(anisetteData: anisetteData)
|
|
|
|
|
completionHandler(.success(response))
|
2023-03-01 00:48:36 -05:00
|
|
|
} catch {
|
2020-06-04 19:48:02 -07:00
|
|
|
completionHandler(.failure(error))
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
func handlePrepareAppRequest(_ request: PrepareAppRequest, for connection: Connection, completionHandler: @escaping (Result<InstallationProgressResponse, Error>) -> Void) {
|
2020-06-04 19:48:02 -07:00
|
|
|
guard let fileURL = request.fileURL else { return completionHandler(.failure(ALTServerError(.invalidRequest))) }
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-04 19:48:02 -07:00
|
|
|
print("Awaiting begin installation request...")
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
connection.receiveRequest { result in
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Received begin installation request with result: %@", type: .info , String(describing: result))
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
guard case let .beginInstallation(request) = try result.get() else { throw ALTServerError(.unknownRequest) }
|
2020-06-04 19:48:02 -07:00
|
|
|
guard let bundleIdentifier = request.bundleIdentifier else { throw ALTServerError(.invalidRequest) }
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
AppManager.shared.installApp(at: fileURL, bundleIdentifier: bundleIdentifier, activeProfiles: request.activeProfiles) { result in
|
2020-06-05 14:35:05 -07:00
|
|
|
let result = result.map { InstallationProgressResponse(progress: 1.0) }
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Installed app with result: %@", type: .info, String(describing: result))
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
completionHandler(result)
|
|
|
|
|
}
|
2023-03-01 00:48:36 -05:00
|
|
|
} catch {
|
2020-06-04 19:48:02 -07:00
|
|
|
completionHandler(.failure(error))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
func handleInstallProvisioningProfilesRequest(_ request: InstallProvisioningProfilesRequest, for _: Connection,
|
|
|
|
|
completionHandler: @escaping (Result<InstallProvisioningProfilesResponse, Error>) -> Void) {
|
|
|
|
|
AppManager.shared.install(request.provisioningProfiles, activeProfiles: request.activeProfiles) { result in
|
|
|
|
|
switch result {
|
|
|
|
|
case let .failure(error):
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Failed to install profiles %@ : %@", type: .error , request.provisioningProfiles.map { $0.bundleIdentifier }.joined(separator: "\n"), error.localizedDescription)
|
2020-06-05 14:35:05 -07:00
|
|
|
completionHandler(.failure(error))
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
case .success:
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Installed profiles: %@", type: .info , request.provisioningProfiles.map { $0.bundleIdentifier }.joined(separator: "\n"))
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
let response = InstallProvisioningProfilesResponse()
|
|
|
|
|
completionHandler(.success(response))
|
|
|
|
|
}
|
2020-06-04 19:48:02 -07:00
|
|
|
}
|
|
|
|
|
}
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
func handleRemoveProvisioningProfilesRequest(_ request: RemoveProvisioningProfilesRequest, for _: Connection,
|
|
|
|
|
completionHandler: @escaping (Result<RemoveProvisioningProfilesResponse, Error>) -> Void) {
|
|
|
|
|
AppManager.shared.removeProvisioningProfiles(forBundleIdentifiers: request.bundleIdentifiers) { result in
|
|
|
|
|
switch result {
|
|
|
|
|
case let .failure(error):
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Failed to remove profiles %@ : %@", type: .error, request.bundleIdentifiers, error.localizedDescription)
|
2020-06-05 14:35:05 -07:00
|
|
|
completionHandler(.failure(error))
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
case .success:
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Removed profiles: %@", type: .info , request.bundleIdentifiers)
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
let response = RemoveProvisioningProfilesResponse()
|
|
|
|
|
completionHandler(.success(response))
|
|
|
|
|
}
|
2020-06-04 19:48:02 -07:00
|
|
|
}
|
|
|
|
|
}
|
2023-03-01 00:48:36 -05:00
|
|
|
|
|
|
|
|
func handleRemoveAppRequest(_ request: RemoveAppRequest, for _: Connection, completionHandler: @escaping (Result<RemoveAppResponse, Error>) -> Void) {
|
|
|
|
|
AppManager.shared.removeApp(forBundleIdentifier: request.bundleIdentifier) { result in
|
|
|
|
|
switch result {
|
|
|
|
|
case let .failure(error):
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Failed to remove app %@ : %@", type: .error , request.bundleIdentifier, error.localizedDescription)
|
2020-06-05 14:35:05 -07:00
|
|
|
completionHandler(.failure(error))
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
case .success:
|
2023-03-02 00:40:11 -05:00
|
|
|
os_log("Removed app: %@", type: .info , request.bundleIdentifier)
|
2023-03-01 00:48:36 -05:00
|
|
|
|
2020-06-05 14:35:05 -07:00
|
|
|
let response = RemoveAppResponse()
|
|
|
|
|
completionHandler(.success(response))
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-06-04 19:48:02 -07:00
|
|
|
}
|
|
|
|
|
}
|