Implement emotional damage (#95)

* Implement em_proxy

* Update libimobiledevice

* Add minimuxer library to Xcode

* Build missing C files for libimobiledevice

* Remove objective C library

* Add pairing file to Info.plist

* Heartbeat self on startup

* Enable JIT on-device

* Implement on-device installation

* Fix OpenSSL header errors

* Random submodule bullcrap go

* Search release folder for emotional damage

* Clean dependencies

* Build Rust dependencies attempt 1/999

* Update em_proxy

* Implement refreshing apps

* Clean up old operations

* Remove all AltServer code

* Remove files from Xcode project

* Implement auto mounting the developer DMG

* Recover from app being backgrounded

* Fixed keeping pairing file in app after updating SideStore (#3)

* Use compliant error handling for minimuxer

* Fix app failing to install

* Don't kill proxy on backgrounding

* Makes sure the ALTPairingFile gets transferred even if team IDs change (#4)

* Step 1 to allow SideStore to resign itself

* Update ResignAppOperation.swift

* Adding cache for action runner (#5)

* Start caching commit for actions

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Update build.yml

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Update build.yml

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Use rust lib directories to cache

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Cache cargo also

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Fix spacing

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Replace cargo id for caching

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Remove cache if statements

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>

* Add disconnected WireGuard detection

* Add minimuxer logging

Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
Co-authored-by: jawshoeadan <62785552+jawshoeadan@users.noreply.github.com>
Co-authored-by: Joelle Stickney <joellestickney@gmail.com>
Co-authored-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
This commit is contained in:
Jackson Coxson
2022-11-02 17:58:59 -07:00
committed by GitHub
parent fc3f83231c
commit dd66355488
34 changed files with 811 additions and 1175 deletions

View File

@@ -8,13 +8,13 @@
import UIKit
import Combine
import minimuxer
import AltStoreCore
@available(iOS 14, *)
protocol EnableJITContext
{
var server: Server? { get }
var installedApp: InstalledApp? { get }
var error: Error? { get }
@@ -42,95 +42,26 @@ class EnableJITOperation<Context: EnableJITContext>: ResultOperation<Void>
return
}
guard let server = self.context.server, let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) }
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { return self.finish(.failure(OperationError.unknownUDID)) }
guard let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) }
installedApp.managedObjectContext?.perform {
guard let bundle = Bundle(url: installedApp.fileURL),
let processName = bundle.executableURL?.lastPathComponent
else { return self.finish(.failure(OperationError.invalidApp)) }
let appName = installedApp.name
let openAppURL = installedApp.openAppURL
ServerManager.shared.connect(to: server) { result in
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success(let connection):
print("Sending enable JIT request...")
DispatchQueue.main.async {
let v = minimuxer_to_operation(code: 1)
// Launch app to make sure it is running in foreground.
UIApplication.shared.open(openAppURL) { success in
guard success else { return self.finish(.failure(OperationError.openAppFailed(name: appName))) }
// Combine immediately finishes if an error is thrown, but we want to wait at least until app enters background.
// As a workaround, we set error type to Never and use Result<Void, Error> as the value type instead.
let result = Future<Result<Void, Error>, Never> { promise in
let request = EnableUnsignedCodeExecutionRequest(udid: udid, processName: processName)
connection.send(request) { result in
print("Sent enable JIT request!")
switch result
{
case .failure(let error): promise(.success(.failure(error)))
case .success:
print("Waiting for enable JIT response...")
connection.receiveResponse() { result in
print("Received enable JIT response:", result)
switch result
{
case .failure(let error): promise(.success(.failure(error)))
case .success(.error(let response)): promise(.success(.failure(response.error)))
case .success(.enableUnsignedCodeExecution): promise(.success(.success(())))
case .success: promise(.success(.failure(ALTServerError(.unknownResponse))))
}
}
}
}
}
//TODO: Handle case where app does not enter background (e.g. iPad multitasking).
self.cancellable = result
.combineLatest(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification, object: nil))
.first()
.receive(on: DispatchQueue.main)
.sink { (result, _) in
let content = UNMutableNotificationContent()
switch result
{
case .failure(let error):
content.title = String(format: NSLocalizedString("Could not enable JIT for %@", comment: ""), appName)
content.body = error.localizedDescription
UIDevice.current.vibrate(pattern: .error)
case .success:
content.title = String(format: NSLocalizedString("Enabled JIT for %@", comment: ""), appName)
content.body = String(format: NSLocalizedString("JIT will remain enabled until you quit the app.", comment: ""))
UIDevice.current.vibrate(pattern: .success)
}
if UIApplication.shared.applicationState == .background
{
// For some reason, notification won't show up reliably unless we provide a trigger (as of iOS 15).
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false)
let request = UNNotificationRequest(identifier: AppManager.enableJITResultNotificationID, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
}
self.finish(result)
}
}
}
do {
var x = try debug_app(app_id: installedApp.resignedBundleIdentifier)
switch x {
case .Good:
self.finish(.success(()))
case .Bad(let code):
self.finish(.failure(minimuxer_to_operation(code: code)))
}
} catch Uhoh.Bad(let code) {
self.finish(.failure(minimuxer_to_operation(code: code)))
} catch {
self.finish(.failure(OperationError.unknown))
}
}
}
}