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

@@ -22,8 +22,58 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
with: with:
submodules: recursive submodules: recursive
- name: Cache rust cargo
id: cache-rust-cargo
uses: actions/cache@v3
env:
cache-name: cache-rust-cargo
with:
path: ~/.cargo
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Cache rust minimuxer
id: cache-rust-minimuxer
uses: actions/cache@v3
env:
cache-name: cache-rust-minimuxer
with:
path: ./Dependencies/minimuxer/target
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Cache rust em_proxy
id: cache-rust-em_proxy
uses: actions/cache@v3
env:
cache-name: cache-rust-em_proxy
with:
path: ./Dependencies/em_proxy/target
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install dependencies - name: Install dependencies
run: brew install ldid run: brew install ldid
- name: Install rustup
uses: actions-rs/toolchain@v1
with:
toolchain: stable
override: true
target: aarch64-apple-ios
- name: Create emotional damage
run: cd Dependencies/em_proxy && cargo build --release --target aarch64-apple-ios
- name: Build minimuxer
run: cd Dependencies/minimuxer && cargo build --release --target aarch64-apple-ios
- name: Setup Xcode - name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1.4.1 uses: maxim-lobanov/setup-xcode@v1.4.1
with: with:

11
.gitmodules vendored
View File

@@ -3,7 +3,7 @@
url = https://github.com/rileytestut/Roxas.git url = https://github.com/rileytestut/Roxas.git
[submodule "Dependencies/libimobiledevice"] [submodule "Dependencies/libimobiledevice"]
path = Dependencies/libimobiledevice path = Dependencies/libimobiledevice
url = https://github.com/SideStore/libimobiledevice.git url = https://github.com/libimobiledevice/libimobiledevice
[submodule "Dependencies/libusbmuxd"] [submodule "Dependencies/libusbmuxd"]
path = Dependencies/libusbmuxd path = Dependencies/libusbmuxd
url = https://github.com/libimobiledevice/libusbmuxd.git url = https://github.com/libimobiledevice/libusbmuxd.git
@@ -13,3 +13,12 @@
[submodule "Dependencies/MarkdownAttributedString"] [submodule "Dependencies/MarkdownAttributedString"]
path = Dependencies/MarkdownAttributedString path = Dependencies/MarkdownAttributedString
url = https://github.com/chockenberry/MarkdownAttributedString.git url = https://github.com/chockenberry/MarkdownAttributedString.git
[submodule "Dependencies/em_proxy"]
path = Dependencies/em_proxy
url = https://github.com/jkcoxson/em_proxy
[submodule "Dependencies/libimobiledevice-glue"]
path = Dependencies/libimobiledevice-glue
url = https://github.com/libimobiledevice/libimobiledevice-glue
[submodule "Dependencies/minimuxer"]
path = Dependencies/minimuxer
url = https://github.com/jkcoxson/minimuxer

View File

@@ -7,6 +7,28 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
19104D952909BAEA00C49C7B /* libimobiledevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF45872B2298D31600BD7491 /* libimobiledevice.a */; };
19104DB52909C06D00C49C7B /* EmotionalDamage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19104DB42909C06D00C49C7B /* EmotionalDamage.swift */; };
19104DBB2909C11700C49C7B /* libem_proxy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19104DA32909BC1000C49C7B /* libem_proxy.a */; };
19104DBC2909C4E500C49C7B /* libEmotionalDamage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19104DB22909C06C00C49C7B /* libEmotionalDamage.a */; };
191E5FAE290A5D92001A3B7C /* minimuxer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191E5FAD290A5D92001A3B7C /* minimuxer.swift */; };
191E5FB4290A5DA0001A3B7C /* libminimuxer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */; };
191E5FB6290A5E1F001A3B7C /* libminimuxer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 191E5FB5290A5E1F001A3B7C /* libminimuxer.a */; };
191E5FDC290AFA5C001A3B7C /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 191E5FDB290AFA5C001A3B7C /* OpenSSL */; };
191E6066290B2DB1001A3B7C /* cbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E605E290B2D6B001A3B7C /* cbuf.c */; };
191E6067290B2DB3001A3B7C /* collection.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6060290B2D6B001A3B7C /* collection.c */; };
191E6068290B2DB5001A3B7C /* glue.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E605D290B2D6B001A3B7C /* glue.c */; };
191E6069290B2DB7001A3B7C /* opack.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6061290B2D6B001A3B7C /* opack.c */; };
191E606A290B2DC4001A3B7C /* socket.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6064290B2D6B001A3B7C /* socket.c */; };
191E606B290B2DC6001A3B7C /* termcolors.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6065290B2D6B001A3B7C /* termcolors.c */; };
191E606C290B2DC8001A3B7C /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6063290B2D6B001A3B7C /* thread.c */; };
191E606D290B2DCA001A3B7C /* tlv.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6062290B2D6B001A3B7C /* tlv.c */; };
191E606E290B2DCB001A3B7C /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E605F290B2D6B001A3B7C /* utils.c */; };
191E6075290B2E46001A3B7C /* companion_proxy.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6073290B2E02001A3B7C /* companion_proxy.c */; };
191E6076290B2E48001A3B7C /* preboard.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E6074290B2E02001A3B7C /* preboard.c */; };
191E607D290B2EA5001A3B7C /* jsmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E5FD0290A651D001A3B7C /* jsmn.c */; };
191E607E290B2EA7001A3B7C /* jplist.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E5FCF290A651D001A3B7C /* jplist.c */; };
191E6087290C7B50001A3B7C /* libminimuxer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 191E5FB5290A5E1F001A3B7C /* libminimuxer.a */; };
19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */; }; 19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */; };
4879A95F2861046500FC1BBD /* AltSign in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A95E2861046500FC1BBD /* AltSign */; }; 4879A95F2861046500FC1BBD /* AltSign in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A95E2861046500FC1BBD /* AltSign */; };
4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A9612861049C00FC1BBD /* OpenSSL */; }; 4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A9612861049C00FC1BBD /* OpenSSL */; };
@@ -106,16 +128,11 @@
BF4588342298D3C100BD7491 /* userpref.h in Headers */ = {isa = PBXBuildFile; fileRef = BF45882A2298D3C000BD7491 /* userpref.h */; }; BF4588342298D3C100BD7491 /* userpref.h in Headers */ = {isa = PBXBuildFile; fileRef = BF45882A2298D3C000BD7491 /* userpref.h */; };
BF4588352298D3C100BD7491 /* userpref.c in Sources */ = {isa = PBXBuildFile; fileRef = BF45882B2298D3C000BD7491 /* userpref.c */; }; BF4588352298D3C100BD7491 /* userpref.c in Sources */ = {isa = PBXBuildFile; fileRef = BF45882B2298D3C000BD7491 /* userpref.c */; };
BF4588362298D3C100BD7491 /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = BF45882C2298D3C000BD7491 /* debug.h */; }; BF4588362298D3C100BD7491 /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = BF45882C2298D3C000BD7491 /* debug.h */; };
BF4588372298D3C100BD7491 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = BF45882D2298D3C000BD7491 /* utils.c */; };
BF4588392298D3C100BD7491 /* socket.c in Sources */ = {isa = PBXBuildFile; fileRef = BF45882F2298D3C000BD7491 /* socket.c */; };
BF45883A2298D3C100BD7491 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = BF4588302298D3C000BD7491 /* debug.c */; }; BF45883A2298D3C100BD7491 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = BF4588302298D3C000BD7491 /* debug.c */; };
BF45883C2298D3C100BD7491 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4588322298D3C100BD7491 /* utils.h */; }; BF45883C2298D3C100BD7491 /* utils.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4588322298D3C100BD7491 /* utils.h */; };
BF4588402298D3F800BD7491 /* collection.h in Headers */ = {isa = PBXBuildFile; fileRef = BF45883E2298D3F800BD7491 /* collection.h */; }; BF4588402298D3F800BD7491 /* collection.h in Headers */ = {isa = PBXBuildFile; fileRef = BF45883E2298D3F800BD7491 /* collection.h */; };
BF4588412298D3F800BD7491 /* collection.c in Sources */ = {isa = PBXBuildFile; fileRef = BF45883F2298D3F800BD7491 /* collection.c */; };
BF4588432298D40000BD7491 /* libusbmuxd.c in Sources */ = {isa = PBXBuildFile; fileRef = BF4588422298D40000BD7491 /* libusbmuxd.c */; }; BF4588432298D40000BD7491 /* libusbmuxd.c in Sources */ = {isa = PBXBuildFile; fileRef = BF4588422298D40000BD7491 /* libusbmuxd.c */; };
BF4588472298D4B000BD7491 /* libimobiledevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF45872B2298D31600BD7491 /* libimobiledevice.a */; }; BF4588472298D4B000BD7491 /* libimobiledevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF45872B2298D31600BD7491 /* libimobiledevice.a */; };
BF45884A2298D55000BD7491 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = BF4588482298D55000BD7491 /* thread.c */; };
BF45884B2298D55000BD7491 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4588492298D55000BD7491 /* thread.h */; };
BF4588882298DD3F00BD7491 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF4588872298DD3F00BD7491 /* libxml2.tbd */; }; BF4588882298DD3F00BD7491 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF4588872298DD3F00BD7491 /* libxml2.tbd */; };
BF4B78FE24B3D1DB008AB4AC /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF4B78FD24B3D1DB008AB4AC /* SceneDelegate.swift */; }; BF4B78FE24B3D1DB008AB4AC /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF4B78FD24B3D1DB008AB4AC /* SceneDelegate.swift */; };
BF541C0B25E5A5FA00CD46B2 /* FileManager+URLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF541C0A25E5A5FA00CD46B2 /* FileManager+URLs.swift */; }; BF541C0B25E5A5FA00CD46B2 /* FileManager+URLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF541C0A25E5A5FA00CD46B2 /* FileManager+URLs.swift */; };
@@ -184,7 +201,6 @@
BF74989B23621C0700CED65F /* ForwardingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF74989A23621C0700CED65F /* ForwardingNavigationController.swift */; }; BF74989B23621C0700CED65F /* ForwardingNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF74989A23621C0700CED65F /* ForwardingNavigationController.swift */; };
BF770E5122BB1CF6002A40FE /* InstallAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5022BB1CF6002A40FE /* InstallAppOperation.swift */; }; BF770E5122BB1CF6002A40FE /* InstallAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5022BB1CF6002A40FE /* InstallAppOperation.swift */; };
BF770E5422BC044E002A40FE /* OperationContexts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5322BC044E002A40FE /* OperationContexts.swift */; }; BF770E5422BC044E002A40FE /* OperationContexts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5322BC044E002A40FE /* OperationContexts.swift */; };
BF770E5622BC3C03002A40FE /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5522BC3C02002A40FE /* Server.swift */; };
BF770E5822BC3D0F002A40FE /* RefreshGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */; }; BF770E5822BC3D0F002A40FE /* RefreshGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */; };
BF770E6722BD57C4002A40FE /* BackgroundTaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E6622BD57C3002A40FE /* BackgroundTaskManager.swift */; }; BF770E6722BD57C4002A40FE /* BackgroundTaskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF770E6622BD57C3002A40FE /* BackgroundTaskManager.swift */; };
BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */ = {isa = PBXBuildFile; fileRef = BF770E6822BD57DD002A40FE /* Silence.m4a */; }; BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */ = {isa = PBXBuildFile; fileRef = BF770E6822BD57DD002A40FE /* Silence.m4a */; };
@@ -210,7 +226,6 @@
BF9ABA4922DD0742008935CF /* ScreenshotCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */; }; BF9ABA4922DD0742008935CF /* ScreenshotCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */; };
BF9ABA4B22DD1380008935CF /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4A22DD137F008935CF /* NavigationBar.swift */; }; BF9ABA4B22DD1380008935CF /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4A22DD137F008935CF /* NavigationBar.swift */; };
BF9ABA4D22DD16DE008935CF /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4C22DD16DE008935CF /* PillButton.swift */; }; BF9ABA4D22DD16DE008935CF /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4C22DD16DE008935CF /* PillButton.swift */; };
BFA8172923C56042001B5953 /* ServerConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172823C56042001B5953 /* ServerConnection.swift */; };
BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */; }; BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */; };
BFAD678E25E0649500D4C4D1 /* ALTDebugConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = BFAD678D25E0649500D4C4D1 /* ALTDebugConnection.mm */; }; BFAD678E25E0649500D4C4D1 /* ALTDebugConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = BFAD678D25E0649500D4C4D1 /* ALTDebugConnection.mm */; };
BFAD67A325E0854500D4C4D1 /* DeveloperDiskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFAD67A225E0854500D4C4D1 /* DeveloperDiskManager.swift */; }; BFAD67A325E0854500D4C4D1 /* DeveloperDiskManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFAD67A225E0854500D4C4D1 /* DeveloperDiskManager.swift */; };
@@ -229,7 +244,6 @@
BFAECC5E2501B0BF00528F27 /* CFNotificationName+AltStore.h in Headers */ = {isa = PBXBuildFile; fileRef = BF718BC723C919CC00A89F2D /* CFNotificationName+AltStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFAECC5E2501B0BF00528F27 /* CFNotificationName+AltStore.h in Headers */ = {isa = PBXBuildFile; fileRef = BF718BC723C919CC00A89F2D /* CFNotificationName+AltStore.h */; settings = {ATTRIBUTES = (Public, ); }; };
BFAECC5F2501B0BF00528F27 /* ALTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFAECC5F2501B0BF00528F27 /* ALTConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
BFAECC602501B0BF00528F27 /* NSError+ALTServerError.h in Headers */ = {isa = PBXBuildFile; fileRef = BF1E314822A060F400370A3C /* NSError+ALTServerError.h */; settings = {ATTRIBUTES = (Public, ); }; }; BFAECC602501B0BF00528F27 /* NSError+ALTServerError.h in Headers */ = {isa = PBXBuildFile; fileRef = BF1E314822A060F400370A3C /* NSError+ALTServerError.h */; settings = {ATTRIBUTES = (Public, ); }; };
BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB364592325985F00CD0EB1 /* FindServerOperation.swift */; };
BFB39B5C252BC10E00D1BE50 /* Managed.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB39B5B252BC10E00D1BE50 /* Managed.swift */; }; BFB39B5C252BC10E00D1BE50 /* Managed.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB39B5B252BC10E00D1BE50 /* Managed.swift */; };
BFB4323F22DE852000B7F8BC /* UpdateCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */; }; BFB4323F22DE852000B7F8BC /* UpdateCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */; };
BFB49AAA23834CF900D542D9 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; }; BFB49AAA23834CF900D542D9 /* ALTAnisetteData.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */; };
@@ -257,7 +271,6 @@
BFD2477A2284B9A700981D42 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFD247782284B9A700981D42 /* LaunchScreen.storyboard */; }; BFD2477A2284B9A700981D42 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFD247782284B9A700981D42 /* LaunchScreen.storyboard */; };
BFD2478C2284C4C300981D42 /* AppIconImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2478B2284C4C300981D42 /* AppIconImageView.swift */; }; BFD2478C2284C4C300981D42 /* AppIconImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2478B2284C4C300981D42 /* AppIconImageView.swift */; };
BFD2478F2284C8F900981D42 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2478E2284C8F900981D42 /* Button.swift */; }; BFD2478F2284C8F900981D42 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2478E2284C8F900981D42 /* Button.swift */; };
BFD52BD422A0800A000B7ED1 /* ServerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BD322A0800A000B7ED1 /* ServerManager.swift */; };
BFD52C0122A1A9CB000B7ED1 /* ptrarray.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */; }; BFD52C0122A1A9CB000B7ED1 /* ptrarray.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */; };
BFD52C0222A1A9CB000B7ED1 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE622A1A9CA000B7ED1 /* base64.c */; }; BFD52C0222A1A9CB000B7ED1 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE622A1A9CA000B7ED1 /* base64.c */; };
BFD52C0322A1A9CB000B7ED1 /* hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE722A1A9CA000B7ED1 /* hashtable.c */; }; BFD52C0322A1A9CB000B7ED1 /* hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE722A1A9CA000B7ED1 /* hashtable.c */; };
@@ -368,6 +381,27 @@
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */ /* Begin PBXContainerItemProxy section */
19104D932909BADB00C49C7B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFD247622284B9A500981D42 /* Project object */;
proxyType = 1;
remoteGlobalIDString = BF45872A2298D31600BD7491;
remoteInfo = libimobiledevice;
};
19104DB92909C0F200C49C7B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFD247622284B9A500981D42 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 19104DB12909C06C00C49C7B;
remoteInfo = EmotionalDamage;
};
191E5FB2290A5D9B001A3B7C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFD247622284B9A500981D42 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 191E5FAA290A5D92001A3B7C;
remoteInfo = minimuxer;
};
B3146ECC284F580500BBC3FD /* PBXContainerItemProxy */ = { B3146ECC284F580500BBC3FD /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy; isa = PBXContainerItemProxy;
containerPortal = B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */; containerPortal = B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */;
@@ -427,6 +461,24 @@
/* End PBXContainerItemProxy section */ /* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
19104DB02909C06C00C49C7B /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "include/$(PRODUCT_NAME)";
dstSubfolderSpec = 16;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
191E5FA9290A5D92001A3B7C /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "include/$(PRODUCT_NAME)";
dstSubfolderSpec = 16;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
BF0201BC22C2EFA3000B93E4 /* Embed Frameworks */ = { BF0201BC22C2EFA3000B93E4 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -484,6 +536,28 @@
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
19104DA32909BC1000C49C7B /* libem_proxy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libem_proxy.a; path = "Dependencies/em_proxy/target/aarch64-apple-ios/debug/libem_proxy.a"; sourceTree = "<group>"; };
19104DA92909BC7100C49C7B /* em_proxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = em_proxy.h; sourceTree = "<group>"; };
19104DB22909C06C00C49C7B /* libEmotionalDamage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libEmotionalDamage.a; sourceTree = BUILT_PRODUCTS_DIR; };
19104DB42909C06D00C49C7B /* EmotionalDamage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmotionalDamage.swift; sourceTree = "<group>"; };
191E5FAB290A5D92001A3B7C /* libminimuxer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer.a; sourceTree = BUILT_PRODUCTS_DIR; };
191E5FAD290A5D92001A3B7C /* minimuxer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = minimuxer.swift; sourceTree = "<group>"; };
191E5FB5290A5E1F001A3B7C /* libminimuxer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libminimuxer.a; path = "Dependencies/minimuxer/target/aarch64-apple-ios/debug/libminimuxer.a"; sourceTree = "<group>"; };
191E5FCF290A651D001A3B7C /* jplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jplist.c; path = Dependencies/libplist/src/jplist.c; sourceTree = SOURCE_ROOT; };
191E5FD0290A651D001A3B7C /* jsmn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jsmn.c; path = Dependencies/libplist/src/jsmn.c; sourceTree = SOURCE_ROOT; };
191E5FD1290A651D001A3B7C /* jsmn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jsmn.h; path = Dependencies/libplist/src/jsmn.h; sourceTree = SOURCE_ROOT; };
191E5FD7290A6EFB001A3B7C /* minimuxer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = minimuxer.h; path = ../Dependencies/minimuxer/minimuxer.h; sourceTree = "<group>"; };
191E605D290B2D6B001A3B7C /* glue.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = glue.c; path = "../Dependencies/libimobiledevice-glue/src/glue.c"; sourceTree = "<group>"; };
191E605E290B2D6B001A3B7C /* cbuf.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cbuf.c; path = "../Dependencies/libimobiledevice-glue/src/cbuf.c"; sourceTree = "<group>"; };
191E605F290B2D6B001A3B7C /* utils.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = utils.c; path = "../Dependencies/libimobiledevice-glue/src/utils.c"; sourceTree = "<group>"; };
191E6060290B2D6B001A3B7C /* collection.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = collection.c; path = "../Dependencies/libimobiledevice-glue/src/collection.c"; sourceTree = "<group>"; };
191E6061290B2D6B001A3B7C /* opack.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = opack.c; path = "../Dependencies/libimobiledevice-glue/src/opack.c"; sourceTree = "<group>"; };
191E6062290B2D6B001A3B7C /* tlv.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = tlv.c; path = "../Dependencies/libimobiledevice-glue/src/tlv.c"; sourceTree = "<group>"; };
191E6063290B2D6B001A3B7C /* thread.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = thread.c; path = "../Dependencies/libimobiledevice-glue/src/thread.c"; sourceTree = "<group>"; };
191E6064290B2D6B001A3B7C /* socket.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = socket.c; path = "../Dependencies/libimobiledevice-glue/src/socket.c"; sourceTree = "<group>"; };
191E6065290B2D6B001A3B7C /* termcolors.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = termcolors.c; path = "../Dependencies/libimobiledevice-glue/src/termcolors.c"; sourceTree = "<group>"; };
191E6073290B2E02001A3B7C /* companion_proxy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = companion_proxy.c; path = ../Dependencies/libimobiledevice/src/companion_proxy.c; sourceTree = "<group>"; };
191E6074290B2E02001A3B7C /* preboard.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = preboard.c; path = ../Dependencies/libimobiledevice/src/preboard.c; sourceTree = "<group>"; };
19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = "<group>"; }; 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = "<group>"; };
B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Roxas.xcodeproj; path = Dependencies/Roxas/Roxas.xcodeproj; sourceTree = "<group>"; }; B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Roxas.xcodeproj; path = Dependencies/Roxas/Roxas.xcodeproj; sourceTree = "<group>"; };
B39575F4284F29E20080B4FF /* Roxas.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Roxas.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B39575F4284F29E20080B4FF /* Roxas.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Roxas.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -692,7 +766,6 @@
BF74989A23621C0700CED65F /* ForwardingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardingNavigationController.swift; sourceTree = "<group>"; }; BF74989A23621C0700CED65F /* ForwardingNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ForwardingNavigationController.swift; sourceTree = "<group>"; };
BF770E5022BB1CF6002A40FE /* InstallAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallAppOperation.swift; sourceTree = "<group>"; }; BF770E5022BB1CF6002A40FE /* InstallAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstallAppOperation.swift; sourceTree = "<group>"; };
BF770E5322BC044E002A40FE /* OperationContexts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationContexts.swift; sourceTree = "<group>"; }; BF770E5322BC044E002A40FE /* OperationContexts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperationContexts.swift; sourceTree = "<group>"; };
BF770E5522BC3C02002A40FE /* Server.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Server.swift; sourceTree = "<group>"; };
BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshGroup.swift; sourceTree = "<group>"; }; BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshGroup.swift; sourceTree = "<group>"; };
BF770E6622BD57C3002A40FE /* BackgroundTaskManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundTaskManager.swift; sourceTree = "<group>"; }; BF770E6622BD57C3002A40FE /* BackgroundTaskManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundTaskManager.swift; sourceTree = "<group>"; };
BF770E6822BD57DD002A40FE /* Silence.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Silence.m4a; sourceTree = "<group>"; }; BF770E6822BD57DD002A40FE /* Silence.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Silence.m4a; sourceTree = "<group>"; };
@@ -720,14 +793,12 @@
BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotCollectionViewCell.swift; sourceTree = "<group>"; }; BF9ABA4822DD0742008935CF /* ScreenshotCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotCollectionViewCell.swift; sourceTree = "<group>"; };
BF9ABA4A22DD137F008935CF /* NavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = "<group>"; }; BF9ABA4A22DD137F008935CF /* NavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = "<group>"; };
BF9ABA4C22DD16DE008935CF /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = "<group>"; }; BF9ABA4C22DD16DE008935CF /* PillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = "<group>"; };
BFA8172823C56042001B5953 /* ServerConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerConnection.swift; sourceTree = "<group>"; };
BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = "<group>"; }; BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FetchAnisetteDataOperation.swift; sourceTree = "<group>"; };
BFAD678C25E0649500D4C4D1 /* ALTDebugConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTDebugConnection.h; sourceTree = "<group>"; }; BFAD678C25E0649500D4C4D1 /* ALTDebugConnection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTDebugConnection.h; sourceTree = "<group>"; };
BFAD678D25E0649500D4C4D1 /* ALTDebugConnection.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ALTDebugConnection.mm; sourceTree = "<group>"; }; BFAD678D25E0649500D4C4D1 /* ALTDebugConnection.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ALTDebugConnection.mm; sourceTree = "<group>"; };
BFAD679525E064D400D4C4D1 /* ALTDebugConnection+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALTDebugConnection+Private.h"; sourceTree = "<group>"; }; BFAD679525E064D400D4C4D1 /* ALTDebugConnection+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ALTDebugConnection+Private.h"; sourceTree = "<group>"; };
BFAD67A225E0854500D4C4D1 /* DeveloperDiskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperDiskManager.swift; sourceTree = "<group>"; }; BFAD67A225E0854500D4C4D1 /* DeveloperDiskManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperDiskManager.swift; sourceTree = "<group>"; };
BFB1169C22932DB100BB457C /* apps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = apps.json; sourceTree = "<group>"; }; BFB1169C22932DB100BB457C /* apps.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = apps.json; sourceTree = "<group>"; };
BFB364592325985F00CD0EB1 /* FindServerOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindServerOperation.swift; sourceTree = "<group>"; };
BFB39B5B252BC10E00D1BE50 /* Managed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Managed.swift; sourceTree = "<group>"; }; BFB39B5B252BC10E00D1BE50 /* Managed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Managed.swift; sourceTree = "<group>"; };
BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdateCollectionViewCell.xib; sourceTree = "<group>"; }; BFB4323E22DE852000B7F8BC /* UpdateCollectionViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UpdateCollectionViewCell.xib; sourceTree = "<group>"; };
BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ALTAnisetteData.m; path = "Dependencies/AltSign/AltSign/Model/Apple API/ALTAnisetteData.m"; sourceTree = SOURCE_ROOT; }; BFB49AA823834CF900D542D9 /* ALTAnisetteData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ALTAnisetteData.m; path = "Dependencies/AltSign/AltSign/Model/Apple API/ALTAnisetteData.m"; sourceTree = SOURCE_ROOT; };
@@ -761,7 +832,6 @@
BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = "<group>"; }; BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = "<group>"; };
BFD44605241188C300EAB90A /* CodableServerError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableServerError.swift; sourceTree = "<group>"; }; BFD44605241188C300EAB90A /* CodableServerError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableServerError.swift; sourceTree = "<group>"; };
BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTConstants.h; sourceTree = "<group>"; }; BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTConstants.h; sourceTree = "<group>"; };
BFD52BD322A0800A000B7ED1 /* ServerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerManager.swift; sourceTree = "<group>"; };
BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptrarray.c; path = Dependencies/libplist/src/ptrarray.c; sourceTree = SOURCE_ROOT; }; BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptrarray.c; path = Dependencies/libplist/src/ptrarray.c; sourceTree = SOURCE_ROOT; };
BFD52BE622A1A9CA000B7ED1 /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = base64.c; path = Dependencies/libplist/src/base64.c; sourceTree = SOURCE_ROOT; }; BFD52BE622A1A9CA000B7ED1 /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = base64.c; path = Dependencies/libplist/src/base64.c; sourceTree = SOURCE_ROOT; };
BFD52BE722A1A9CA000B7ED1 /* hashtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hashtable.c; path = Dependencies/libplist/src/hashtable.c; sourceTree = SOURCE_ROOT; }; BFD52BE722A1A9CA000B7ED1 /* hashtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hashtable.c; path = Dependencies/libplist/src/hashtable.c; sourceTree = SOURCE_ROOT; };
@@ -858,10 +928,27 @@
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
19104DAF2909C06C00C49C7B /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
19104DBB2909C11700C49C7B /* libem_proxy.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
191E5FA8290A5D92001A3B7C /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
191E5FB6290A5E1F001A3B7C /* libminimuxer.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
678E094C3184B66357EAA4AF /* Frameworks */ = { 678E094C3184B66357EAA4AF /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
191E5FDC290AFA5C001A3B7C /* OpenSSL in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -921,6 +1008,10 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
191E6087290C7B50001A3B7C /* libminimuxer.a in Frameworks */,
191E5FB4290A5DA0001A3B7C /* libminimuxer.a in Frameworks */,
19104DBC2909C4E500C49C7B /* libEmotionalDamage.a in Frameworks */,
19104D952909BAEA00C49C7B /* libimobiledevice.a in Frameworks */,
B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */, B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */,
D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */, D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */,
B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */, B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */,
@@ -944,6 +1035,40 @@
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
19104DB32909C06D00C49C7B /* EmotionalDamage */ = {
isa = PBXGroup;
children = (
19104DA92909BC7100C49C7B /* em_proxy.h */,
19104DB42909C06D00C49C7B /* EmotionalDamage.swift */,
);
path = EmotionalDamage;
sourceTree = "<group>";
};
191E5FAC290A5D92001A3B7C /* minimuxer */ = {
isa = PBXGroup;
children = (
191E5FD7290A6EFB001A3B7C /* minimuxer.h */,
191E5FAD290A5D92001A3B7C /* minimuxer.swift */,
);
path = minimuxer;
sourceTree = "<group>";
};
191E5FF4290B2663001A3B7C /* libimobiledevice-glue */ = {
isa = PBXGroup;
children = (
191E605E290B2D6B001A3B7C /* cbuf.c */,
191E6060290B2D6B001A3B7C /* collection.c */,
191E605D290B2D6B001A3B7C /* glue.c */,
191E6061290B2D6B001A3B7C /* opack.c */,
191E6064290B2D6B001A3B7C /* socket.c */,
191E6065290B2D6B001A3B7C /* termcolors.c */,
191E6063290B2D6B001A3B7C /* thread.c */,
191E6062290B2D6B001A3B7C /* tlv.c */,
191E605F290B2D6B001A3B7C /* utils.c */,
);
name = "libimobiledevice-glue";
sourceTree = "<group>";
};
B3146EC7284F580500BBC3FD /* Products */ = { B3146EC7284F580500BBC3FD /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1052,6 +1177,7 @@
BF45872C2298D31600BD7491 /* libimobiledevice */ = { BF45872C2298D31600BD7491 /* libimobiledevice */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
191E5FF4290B2663001A3B7C /* libimobiledevice-glue */,
BF4588562298DC6D00BD7491 /* libplist */, BF4588562298DC6D00BD7491 /* libplist */,
BF4587972298D36400BD7491 /* libimobiledevice */, BF4587972298D36400BD7491 /* libimobiledevice */,
BF45883D2298D3E800BD7491 /* libusbmuxd */, BF45883D2298D3E800BD7491 /* libusbmuxd */,
@@ -1068,6 +1194,8 @@
BF4587DF2298D3A900BD7491 /* debugserver.c */, BF4587DF2298D3A900BD7491 /* debugserver.c */,
BF4587DE2298D3A900BD7491 /* debugserver.h */, BF4587DE2298D3A900BD7491 /* debugserver.h */,
BF4587E42298D3A900BD7491 /* device_link_service.c */, BF4587E42298D3A900BD7491 /* device_link_service.c */,
191E6073290B2E02001A3B7C /* companion_proxy.c */,
191E6074290B2E02001A3B7C /* preboard.c */,
BF4587EF2298D3AA00BD7491 /* device_link_service.h */, BF4587EF2298D3AA00BD7491 /* device_link_service.h */,
BF4587C92298D3A800BD7491 /* diagnostics_relay.c */, BF4587C92298D3A800BD7491 /* diagnostics_relay.c */,
BF4587CA2298D3A800BD7491 /* diagnostics_relay.h */, BF4587CA2298D3A800BD7491 /* diagnostics_relay.h */,
@@ -1150,6 +1278,9 @@
BFD52BE622A1A9CA000B7ED1 /* base64.c */, BFD52BE622A1A9CA000B7ED1 /* base64.c */,
BFD52BF622A1A9CA000B7ED1 /* base64.h */, BFD52BF622A1A9CA000B7ED1 /* base64.h */,
BFD52BF222A1A9CA000B7ED1 /* Boolean.cpp */, BFD52BF222A1A9CA000B7ED1 /* Boolean.cpp */,
191E5FD1290A651D001A3B7C /* jsmn.h */,
191E5FD0290A651D001A3B7C /* jsmn.c */,
191E5FCF290A651D001A3B7C /* jplist.c */,
BFD52BEA22A1A9CA000B7ED1 /* bplist.c */, BFD52BEA22A1A9CA000B7ED1 /* bplist.c */,
BFD52BF522A1A9CA000B7ED1 /* bytearray.c */, BFD52BF522A1A9CA000B7ED1 /* bytearray.c */,
BFD52BFA22A1A9CB000B7ED1 /* bytearray.h */, BFD52BFA22A1A9CB000B7ED1 /* bytearray.h */,
@@ -1481,16 +1612,6 @@
path = Plugin; path = Plugin;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
BFC51D7922972F1F00388324 /* Server */ = {
isa = PBXGroup;
children = (
BFD52BD322A0800A000B7ED1 /* ServerManager.swift */,
BF770E5522BC3C02002A40FE /* Server.swift */,
BFA8172823C56042001B5953 /* ServerConnection.swift */,
);
path = Server;
sourceTree = "<group>";
};
BFC84A4B2421A13000853474 /* Sources */ = { BFC84A4B2421A13000853474 /* Sources */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1529,6 +1650,8 @@
BF18BFE824857D7900DD5981 /* AltDaemon */, BF18BFE824857D7900DD5981 /* AltDaemon */,
BF98916C250AABF3002ACF50 /* AltWidget */, BF98916C250AABF3002ACF50 /* AltWidget */,
BFF7C905257844C900E55F36 /* AltXPC */, BFF7C905257844C900E55F36 /* AltXPC */,
19104DB32909C06D00C49C7B /* EmotionalDamage */,
191E5FAC290A5D92001A3B7C /* minimuxer */,
BFD247852284BB3300981D42 /* Frameworks */, BFD247852284BB3300981D42 /* Frameworks */,
B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */, B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */,
BFD2476B2284B9A500981D42 /* Products */, BFD2476B2284B9A500981D42 /* Products */,
@@ -1547,6 +1670,8 @@
BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */, BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */,
BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */, BF989167250AABF3002ACF50 /* AltWidgetExtension.appex */,
BFF7C904257844C900E55F36 /* AltXPC.xpc */, BFF7C904257844C900E55F36 /* AltXPC.xpc */,
19104DB22909C06C00C49C7B /* libEmotionalDamage.a */,
191E5FAB290A5D92001A3B7C /* libminimuxer.a */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1569,7 +1694,6 @@
BFD2478A2284C49000981D42 /* Managing Apps */, BFD2478A2284C49000981D42 /* Managing Apps */,
BF56D2AD23DF9E170006506D /* App IDs */, BF56D2AD23DF9E170006506D /* App IDs */,
BFC84A4B2421A13000853474 /* Sources */, BFC84A4B2421A13000853474 /* Sources */,
BFC51D7922972F1F00388324 /* Server */,
BF0DCA642433BDE200E3A595 /* Analytics */, BF0DCA642433BDE200E3A595 /* Analytics */,
BFF00D2E2501BD4B00746320 /* Intents */, BFF00D2E2501BD4B00746320 /* Intents */,
BFDB6A0922AAEDA1007EA6D6 /* Operations */, BFDB6A0922AAEDA1007EA6D6 /* Operations */,
@@ -1586,6 +1710,8 @@
BFD247852284BB3300981D42 /* Frameworks */ = { BFD247852284BB3300981D42 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
191E5FB5290A5E1F001A3B7C /* libminimuxer.a */,
19104DA32909BC1000C49C7B /* libem_proxy.a */,
B39575F4284F29E20080B4FF /* Roxas.framework */, B39575F4284F29E20080B4FF /* Roxas.framework */,
D533E8B62727841800A9B5DD /* libAppleArchive.tbd */, D533E8B62727841800A9B5DD /* libAppleArchive.tbd */,
BF580497246A3D19008AE704 /* UIKit.framework */, BF580497246A3D19008AE704 /* UIKit.framework */,
@@ -1700,7 +1826,6 @@
BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */, BF770E5722BC3D0F002A40FE /* RefreshGroup.swift */,
BF770E5322BC044E002A40FE /* OperationContexts.swift */, BF770E5322BC044E002A40FE /* OperationContexts.swift */,
BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */, BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */,
BFB364592325985F00CD0EB1 /* FindServerOperation.swift */,
BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */, BFC1F38C22AEE3A4003AC21A /* DownloadAppOperation.swift */,
BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */, BFDB6A0722AAED73007EA6D6 /* ResignAppOperation.swift */,
BF3BEFBE2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift */, BF3BEFBE2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift */,
@@ -1813,6 +1938,13 @@
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */ /* Begin PBXHeadersBuildPhase section */
191E5FD4290A6EE0001A3B7C /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
BF4587272298D31600BD7491 /* Headers */ = { BF4587272298D31600BD7491 /* Headers */ = {
isa = PBXHeadersBuildPhase; isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -1835,7 +1967,6 @@
BF45881F2298D3AB00BD7491 /* device_link_service.h in Headers */, BF45881F2298D3AB00BD7491 /* device_link_service.h in Headers */,
BFD52C1A22A1A9CB000B7ED1 /* time64_limits.h in Headers */, BFD52C1A22A1A9CB000B7ED1 /* time64_limits.h in Headers */,
BF45880E2298D3AB00BD7491 /* debugserver.h in Headers */, BF45880E2298D3AB00BD7491 /* debugserver.h in Headers */,
BF45884B2298D55000BD7491 /* thread.h in Headers */,
BF4588102298D3AB00BD7491 /* heartbeat.h in Headers */, BF4588102298D3AB00BD7491 /* heartbeat.h in Headers */,
BF4587FA2298D3AB00BD7491 /* diagnostics_relay.h in Headers */, BF4587FA2298D3AB00BD7491 /* diagnostics_relay.h in Headers */,
BFD52C1622A1A9CB000B7ED1 /* bytearray.h in Headers */, BFD52C1622A1A9CB000B7ED1 /* bytearray.h in Headers */,
@@ -1876,6 +2007,41 @@
/* End PBXHeadersBuildPhase section */ /* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */ /* Begin PBXNativeTarget section */
19104DB12909C06C00C49C7B /* EmotionalDamage */ = {
isa = PBXNativeTarget;
buildConfigurationList = 19104DB62909C06D00C49C7B /* Build configuration list for PBXNativeTarget "EmotionalDamage" */;
buildPhases = (
19104DAE2909C06C00C49C7B /* Sources */,
19104DAF2909C06C00C49C7B /* Frameworks */,
19104DB02909C06C00C49C7B /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = EmotionalDamage;
productName = EmotionalDamage;
productReference = 19104DB22909C06C00C49C7B /* libEmotionalDamage.a */;
productType = "com.apple.product-type.library.static";
};
191E5FAA290A5D92001A3B7C /* minimuxer */ = {
isa = PBXNativeTarget;
buildConfigurationList = 191E5FAF290A5D92001A3B7C /* Build configuration list for PBXNativeTarget "minimuxer" */;
buildPhases = (
191E5FD4290A6EE0001A3B7C /* Headers */,
191E5FA7290A5D92001A3B7C /* Sources */,
191E5FA8290A5D92001A3B7C /* Frameworks */,
191E5FA9290A5D92001A3B7C /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
name = minimuxer;
productName = minimuxer;
productReference = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */;
productType = "com.apple.product-type.library.static";
};
BF18BFE624857D7900DD5981 /* AltDaemon */ = { BF18BFE624857D7900DD5981 /* AltDaemon */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */; buildConfigurationList = BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */;
@@ -1931,8 +2097,12 @@
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
191E5FDA290AFA49001A3B7C /* PBXTargetDependency */,
); );
name = libimobiledevice; name = libimobiledevice;
packageProductDependencies = (
191E5FDB290AFA5C001A3B7C /* OpenSSL */,
);
productName = libimobiledevice; productName = libimobiledevice;
productReference = BF45872B2298D31600BD7491 /* libimobiledevice.a */; productReference = BF45872B2298D31600BD7491 /* libimobiledevice.a */;
productType = "com.apple.product-type.library.static"; productType = "com.apple.product-type.library.static";
@@ -2025,6 +2195,9 @@
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */,
19104DBA2909C0F200C49C7B /* PBXTargetDependency */,
19104D942909BADB00C49C7B /* PBXTargetDependency */,
BF66EE842501AE50007EE018 /* PBXTargetDependency */, BF66EE842501AE50007EE018 /* PBXTargetDependency */,
BF989176250AABF4002ACF50 /* PBXTargetDependency */, BF989176250AABF4002ACF50 /* PBXTargetDependency */,
); );
@@ -2062,10 +2235,16 @@
BFD247622284B9A500981D42 /* Project object */ = { BFD247622284B9A500981D42 /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 1200; LastSwiftUpdateCheck = 1400;
LastUpgradeCheck = 1020; LastUpgradeCheck = 1020;
ORGANIZATIONNAME = "Riley Testut"; ORGANIZATIONNAME = "Riley Testut";
TargetAttributes = { TargetAttributes = {
19104DB12909C06C00C49C7B = {
CreatedOnToolsVersion = 14.0;
};
191E5FAA290A5D92001A3B7C = {
CreatedOnToolsVersion = 14.0;
};
BF18BFE624857D7900DD5981 = { BF18BFE624857D7900DD5981 = {
CreatedOnToolsVersion = 11.5; CreatedOnToolsVersion = 11.5;
LastSwiftMigration = 1150; LastSwiftMigration = 1150;
@@ -2155,6 +2334,8 @@
BF66EE7D2501AE50007EE018 /* AltStoreCore */, BF66EE7D2501AE50007EE018 /* AltStoreCore */,
BF989166250AABF3002ACF50 /* AltWidgetExtension */, BF989166250AABF3002ACF50 /* AltWidgetExtension */,
BFF7C903257844C900E55F36 /* AltXPC */, BFF7C903257844C900E55F36 /* AltXPC */,
19104DB12909C06C00C49C7B /* EmotionalDamage */,
191E5FAA290A5D92001A3B7C /* minimuxer */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@@ -2258,6 +2439,22 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
19104DAE2909C06C00C49C7B /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
19104DB52909C06D00C49C7B /* EmotionalDamage.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
191E5FA7290A5D92001A3B7C /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
191E5FAE290A5D92001A3B7C /* minimuxer.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
BF18BFE324857D7900DD5981 /* Sources */ = { BF18BFE324857D7900DD5981 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -2328,14 +2525,25 @@
BFD52C0622A1A9CB000B7ED1 /* bplist.c in Sources */, BFD52C0622A1A9CB000B7ED1 /* bplist.c in Sources */,
BF4588232298D3AB00BD7491 /* mobilesync.c in Sources */, BF4588232298D3AB00BD7491 /* mobilesync.c in Sources */,
BF4588072298D3AB00BD7491 /* afc.c in Sources */, BF4588072298D3AB00BD7491 /* afc.c in Sources */,
191E6066290B2DB1001A3B7C /* cbuf.c in Sources */,
191E607D290B2EA5001A3B7C /* jsmn.c in Sources */,
191E6067290B2DB3001A3B7C /* collection.c in Sources */,
191E6075290B2E46001A3B7C /* companion_proxy.c in Sources */,
191E607E290B2EA7001A3B7C /* jplist.c in Sources */,
191E6076290B2E48001A3B7C /* preboard.c in Sources */,
BF4588082298D3AB00BD7491 /* mobile_image_mounter.c in Sources */, BF4588082298D3AB00BD7491 /* mobile_image_mounter.c in Sources */,
191E6068290B2DB5001A3B7C /* glue.c in Sources */,
BFD52C1122A1A9CB000B7ED1 /* bytearray.c in Sources */, BFD52C1122A1A9CB000B7ED1 /* bytearray.c in Sources */,
BF4588022298D3AB00BD7491 /* file_relay.c in Sources */, BF4588022298D3AB00BD7491 /* file_relay.c in Sources */,
191E6069290B2DB7001A3B7C /* opack.c in Sources */,
191E606A290B2DC4001A3B7C /* socket.c in Sources */,
191E606E290B2DCB001A3B7C /* utils.c in Sources */,
191E606B290B2DC6001A3B7C /* termcolors.c in Sources */,
191E606C290B2DC8001A3B7C /* thread.c in Sources */,
191E606D290B2DCA001A3B7C /* tlv.c in Sources */,
BF45880F2298D3AB00BD7491 /* debugserver.c in Sources */, BF45880F2298D3AB00BD7491 /* debugserver.c in Sources */,
BF4588162298D3AB00BD7491 /* restore.c in Sources */, BF4588162298D3AB00BD7491 /* restore.c in Sources */,
BFD52C0422A1A9CB000B7ED1 /* Dictionary.cpp in Sources */, BFD52C0422A1A9CB000B7ED1 /* Dictionary.cpp in Sources */,
BF4588412298D3F800BD7491 /* collection.c in Sources */,
BF4588372298D3C100BD7491 /* utils.c in Sources */,
BFD52C0222A1A9CB000B7ED1 /* base64.c in Sources */, BFD52C0222A1A9CB000B7ED1 /* base64.c in Sources */,
BFD52C2022A1A9EC000B7ED1 /* node.c in Sources */, BFD52C2022A1A9EC000B7ED1 /* node.c in Sources */,
BF4588092298D3AB00BD7491 /* installation_proxy.c in Sources */, BF4588092298D3AB00BD7491 /* installation_proxy.c in Sources */,
@@ -2353,7 +2561,6 @@
BFD52C1322A1A9CB000B7ED1 /* Data.cpp in Sources */, BFD52C1322A1A9CB000B7ED1 /* Data.cpp in Sources */,
BF45883A2298D3C100BD7491 /* debug.c in Sources */, BF45883A2298D3C100BD7491 /* debug.c in Sources */,
BFD52C0F22A1A9CB000B7ED1 /* Real.cpp in Sources */, BFD52C0F22A1A9CB000B7ED1 /* Real.cpp in Sources */,
BF45884A2298D55000BD7491 /* thread.c in Sources */,
BF4587FB2298D3AB00BD7491 /* notification_proxy.c in Sources */, BF4587FB2298D3AB00BD7491 /* notification_proxy.c in Sources */,
BF4588352298D3C100BD7491 /* userpref.c in Sources */, BF4588352298D3C100BD7491 /* userpref.c in Sources */,
BFD52C0122A1A9CB000B7ED1 /* ptrarray.c in Sources */, BFD52C0122A1A9CB000B7ED1 /* ptrarray.c in Sources */,
@@ -2364,7 +2571,6 @@
BF4588242298D3AB00BD7491 /* property_list_service.c in Sources */, BF4588242298D3AB00BD7491 /* property_list_service.c in Sources */,
BF45881E2298D3AB00BD7491 /* misagent.c in Sources */, BF45881E2298D3AB00BD7491 /* misagent.c in Sources */,
BF4587FC2298D3AB00BD7491 /* sbservices.c in Sources */, BF4587FC2298D3AB00BD7491 /* sbservices.c in Sources */,
BF4588392298D3C100BD7491 /* socket.c in Sources */,
BFD52C1522A1A9CB000B7ED1 /* Node.cpp in Sources */, BFD52C1522A1A9CB000B7ED1 /* Node.cpp in Sources */,
BF4588142298D3AB00BD7491 /* device_link_service.c in Sources */, BF4588142298D3AB00BD7491 /* device_link_service.c in Sources */,
BF4588172298D3AB00BD7491 /* screenshotr.c in Sources */, BF4588172298D3AB00BD7491 /* screenshotr.c in Sources */,
@@ -2541,7 +2747,6 @@
BF08858322DE795100DE9F1E /* MyAppsViewController.swift in Sources */, BF08858322DE795100DE9F1E /* MyAppsViewController.swift in Sources */,
BFC84A4D2421A19100853474 /* SourcesViewController.swift in Sources */, BFC84A4D2421A19100853474 /* SourcesViewController.swift in Sources */,
BFF0B696232242D3007A79E1 /* LicensesViewController.swift in Sources */, BFF0B696232242D3007A79E1 /* LicensesViewController.swift in Sources */,
BFD52BD422A0800A000B7ED1 /* ServerManager.swift in Sources */,
BFBE0007250AD0E70080826E /* ViewAppIntentHandler.swift in Sources */, BFBE0007250AD0E70080826E /* ViewAppIntentHandler.swift in Sources */,
BFDB6A0822AAED73007EA6D6 /* ResignAppOperation.swift in Sources */, BFDB6A0822AAED73007EA6D6 /* ResignAppOperation.swift in Sources */,
D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */, D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */,
@@ -2565,12 +2770,9 @@
BF663C4F2433ED8200DAA738 /* FileManager+DirectorySize.swift in Sources */, BF663C4F2433ED8200DAA738 /* FileManager+DirectorySize.swift in Sources */,
D57DF63F271E51E400677701 /* ALTAppPatcher.m in Sources */, D57DF63F271E51E400677701 /* ALTAppPatcher.m in Sources */,
BFB6B220231870B00022A802 /* NewsCollectionViewCell.swift in Sources */, BFB6B220231870B00022A802 /* NewsCollectionViewCell.swift in Sources */,
BFB3645A2325985F00CD0EB1 /* FindServerOperation.swift in Sources */,
BF3BEFBF2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift in Sources */, BF3BEFBF2408673400DE7D55 /* FetchProvisioningProfilesOperation.swift in Sources */,
BFF0B69023219C6D007A79E1 /* PatreonComponents.swift in Sources */, BFF0B69023219C6D007A79E1 /* PatreonComponents.swift in Sources */,
BFBE0004250ACFFB0080826E /* ViewApp.intentdefinition in Sources */, BFBE0004250ACFFB0080826E /* ViewApp.intentdefinition in Sources */,
BF770E5622BC3C03002A40FE /* Server.swift in Sources */,
BFA8172923C56042001B5953 /* ServerConnection.swift in Sources */,
BF56D2AF23DF9E310006506D /* AppIDsViewController.swift in Sources */, BF56D2AF23DF9E310006506D /* AppIDsViewController.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -2589,6 +2791,25 @@
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */ /* Begin PBXTargetDependency section */
19104D942909BADB00C49C7B /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = BF45872A2298D31600BD7491 /* libimobiledevice */;
targetProxy = 19104D932909BADB00C49C7B /* PBXContainerItemProxy */;
};
19104DBA2909C0F200C49C7B /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 19104DB12909C06C00C49C7B /* EmotionalDamage */;
targetProxy = 19104DB92909C0F200C49C7B /* PBXContainerItemProxy */;
};
191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 191E5FAA290A5D92001A3B7C /* minimuxer */;
targetProxy = 191E5FB2290A5D9B001A3B7C /* PBXContainerItemProxy */;
};
191E5FDA290AFA49001A3B7C /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
productRef = 191E5FD9290AFA49001A3B7C /* OpenSSL */;
};
BF4588452298D48B00BD7491 /* PBXTargetDependency */ = { BF4588452298D48B00BD7491 /* PBXTargetDependency */ = {
isa = PBXTargetDependency; isa = PBXTargetDependency;
target = BF45872A2298D31600BD7491 /* libimobiledevice */; target = BF45872A2298D31600BD7491 /* libimobiledevice */;
@@ -2652,6 +2873,108 @@
/* End PBXVariantGroup section */ /* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */ /* Begin XCBuildConfiguration section */
19104DB72909C06D00C49C7B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 4FW3Q8784L;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Dependencies/em_proxy/target/aarch64-apple-ios/release",
"$(PROJECT_DIR)/Dependencies/em_proxy/target/aarch64-apple-ios/debug",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OBJC_BRIDGING_HEADER = Dependencies/em_proxy/em_proxy.h;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TVOS_DEPLOYMENT_TARGET = 14.0;
WATCHOS_DEPLOYMENT_TARGET = 7.0;
};
name = Debug;
};
19104DB82909C06D00C49C7B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 4FW3Q8784L;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Dependencies/em_proxy/target/aarch64-apple-ios/release",
"$(PROJECT_DIR)/Dependencies/em_proxy/target/aarch64-apple-ios/debug",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = Dependencies/em_proxy/em_proxy.h;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TVOS_DEPLOYMENT_TARGET = 14.0;
WATCHOS_DEPLOYMENT_TARGET = 7.0;
};
name = Release;
};
191E5FB0290A5D92001A3B7C /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 4FW3Q8784L;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/release",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/debug",
);
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OBJC_BRIDGING_HEADER = Dependencies/minimuxer/minimuxer.h;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
191E5FB1290A5D92001A3B7C /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 4FW3Q8784L;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/release",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/debug",
);
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OBJC_BRIDGING_HEADER = Dependencies/minimuxer/minimuxer.h;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
BF18BFEC24857D7900DD5981 /* Debug */ = { BF18BFEC24857D7900DD5981 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
@@ -2854,6 +3177,7 @@
HAVE_ASPRINTF, HAVE_ASPRINTF,
"\"PACKAGE_STRING=\\\"AltServer 1.0\\\"\"", "\"PACKAGE_STRING=\\\"AltServer 1.0\\\"\"",
HAVE_GETIFADDRS, HAVE_GETIFADDRS,
HAVE_STRNDUP,
); );
GCC_WARN_INHIBIT_ALL_WARNINGS = YES; GCC_WARN_INHIBIT_ALL_WARNINGS = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
@@ -2866,6 +3190,7 @@
"\"$(SRCROOT)/Dependencies/libplist/libcnary/include\"", "\"$(SRCROOT)/Dependencies/libplist/libcnary/include\"",
"\"${SDKROOT}/usr/include/libxml2\"", "\"${SDKROOT}/usr/include/libxml2\"",
"\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/xcode\"", "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/xcode\"",
"\"$(SRCROOT)/Dependencies/libimobiledevice-glue/include\"/**",
); );
MACOSX_DEPLOYMENT_TARGET = 10.14; MACOSX_DEPLOYMENT_TARGET = 10.14;
PRODUCT_NAME = imobiledevice; PRODUCT_NAME = imobiledevice;
@@ -2892,6 +3217,7 @@
HAVE_ASPRINTF, HAVE_ASPRINTF,
"\"PACKAGE_STRING=\\\"AltServer 1.0\\\"\"", "\"PACKAGE_STRING=\\\"AltServer 1.0\\\"\"",
HAVE_GETIFADDRS, HAVE_GETIFADDRS,
HAVE_STRNDUP,
); );
GCC_WARN_INHIBIT_ALL_WARNINGS = YES; GCC_WARN_INHIBIT_ALL_WARNINGS = YES;
HEADER_SEARCH_PATHS = ( HEADER_SEARCH_PATHS = (
@@ -2904,6 +3230,7 @@
"\"$(SRCROOT)/Dependencies/libplist/libcnary/include\"", "\"$(SRCROOT)/Dependencies/libplist/libcnary/include\"",
"\"${SDKROOT}/usr/include/libxml2\"", "\"${SDKROOT}/usr/include/libxml2\"",
"\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/xcode\"", "\"$(SRCROOT)/Dependencies/AltSign/Dependencies/libzip/xcode\"",
"\"$(SRCROOT)/Dependencies/libimobiledevice-glue/include\"/**",
); );
MACOSX_DEPLOYMENT_TARGET = 10.14; MACOSX_DEPLOYMENT_TARGET = 10.14;
PRODUCT_NAME = imobiledevice; PRODUCT_NAME = imobiledevice;
@@ -3302,6 +3629,8 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Dependencies/fragmentzip", "$(PROJECT_DIR)/Dependencies/fragmentzip",
"$(PROJECT_DIR)/Dependencies/libcurl", "$(PROJECT_DIR)/Dependencies/libcurl",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/debug",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/release",
); );
MARKETING_VERSION = 1.5.1b; MARKETING_VERSION = 1.5.1b;
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
@@ -3337,6 +3666,8 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Dependencies/fragmentzip", "$(PROJECT_DIR)/Dependencies/fragmentzip",
"$(PROJECT_DIR)/Dependencies/libcurl", "$(PROJECT_DIR)/Dependencies/libcurl",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/debug",
"$(PROJECT_DIR)/Dependencies/minimuxer/target/aarch64-apple-ios/release",
); );
MARKETING_VERSION = 1.5.1b; MARKETING_VERSION = 1.5.1b;
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
@@ -3412,6 +3743,24 @@
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */ /* Begin XCConfigurationList section */
19104DB62909C06D00C49C7B /* Build configuration list for PBXNativeTarget "EmotionalDamage" */ = {
isa = XCConfigurationList;
buildConfigurations = (
19104DB72909C06D00C49C7B /* Debug */,
19104DB82909C06D00C49C7B /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
191E5FAF290A5D92001A3B7C /* Build configuration list for PBXNativeTarget "minimuxer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
191E5FB0290A5D92001A3B7C /* Debug */,
191E5FB1290A5D92001A3B7C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */ = { BF18BFEB24857D7900DD5981 /* Build configuration list for PBXNativeTarget "AltDaemon" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (
@@ -3572,6 +3921,16 @@
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */ /* Begin XCSwiftPackageProductDependency section */
191E5FD9290AFA49001A3B7C /* OpenSSL */ = {
isa = XCSwiftPackageProductDependency;
package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */;
productName = OpenSSL;
};
191E5FDB290AFA5C001A3B7C /* OpenSSL */ = {
isa = XCSwiftPackageProductDependency;
package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */;
productName = OpenSSL;
};
4879A95E2861046500FC1BBD /* AltSign */ = { 4879A95E2861046500FC1BBD /* AltSign */ = {
isa = XCSwiftPackageProductDependency; isa = XCSwiftPackageProductDependency;
package = 4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */; package = 4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */;

View File

@@ -14,6 +14,7 @@ import Intents
import AltStoreCore import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas
import EmotionalDamage
extension AppDelegate extension AppDelegate
{ {
@@ -75,8 +76,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
self.setTintColor() self.setTintColor()
ServerManager.shared.startDiscovering()
SecureValueTransformer.register() SecureValueTransformer.register()
if UserDefaults.standard.firstLaunch == nil if UserDefaults.standard.firstLaunch == nil
@@ -95,18 +94,16 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return true return true
} }
func applicationDidEnterBackground(_ application: UIApplication) func applicationDidEnterBackground(_ application: UIApplication)
{ {
ServerManager.shared.stopDiscovering()
} }
func applicationWillEnterForeground(_ application: UIApplication) func applicationWillEnterForeground(_ application: UIApplication)
{ {
AppManager.shared.update() AppManager.shared.update()
ServerManager.shared.startDiscovering() start_em_proxy(bind_addr: "127.0.0.1:51820")
PatreonAPI.shared.refreshPatreonAccount()
} }
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool

View File

@@ -11,6 +11,8 @@
<string>00008101-000129D63698001E</string> <string>00008101-000129D63698001E</string>
<key>ALTServerID</key> <key>ALTServerID</key>
<string>1F7D5B55-79CE-4546-A029-D4DDC4AF3B6D</string> <string>1F7D5B55-79CE-4546-A029-D4DDC4AF3B6D</string>
<key>ALTPairingFile</key>
<string>&lt;insert pairing file here&gt;</string>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDocumentTypes</key> <key>CFBundleDocumentTypes</key>

View File

@@ -8,6 +8,8 @@
import UIKit import UIKit
import Roxas import Roxas
import EmotionalDamage
import minimuxer
import AltStoreCore import AltStoreCore
@@ -36,6 +38,12 @@ class LaunchViewController: RSTLaunchViewController
override func viewDidLoad() override func viewDidLoad()
{ {
super.viewDidLoad() super.viewDidLoad()
start_em_proxy(bind_addr: "127.0.0.1:51820")
let pf = Bundle.main.object(forInfoDictionaryKey: "ALTPairingFile") as? String
set_usbmuxd_socket()
start_minimuxer(pairing_file: pf.unsafelyUnwrapped)
auto_mount_dev_image()
// Create destinationViewController now so view controllers can register for receiving Notifications. // Create destinationViewController now so view controllers can register for receiving Notifications.
self.destinationViewController = self.storyboard!.instantiateViewController(withIdentifier: "tabBarController") as! TabBarController self.destinationViewController = self.storyboard!.instantiateViewController(withIdentifier: "tabBarController") as! TabBarController

View File

@@ -217,23 +217,6 @@ extension AppManager
} }
} }
@discardableResult
func findServer(context: OperationContext = OperationContext(), completionHandler: @escaping (Result<Server, Error>) -> Void) -> FindServerOperation
{
let findServerOperation = FindServerOperation(context: context)
findServerOperation.resultHandler = { (result) in
switch result
{
case .failure(let error): context.error = error
case .success(let server): context.server = server
}
}
self.run([findServerOperation], context: context)
return findServerOperation
}
@discardableResult @discardableResult
func authenticate(presentingViewController: UIViewController?, context: AuthenticatedOperationContext = AuthenticatedOperationContext(), completionHandler: @escaping (Result<(ALTTeam, ALTCertificate, ALTAppleAPISession), Error>) -> Void) -> AuthenticationOperation func authenticate(presentingViewController: UIViewController?, context: AuthenticatedOperationContext = AuthenticatedOperationContext(), completionHandler: @escaping (Result<(ALTTeam, ALTCertificate, ALTAppleAPISession), Error>) -> Void) -> AuthenticationOperation
{ {
@@ -242,8 +225,6 @@ extension AppManager
return operation return operation
} }
let findServerOperation = self.findServer(context: context) { _ in }
let authenticationOperation = AuthenticationOperation(context: context, presentingViewController: presentingViewController) let authenticationOperation = AuthenticationOperation(context: context, presentingViewController: presentingViewController)
authenticationOperation.resultHandler = { (result) in authenticationOperation.resultHandler = { (result) in
switch result switch result
@@ -254,7 +235,6 @@ extension AppManager
completionHandler(result) completionHandler(result)
} }
authenticationOperation.addDependency(findServerOperation)
self.run([authenticationOperation], context: context) self.run([authenticationOperation], context: context)
@@ -555,13 +535,10 @@ extension AppManager
// authentication, so we keep it separate. // authentication, so we keep it separate.
let context = OperationContext() let context = OperationContext()
let findServerOperation = self.findServer(context: context) { _ in }
let deactivateAppOperation = DeactivateAppOperation(app: installedApp, context: context) let deactivateAppOperation = DeactivateAppOperation(app: installedApp, context: context)
deactivateAppOperation.resultHandler = { (result) in deactivateAppOperation.resultHandler = { (result) in
completionHandler(result) completionHandler(result)
} }
deactivateAppOperation.addDependency(findServerOperation)
self.run([deactivateAppOperation], context: context, requiresSerialQueue: true) self.run([deactivateAppOperation], context: context, requiresSerialQueue: true)
} }
@@ -695,13 +672,11 @@ extension AppManager
let context = Context() let context = Context()
context.installedApp = installedApp context.installedApp = installedApp
let findServerOperation = self.findServer(context: context) { _ in }
let enableJITOperation = EnableJITOperation(context: context) let enableJITOperation = EnableJITOperation(context: context)
enableJITOperation.resultHandler = { (result) in enableJITOperation.resultHandler = { (result) in
completionHandler(result) completionHandler(result)
} }
enableJITOperation.addDependency(findServerOperation)
self.run([enableJITOperation], context: context, requiresSerialQueue: true) self.run([enableJITOperation], context: context, requiresSerialQueue: true)
} }
@@ -747,7 +722,7 @@ extension AppManager
switch result switch result
{ {
case .failure(let error): context.error = error case .failure(let error): context.error = error
case .success(let installationConnection): context.installationConnection = installationConnection case .success(_): print("App sent over AFC")
} }
} }
sendAppOperation.addDependency(patchAppOperation) sendAppOperation.addDependency(patchAppOperation)
@@ -900,8 +875,7 @@ private extension AppManager
if app.certificateSerialNumber != group.context.certificate?.serialNumber || if app.certificateSerialNumber != group.context.certificate?.serialNumber ||
uti != nil || uti != nil ||
app.needsResign || app.needsResign
(group.context.server?.connectionType == .local && !UserDefaults.standard.localServerSupportsRefreshing)
{ {
// Resign app instead of just refreshing profiles because either: // Resign app instead of just refreshing profiles because either:
// * Refreshing using different certificate // * Refreshing using different certificate
@@ -1147,7 +1121,7 @@ private extension AppManager
presentingViewController?.dismiss(animated: true, completion: nil) presentingViewController?.dismiss(animated: true, completion: nil)
} }
} }
presentingViewController.present(navigationController, animated: true, completion: nil) presentingViewController.present(navigationController, animated: true, completion: nil)
} }
} }
catch catch
@@ -1204,7 +1178,7 @@ private extension AppManager
switch result switch result
{ {
case .failure(let error): context.error = error case .failure(let error): context.error = error
case .success(let installationConnection): context.installationConnection = installationConnection case .success(_): print("App reported as installed")
} }
} }
sendAppOperation.addDependency(resignAppOperation) sendAppOperation.addDependency(resignAppOperation)
@@ -1649,27 +1623,6 @@ private extension AppManager
func finish(_ operation: AppOperation, result: Result<InstalledApp, Error>, group: RefreshGroup, progress: Progress?) func finish(_ operation: AppOperation, result: Result<InstalledApp, Error>, group: RefreshGroup, progress: Progress?)
{ {
let result = result.mapError { (resultError) -> Error in
guard let error = resultError as? ALTServerError else { return resultError }
switch error.code
{
case .deviceNotFound, .lostConnection:
if let server = group.context.server, server.isPreferred || server.connectionType != .wireless
{
// Preferred server (or not random wireless connection), so report errors normally.
return error
}
else
{
// Not preferred server, so ignore these specific errors and throw serverNotFound instead.
return ConnectionError.serverNotFound
}
default: return error
}
}
// Must remove before saving installedApp. // Must remove before saving installedApp.
if let currentProgress = self.progress(for: operation), currentProgress == progress if let currentProgress = self.progress(for: operation), currentProgress == progress
{ {
@@ -1709,7 +1662,7 @@ private extension AppManager
} }
if #available(iOS 14, *) if #available(iOS 14, *)
{ {
WidgetCenter.shared.getCurrentConfigurations { (result) in WidgetCenter.shared.getCurrentConfigurations { (result) in
guard case .success(let widgets) = result else { return } guard case .success(let widgets) = result else { return }

View File

@@ -10,6 +10,7 @@ import UIKit
import CoreData import CoreData
import AltStoreCore import AltStoreCore
import EmotionalDamage
enum RefreshError: LocalizedError enum RefreshError: LocalizedError
{ {
@@ -80,10 +81,11 @@ class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<InstalledA
DispatchQueue.main.async { DispatchQueue.main.async {
if UIApplication.shared.applicationState == .background if UIApplication.shared.applicationState == .background
{ {
ServerManager.shared.stopDiscovering()
} }
} }
} }
override func main() override func main()
@@ -94,11 +96,7 @@ class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<InstalledA
self.finish(.failure(RefreshError.noInstalledApps)) self.finish(.failure(RefreshError.noInstalledApps))
return return
} }
start_em_proxy(bind_addr: "127.0.0.1:51820")
if !ServerManager.shared.isDiscovering
{
ServerManager.shared.startDiscovering()
}
self.managedObjectContext.perform { self.managedObjectContext.perform {
print("Apps to refresh:", self.installedApps.map(\.bundleIdentifier)) print("Apps to refresh:", self.installedApps.map(\.bundleIdentifier))
@@ -207,10 +205,6 @@ private extension BackgroundRefreshAppsOperation
content.title = NSLocalizedString("Refreshed Apps", comment: "") content.title = NSLocalizedString("Refreshed Apps", comment: "")
content.body = NSLocalizedString("All apps have been refreshed.", comment: "") content.body = NSLocalizedString("All apps have been refreshed.", comment: "")
} }
catch ConnectionError.serverNotFound
{
shouldPresentAlert = false
}
catch RefreshError.noInstalledApps catch RefreshError.noInstalledApps
{ {
shouldPresentAlert = false shouldPresentAlert = false

View File

@@ -11,6 +11,7 @@ import Foundation
import AltStoreCore import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas
import minimuxer
@objc(DeactivateAppOperation) @objc(DeactivateAppOperation)
class DeactivateAppOperation: ResultOperation<InstalledApp> class DeactivateAppOperation: ResultOperation<InstalledApp>
@@ -36,54 +37,27 @@ class DeactivateAppOperation: ResultOperation<InstalledApp>
return return
} }
guard let server = self.context.server else { return self.finish(.failure(OperationError.invalidParameters)) } DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { return self.finish(.failure(OperationError.unknownUDID)) } let installedApp = context.object(with: self.app.objectID) as! InstalledApp
let appExtensionProfiles = installedApp.appExtensions.map { $0.resignedBundleIdentifier }
ServerManager.shared.connect(to: server) { (result) in let allIdentifiers = [installedApp.resignedBundleIdentifier] + appExtensionProfiles
switch result
{ for profile in allIdentifiers {
case .failure(let error): self.finish(.failure(error)) do {
case .success(let connection): let res = try remove_provisioning_profile(id: profile)
print("Sending deactivate app request...") if case Uhoh.Bad(let code) = res {
self.finish(.failure(minimuxer_to_operation(code: code)))
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
let installedApp = context.object(with: self.app.objectID) as! InstalledApp
let appExtensionProfiles = installedApp.appExtensions.map { $0.resignedBundleIdentifier }
let allIdentifiers = [installedApp.resignedBundleIdentifier] + appExtensionProfiles
let request = RemoveProvisioningProfilesRequest(udid: udid, bundleIdentifiers: Set(allIdentifiers))
connection.send(request) { (result) in
print("Sent deactive app request!")
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success:
print("Waiting for deactivate app response...")
connection.receiveResponse() { (result) in
print("Receiving deactivate app response:", result)
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success(.error(let response)): self.finish(.failure(response.error))
case .success(.removeProvisioningProfiles):
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
self.progress.completedUnitCount += 1
let installedApp = context.object(with: self.app.objectID) as! InstalledApp
installedApp.isActive = false
self.finish(.success(installedApp))
}
case .success: self.finish(.failure(ALTServerError(.unknownResponse)))
}
}
}
} }
} catch Uhoh.Bad(let code) {
self.finish(.failure(minimuxer_to_operation(code: code)))
} catch {
self.finish(.failure(ALTServerError(.unknownResponse)))
} }
} }
self.progress.completedUnitCount += 1
installedApp.isActive = false
self.finish(.success(installedApp))
} }
} }
} }

View File

@@ -8,13 +8,13 @@
import UIKit import UIKit
import Combine import Combine
import minimuxer
import AltStoreCore import AltStoreCore
@available(iOS 14, *) @available(iOS 14, *)
protocol EnableJITContext protocol EnableJITContext
{ {
var server: Server? { get }
var installedApp: InstalledApp? { get } var installedApp: InstalledApp? { get }
var error: Error? { get } var error: Error? { get }
@@ -42,95 +42,26 @@ class EnableJITOperation<Context: EnableJITContext>: ResultOperation<Void>
return return
} }
guard let server = self.context.server, let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) } guard 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)) }
installedApp.managedObjectContext?.perform { installedApp.managedObjectContext?.perform {
guard let bundle = Bundle(url: installedApp.fileURL), let v = minimuxer_to_operation(code: 1)
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 {
// Launch app to make sure it is running in foreground. do {
UIApplication.shared.open(openAppURL) { success in var x = try debug_app(app_id: installedApp.resignedBundleIdentifier)
guard success else { return self.finish(.failure(OperationError.openAppFailed(name: appName))) } switch x {
case .Good:
// Combine immediately finishes if an error is thrown, but we want to wait at least until app enters background. self.finish(.success(()))
// As a workaround, we set error type to Never and use Result<Void, Error> as the value type instead. case .Bad(let code):
let result = Future<Result<Void, Error>, Never> { promise in self.finish(.failure(minimuxer_to_operation(code: code)))
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)
}
}
}
} }
} catch Uhoh.Bad(let code) {
self.finish(.failure(minimuxer_to_operation(code: code)))
} catch {
self.finish(.failure(OperationError.unknown))
} }
} }
} }
} }

View File

@@ -1,131 +0,0 @@
//
// FindServerOperation.swift
// AltStore
//
// Created by Riley Testut on 9/8/19.
// Copyright © 2019 Riley Testut. All rights reserved.
//
import Foundation
import AltStoreCore
import Roxas
private let ReceivedServerConnectionResponse: @convention(c) (CFNotificationCenter?, UnsafeMutableRawPointer?, CFNotificationName?, UnsafeRawPointer?, CFDictionary?) -> Void =
{ (center, observer, name, object, userInfo) in
guard let name = name, let observer = observer else { return }
let operation = unsafeBitCast(observer, to: FindServerOperation.self)
operation.handle(name)
}
@objc(FindServerOperation)
class FindServerOperation: ResultOperation<Server>
{
let context: OperationContext
private var isWiredServerConnectionAvailable = false
private var localServerMachServiceName: String?
init(context: OperationContext = OperationContext())
{
self.context = context
}
override func main()
{
super.main()
if let error = self.context.error
{
self.finish(.failure(error))
return
}
if let server = self.context.server
{
self.finish(.success(server))
return
}
let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
let observer = Unmanaged.passUnretained(self).toOpaque()
// Prepare observers to receive callback from wired connection or background daemon (if available).
CFNotificationCenterAddObserver(notificationCenter, observer, ReceivedServerConnectionResponse, CFNotificationName.wiredServerConnectionAvailableResponse.rawValue, nil, .deliverImmediately)
// Post notifications.
CFNotificationCenterPostNotification(notificationCenter, .wiredServerConnectionAvailableRequest, nil, nil, true)
self.discoverLocalServer()
// Wait for either callback or timeout.
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
if let machServiceName = self.localServerMachServiceName
{
// Prefer background daemon, if it exists and is running.
let server = Server(connectionType: .local, machServiceName: machServiceName)
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
{
// No servers.
self.finish(.failure(ConnectionError.serverNotFound))
}
}
}
override func finish(_ result: Result<Server, Error>)
{
super.finish(result)
let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
let observer = Unmanaged.passUnretained(self).toOpaque()
CFNotificationCenterRemoveObserver(notificationCenter, observer, .wiredServerConnectionAvailableResponse, nil)
}
}
fileprivate extension FindServerOperation
{
func discoverLocalServer()
{
for machServiceName in XPCConnection.machServiceNames
{
let xpcConnection = NSXPCConnection.makeConnection(machServiceName: machServiceName)
let connection = XPCConnection(xpcConnection)
connection.connect { (result) in
switch result
{
case .failure(let error): print("Could not connect to AltDaemon XPC service \(machServiceName).", error)
case .success: self.localServerMachServiceName = machServiceName
}
}
}
}
func handle(_ notification: CFNotificationName)
{
switch notification
{
case .wiredServerConnectionAvailableResponse: self.isWiredServerConnectionAvailable = true
default: break
}
}
}

View File

@@ -5,7 +5,6 @@
// Created by Riley Testut on 6/19/19. // Created by Riley Testut on 6/19/19.
// Copyright © 2019 Riley Testut. All rights reserved. // Copyright © 2019 Riley Testut. All rights reserved.
// //
import Foundation import Foundation
import Network import Network
@@ -41,8 +40,7 @@ class InstallAppOperation: ResultOperation<InstalledApp>
guard guard
let certificate = self.context.certificate, let certificate = self.context.certificate,
let resignedApp = self.context.resignedApp, let resignedApp = self.context.resignedApp
let connection = self.context.installationConnection
else { return self.finish(.failure(OperationError.invalidParameters)) } else { return self.finish(.failure(OperationError.invalidParameters)) }
let backgroundContext = DatabaseManager.shared.persistentContainer.newBackgroundContext() let backgroundContext = DatabaseManager.shared.persistentContainer.newBackgroundContext()
@@ -145,27 +143,16 @@ class InstallAppOperation: ResultOperation<InstalledApp>
}) })
} }
let request = BeginInstallationRequest(activeProfiles: activeProfiles, bundleIdentifier: installedApp.resignedBundleIdentifier) let ns_bundle = NSString(string: installedApp.bundleIdentifier)
connection.send(request) { (result) in let ns_bundle_ptr = UnsafeMutablePointer<CChar>(mutating: ns_bundle.utf8String)
switch result
{ let res = minimuxer_install_ipa(ns_bundle_ptr)
case .failure(let error): self.finish(.failure(error)) if res == 0 {
case .success: installedApp.refreshedDate = Date()
self.finish(.success(installedApp))
self.receive(from: connection) { (result) in
switch result } else {
{ self.finish(.failure(minimuxer_to_operation(code: res)))
case .success:
backgroundContext.perform {
installedApp.refreshedDate = Date()
self.finish(.success(installedApp))
}
case .failure(let error):
self.finish(.failure(error))
}
}
}
} }
} }
} }
@@ -195,42 +182,6 @@ class InstallAppOperation: ResultOperation<InstalledApp>
private extension InstallAppOperation private extension InstallAppOperation
{ {
func receive(from connection: ServerConnection, completionHandler: @escaping (Result<Void, Error>) -> Void)
{
connection.receiveResponse() { (result) in
do
{
let response = try result.get()
print(response)
switch response
{
case .installationProgress(let response):
if response.progress == 1.0
{
self.progress.completedUnitCount = self.progress.totalUnitCount
completionHandler(.success(()))
}
else
{
self.progress.completedUnitCount = Int64(response.progress * 100)
self.receive(from: connection, completionHandler: completionHandler)
}
case .error(let response):
completionHandler(.failure(response.error))
default:
completionHandler(.failure(ALTServerError(.unknownRequest)))
}
}
catch
{
completionHandler(.failure(ALTServerError(error)))
}
}
}
func cleanUp() func cleanUp()
{ {
guard !self.didCleanUp else { return } guard !self.didCleanUp else { return }

View File

@@ -15,16 +15,14 @@ import AltSign
class OperationContext class OperationContext
{ {
var server: Server?
var error: Error? var error: Error?
var presentingViewController: UIViewController? var presentingViewController: UIViewController?
let operations: NSHashTable<Foundation.Operation> let operations: NSHashTable<Foundation.Operation>
init(server: Server? = nil, error: Error? = nil, operations: [Foundation.Operation] = []) init(error: Error? = nil, operations: [Foundation.Operation] = [])
{ {
self.server = server
self.error = error self.error = error
self.operations = NSHashTable<Foundation.Operation>.weakObjects() self.operations = NSHashTable<Foundation.Operation>.weakObjects()
@@ -36,7 +34,7 @@ class OperationContext
convenience init(context: OperationContext) convenience init(context: OperationContext)
{ {
self.init(server: context.server, error: context.error, operations: context.operations.allObjects) self.init(error: context.error, operations: context.operations.allObjects)
} }
} }
@@ -51,7 +49,7 @@ class AuthenticatedOperationContext: OperationContext
convenience init(context: AuthenticatedOperationContext) convenience init(context: AuthenticatedOperationContext)
{ {
self.init(server: context.server, error: context.error, operations: context.operations.allObjects) self.init(error: context.error, operations: context.operations.allObjects)
self.session = context.session self.session = context.session
self.team = context.team self.team = context.team
@@ -105,7 +103,6 @@ class InstallAppOperationContext: AppOperationContext
}() }()
var resignedApp: ALTApplication? var resignedApp: ALTApplication?
var installationConnection: ServerConnection?
var installedApp: InstalledApp? { var installedApp: InstalledApp? {
didSet { didSet {
self.installedAppContext = self.installedApp?.managedObjectContext self.installedAppContext = self.installedApp?.managedObjectContext

View File

@@ -31,6 +31,19 @@ enum OperationError: LocalizedError
case openAppFailed(name: String) case openAppFailed(name: String)
case missingAppGroup case missingAppGroup
case noDevice
case createService(name: String)
case getFromDevice(name: String)
case setArgument(name: String)
case afc
case install
case uninstall
case lookupApps
case detach
case functionArguments
case profileInstall
case noConnection
var failureReason: String? { var failureReason: String? {
switch self { switch self {
case .unknown: return NSLocalizedString("An unknown error occured.", comment: "") case .unknown: return NSLocalizedString("An unknown error occured.", comment: "")
@@ -46,6 +59,18 @@ enum OperationError: LocalizedError
case .openAppFailed(let name): return String(format: NSLocalizedString("AltStore was denied permission to launch %@.", comment: ""), name) case .openAppFailed(let name): return String(format: NSLocalizedString("AltStore was denied permission to launch %@.", comment: ""), name)
case .missingAppGroup: return NSLocalizedString("AltStore's shared app group could not be found.", comment: "") case .missingAppGroup: return NSLocalizedString("AltStore's shared app group could not be found.", comment: "")
case .maximumAppIDLimitReached: return NSLocalizedString("Cannot register more than 10 App IDs.", comment: "") case .maximumAppIDLimitReached: return NSLocalizedString("Cannot register more than 10 App IDs.", comment: "")
case .noDevice: return NSLocalizedString("Cannot fetch the device from the muxer", comment: "")
case .createService(let name): return String(format: NSLocalizedString("Cannot start a %@ server on the device.", comment: ""), name)
case .getFromDevice(let name): return String(format: NSLocalizedString("Cannot fetch %@ from the device.", comment: ""), name)
case .setArgument(let name): return String(format: NSLocalizedString("Cannot set %@ on the device.", comment: ""), name)
case .afc: return NSLocalizedString("AFC was unable to manage files on the device", comment: "")
case .install: return NSLocalizedString("Unable to install the app from the staging directory", comment: "")
case .uninstall: return NSLocalizedString("Unable to uninstall the app", comment: "")
case .lookupApps: return NSLocalizedString("Unable to fetch apps from the device", comment: "")
case .detach: return NSLocalizedString("Unable to detach from the app's process", comment: "")
case .functionArguments: return NSLocalizedString("A function was passed invalid arguments", comment: "")
case .profileInstall: return NSLocalizedString("Unable to manage profiles on the device", comment: "")
case .noConnection: return NSLocalizedString("Unable to connect to the device, make sure Wireguard is enabled and you're connected to WiFi", comment: "")
} }
} }
@@ -90,3 +115,50 @@ enum OperationError: LocalizedError
} }
} }
} }
func minimuxer_to_operation(code: Int32) -> OperationError {
switch code {
case -1:
return OperationError.noDevice
case -2:
return OperationError.createService(name: "debug")
case -3:
return OperationError.createService(name: "instproxy")
case -4:
return OperationError.getFromDevice(name: "installed apps")
case -5:
return OperationError.getFromDevice(name: "path to the app")
case -6:
return OperationError.getFromDevice(name: "bundle path")
case -7:
return OperationError.setArgument(name: "max packet")
case -8:
return OperationError.setArgument(name: "working directory")
case -9:
return OperationError.setArgument(name: "argv")
case -10:
return OperationError.getFromDevice(name: "launch success")
case -11:
return OperationError.detach
case -12:
return OperationError.functionArguments
case -13:
return OperationError.createService(name: "AFC")
case -14:
return OperationError.afc
case -15:
return OperationError.install
case -16:
return OperationError.uninstall
case -17:
return OperationError.createService(name: "misagent")
case -18:
return OperationError.profileInstall
case -19:
return OperationError.profileInstall
case -20:
return OperationError.noConnection
default:
return OperationError.unknown
}
}

View File

@@ -11,6 +11,7 @@ import Foundation
import AltStoreCore import AltStoreCore
import AltSign import AltSign
import Roxas import Roxas
import minimuxer
@objc(RefreshAppOperation) @objc(RefreshAppOperation)
class RefreshAppOperation: ResultOperation<InstalledApp> class RefreshAppOperation: ResultOperation<InstalledApp>
@@ -39,75 +40,37 @@ class RefreshAppOperation: ResultOperation<InstalledApp>
throw error throw error
} }
guard let server = self.context.server, let profiles = self.context.provisioningProfiles else { throw OperationError.invalidParameters } guard let profiles = self.context.provisioningProfiles else { throw OperationError.invalidParameters }
guard let app = self.context.app else { throw OperationError.appNotFound } guard let app = self.context.app else { throw OperationError.appNotFound }
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { throw OperationError.unknownUDID }
ServerManager.shared.connect(to: server) { (result) in DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
switch result print("Sending refresh app request...")
{
case .failure(let error): self.finish(.failure(error)) for p in profiles {
case .success(let connection): do {
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in let x = try install_provisioning_profile(plist: p.value.data)
print("Sending refresh app request...") if case .Bad(let code) = x {
self.finish(.failure(minimuxer_to_operation(code: code)))
var activeProfiles: Set<String>?
if UserDefaults.standard.activeAppsLimit != nil
{
// When installing these new profiles, AltServer will remove all non-active profiles to ensure we remain under limit.
let activeApps = InstalledApp.fetchActiveApps(in: context)
activeProfiles = Set(activeApps.flatMap { (installedApp) -> [String] in
let appExtensionProfiles = installedApp.appExtensions.map { $0.resignedBundleIdentifier }
return [installedApp.resignedBundleIdentifier] + appExtensionProfiles
})
} }
} catch Uhoh.Bad(let code) {
let request = InstallProvisioningProfilesRequest(udid: udid, provisioningProfiles: Set(profiles.values), activeProfiles: activeProfiles) self.finish(.failure(minimuxer_to_operation(code: code)))
connection.send(request) { (result) in } catch {
print("Sent refresh app request!") self.finish(.failure(OperationError.unknown))
}
switch result self.progress.completedUnitCount += 1
{
case .failure(let error): self.finish(.failure(error)) let predicate = NSPredicate(format: "%K == %@", #keyPath(InstalledApp.bundleIdentifier), app.bundleIdentifier)
case .success: self.managedObjectContext.perform {
print("Waiting for refresh app response...") guard let installedApp = InstalledApp.first(satisfying: predicate, in: self.managedObjectContext) else {
connection.receiveResponse() { (result) in return
print("Receiving refresh app response:", result)
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success(.error(let response)): self.finish(.failure(response.error))
case .success(.installProvisioningProfiles):
self.managedObjectContext.perform {
let predicate = NSPredicate(format: "%K == %@", #keyPath(InstalledApp.bundleIdentifier), app.bundleIdentifier)
guard let installedApp = InstalledApp.first(satisfying: predicate, in: self.managedObjectContext) else {
return self.finish(.failure(OperationError.appNotFound))
}
self.progress.completedUnitCount += 1
if let provisioningProfile = profiles[app.bundleIdentifier]
{
installedApp.update(provisioningProfile: provisioningProfile)
}
for installedExtension in installedApp.appExtensions
{
guard let provisioningProfile = profiles[installedExtension.bundleIdentifier] else { continue }
installedExtension.update(provisioningProfile: provisioningProfile)
}
self.finish(.success(installedApp))
}
case .success: self.finish(.failure(ALTServerError(.unknownRequest)))
}
}
}
} }
installedApp.update(provisioningProfile: p.value)
for installedExtension in installedApp.appExtensions {
guard let provisioningProfile = profiles[installedExtension.bundleIdentifier] else { continue }
installedExtension.update(provisioningProfile: provisioningProfile)
}
self.finish(.success(installedApp))
} }
} }
} }

View File

@@ -9,6 +9,7 @@
import Foundation import Foundation
import AltStoreCore import AltStoreCore
import minimuxer
@objc(RemoveAppOperation) @objc(RemoveAppOperation)
class RemoveAppOperation: ResultOperation<InstalledApp> class RemoveAppOperation: ResultOperation<InstalledApp>
@@ -32,50 +33,27 @@ class RemoveAppOperation: ResultOperation<InstalledApp>
return return
} }
guard let server = self.context.server, let installedApp = self.context.installedApp else { return self.finish(.failure(OperationError.invalidParameters)) } guard 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)) }
installedApp.managedObjectContext?.perform { installedApp.managedObjectContext?.perform {
let resignedBundleIdentifier = installedApp.resignedBundleIdentifier let resignedBundleIdentifier = installedApp.resignedBundleIdentifier
ServerManager.shared.connect(to: server) { (result) in do {
switch result let res = try remove_app(app_id: resignedBundleIdentifier)
{ if case Uhoh.Bad(let code) = res {
case .failure(let error): self.finish(.failure(error)) self.finish(.failure(minimuxer_to_operation(code: code)))
case .success(let connection):
print("Sending remove app request...")
let request = RemoveAppRequest(udid: udid, bundleIdentifier: resignedBundleIdentifier)
connection.send(request) { (result) in
print("Sent remove app request!")
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success:
print("Waiting for remove app response...")
connection.receiveResponse() { (result) in
print("Receiving remove app response:", result)
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success(.error(let response)): self.finish(.failure(response.error))
case .success(.removeApp):
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
self.progress.completedUnitCount += 1
let installedApp = context.object(with: installedApp.objectID) as! InstalledApp
installedApp.isActive = false
self.finish(.success(installedApp))
}
case .success: self.finish(.failure(ALTServerError(.unknownResponse)))
}
}
}
}
} }
} catch Uhoh.Bad(let code) {
self.finish(.failure(minimuxer_to_operation(code: code)))
} catch {
self.finish(.failure(ALTServerError(.appDeletionFailed)))
}
DatabaseManager.shared.persistentContainer.performBackgroundTask { (context) in
self.progress.completedUnitCount += 1
let installedApp = context.object(with: installedApp.objectID) as! InstalledApp
installedApp.isActive = false
self.finish(.success(installedApp))
} }
} }
} }

View File

@@ -114,6 +114,7 @@ private extension ResignAppOperation
infoDictionary[kCFBundleIdentifierKey as String] = profile.bundleIdentifier infoDictionary[kCFBundleIdentifierKey as String] = profile.bundleIdentifier
infoDictionary[Bundle.Info.altBundleID] = identifier infoDictionary[Bundle.Info.altBundleID] = identifier
infoDictionary[Bundle.Info.devicePairingString] = Bundle.main.object(forInfoDictionaryKey: "ALTPairingFile") as? String
for (key, value) in additionalInfoDictionaryValues for (key, value) in additionalInfoDictionaryValues
{ {
@@ -172,6 +173,8 @@ private extension ResignAppOperation
if app.isAltStoreApp if app.isAltStoreApp
{ {
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { throw OperationError.unknownUDID } guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { throw OperationError.unknownUDID }
guard let pairingFileString = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.devicePairingString) as? String else { throw OperationError.unknownUDID }
additionalValues[Bundle.Info.devicePairingString] = pairingFileString
additionalValues[Bundle.Info.deviceID] = udid additionalValues[Bundle.Info.deviceID] = udid
additionalValues[Bundle.Info.serverID] = UserDefaults.standard.preferredServerID additionalValues[Bundle.Info.serverID] = UserDefaults.standard.preferredServerID

View File

@@ -5,20 +5,17 @@
// Created by Riley Testut on 6/7/19. // Created by Riley Testut on 6/7/19.
// Copyright © 2019 Riley Testut. All rights reserved. // Copyright © 2019 Riley Testut. All rights reserved.
// //
import Foundation import Foundation
import Network import Network
import AltStoreCore import AltStoreCore
@objc(SendAppOperation) @objc(SendAppOperation)
class SendAppOperation: ResultOperation<ServerConnection> class SendAppOperation: ResultOperation<()>
{ {
let context: InstallAppOperationContext let context: InstallAppOperationContext
private let dispatchQueue = DispatchQueue(label: "com.altstore.SendAppOperation") private let dispatchQueue = DispatchQueue(label: "com.sidestore.SendAppOperation")
private var serverConnection: ServerConnection?
init(context: InstallAppOperationContext) init(context: InstallAppOperationContext)
{ {
@@ -39,87 +36,31 @@ class SendAppOperation: ResultOperation<ServerConnection>
return return
} }
guard let resignedApp = self.context.resignedApp, let server = self.context.server else { return self.finish(.failure(OperationError.invalidParameters)) } guard let resignedApp = self.context.resignedApp else { return self.finish(.failure(OperationError.invalidParameters)) }
// self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa. // self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa.
let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.url) let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.url)
let fileURL = InstalledApp.refreshedIPAURL(for: app) let fileURL = InstalledApp.refreshedIPAURL(for: app)
// Connect to server.
ServerManager.shared.connect(to: server) { (result) in let ns_bundle = NSString(string: app.bundleIdentifier)
switch result let ns_bundle_ptr = UnsafeMutablePointer<CChar>(mutating: ns_bundle.utf8String)
{
case .failure(let error): self.finish(.failure(error))
case .success(let serverConnection):
self.serverConnection = serverConnection
// Send app to server.
self.sendApp(at: fileURL, via: serverConnection) { (result) in
switch result
{
case .failure(let error): self.finish(.failure(error))
case .success:
self.progress.completedUnitCount += 1
self.finish(.success(serverConnection))
}
}
}
}
}
}
private extension SendAppOperation if let data = NSData(contentsOf: fileURL) {
{ let pls = UnsafeMutablePointer<UInt8>.allocate(capacity: data.length)
func sendApp(at fileURL: URL, via connection: ServerConnection, completionHandler: @escaping (Result<Void, Error>) -> Void) for (index, data) in data.enumerated() {
{ pls[index] = data
do }
{ let res = minimuxer_yeet_app_afc(ns_bundle_ptr, pls, UInt(data.length))
guard let appData = try? Data(contentsOf: fileURL) else { throw OperationError.invalidApp } if res == 0 {
guard let udid = Bundle.main.object(forInfoDictionaryKey: Bundle.Info.deviceID) as? String else { throw OperationError.unknownUDID } self.progress.completedUnitCount += 1
self.finish(.success(()))
var request = PrepareAppRequest(udid: udid, contentSize: appData.count) } else {
self.finish(.failure(minimuxer_to_operation(code: res)))
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
} }
connection.send(request) { (result) in } else {
switch result self.finish(.failure(ALTServerError(.underlyingError)))
{
case .failure(let error): completionHandler(.failure(error))
case .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(()))
}
}
}
}
}
}
catch
{
completionHandler(.failure(error))
} }
} }
} }

View File

@@ -8,6 +8,7 @@
import UIKit import UIKit
import AltStoreCore import AltStoreCore
import EmotionalDamage
@available(iOS 13, *) @available(iOS 13, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate class SceneDelegate: UIResponder, UIWindowSceneDelegate
@@ -39,7 +40,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate
guard DatabaseManager.shared.isStarted else { return } guard DatabaseManager.shared.isStarted else { return }
AppManager.shared.update() AppManager.shared.update()
ServerManager.shared.startDiscovering() start_em_proxy(bind_addr: "127.0.0.1:51820")
PatreonAPI.shared.refreshPatreonAccount() PatreonAPI.shared.refreshPatreonAccount()
} }
@@ -52,7 +53,7 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate
guard UIApplication.shared.applicationState == .background else { return } guard UIApplication.shared.applicationState == .background else { return }
ServerManager.shared.stopDiscovering()
} }
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)

View File

@@ -1,73 +0,0 @@
//
// Server.swift
// AltStore
//
// Created by Riley Testut on 6/20/19.
// Copyright © 2019 Riley Testut. All rights reserved.
//
import Network
enum ConnectionError: LocalizedError
{
case serverNotFound
case connectionFailed
case connectionDropped
var failureReason: String? {
switch self
{
case .serverNotFound: return NSLocalizedString("Could not find AltServer.", comment: "")
case .connectionFailed: return NSLocalizedString("Could not connect to AltServer.", comment: "")
case .connectionDropped: return NSLocalizedString("The connection to AltServer was dropped.", comment: "")
}
}
}
extension Server
{
enum ConnectionType
{
case wireless
case wired
case local
case manual
}
}
struct Server: Equatable
{
var identifier: String? = nil
var service: NetService? = nil
var isPreferred = false
var connectionType: ConnectionType = .wireless
var machServiceName: String?
}
extension Server
{
// Defined in extension so we can still use the automatically synthesized initializer.
init?(service: NetService, txtData: Data) // TODO: this is all that's needed for a server connection
{
let txtDictionary = NetService.dictionary(fromTXTRecord: txtData)
guard let identifierData = txtDictionary["serverID"], let identifier = String(data: identifierData, encoding: .utf8) else {
NSLog("Ahh, no serverID in TXT record for service: \(service)")
return nil
}
self.service = service
self.identifier = identifier
self.isPreferred = true
}
init?(service: NetService)
{
self.service = service
self.connectionType = .manual
self.identifier = String(data: "yolo".data(using: .utf8)!, encoding: .utf8)
self.isPreferred = false
}
}

View File

@@ -1,110 +0,0 @@
//
// ServerConnection.swift
// AltStore
//
// Created by Riley Testut on 1/7/20.
// Copyright © 2020 Riley Testut. All rights reserved.
//
import Foundation
import Network
import AltStoreCore
class ServerConnection
{
var server: Server
var connection: Connection
init(server: Server, connection: Connection)
{
self.server = server
self.connection = connection
}
func send<T: Encodable>(_ payload: T, prependSize: Bool = true, completionHandler: @escaping (Result<Void, Error>) -> Void)
{
do
{
let data: Data
if let payload = payload as? Data
{
data = payload
}
else
{
data = try JSONEncoder().encode(payload)
}
func process<T>(_ result: Result<T, ALTServerError>) -> Bool
{
switch result
{
case .success: return true
case .failure(let error):
completionHandler(.failure(error))
return false
}
}
if prependSize
{
let requestSize = Int32(data.count)
let requestSizeData = withUnsafeBytes(of: requestSize) { Data($0) }
self.connection.send(requestSizeData) { (result) in
guard process(result) else { return }
self.connection.send(data) { (result) in
guard process(result) else { return }
completionHandler(.success(()))
}
}
}
else
{
self.connection.send(data) { (result) in
guard process(result) else { return }
completionHandler(.success(()))
}
}
}
catch
{
print("Invalid request.", error)
completionHandler(.failure(ALTServerError(.invalidRequest)))
}
}
func receiveResponse(completionHandler: @escaping (Result<ServerResponse, Error>) -> Void)
{
let size = MemoryLayout<Int32>.size
self.connection.receiveData(expectedSize: size) { (result) in
do
{
let data = try result.get()
let expectedBytes = Int(data.withUnsafeBytes { $0.load(as: Int32.self) })
self.connection.receiveData(expectedSize: expectedBytes) { (result) in
do
{
let data = try result.get()
let response = try AltStoreCore.JSONDecoder().decode(ServerResponse.self, from: data)
completionHandler(.success(response))
}
catch
{
completionHandler(.failure(ALTServerError(error)))
}
}
}
catch
{
completionHandler(.failure(ALTServerError(error)))
}
}
}
}

View File

@@ -1,366 +0,0 @@
//
// ServerManager.swift
// AltStore
//
// Created by Riley Testut on 5/30/19.
// Copyright © 2019 Riley Testut. All rights reserved.
//
import Foundation
import Network
import AltStoreCore
class ServerManager: NSObject
{
static let shared = ServerManager()
private(set) var isDiscovering = false
private(set) var discoveredServers = [Server]()
private let serviceBrowser = NetServiceBrowser()
private var services = Set<NetService>()
private let dispatchQueue = DispatchQueue(label: "io.altstore.ServerManager")
private var connectionListener: NWListener?
private var incomingConnections: [NWConnection]?
private var incomingConnectionsSemaphore: DispatchSemaphore?
private override init()
{
super.init()
self.serviceBrowser.delegate = self
self.serviceBrowser.includesPeerToPeer = false
}
}
extension ServerManager
{
func startDiscovering()
{
guard !self.isDiscovering else { return }
self.isDiscovering = true
self.serviceBrowser.searchForServices(ofType: ALTServerServiceType, inDomain: "")
self.startListeningForWiredConnections()
// Print log mentioning that we are manually adding this
NSLog("Manually adding server")
let ianTestService = NetService(domain: "69.69.0.1", type: "_altserver._tcp", name: "AltStore", port: 43311)
if let server = Server(service: ianTestService)
{
self.addDiscoveredServer(server)
} else {
NSLog("Check for manual server failed!!")
}
}
func stopDiscovering()
{
guard self.isDiscovering else { return }
self.isDiscovering = false
self.discoveredServers.removeAll()
self.services.removeAll()
self.serviceBrowser.stop()
self.stopListeningForWiredConnection()
}
func connect(to server: Server, completion: @escaping (Result<ServerConnection, Error>) -> Void)
{
DispatchQueue.global().async {
func finish(_ result: Result<Connection, Error>)
{
switch result
{
case .failure(let error): completion(.failure(error))
case .success(let connection):
let serverConnection = ServerConnection(server: server, connection: connection)
completion(.success(serverConnection))
}
}
switch server.connectionType
{
case .local: self.connectToLocalServer(server, completion: finish(_:))
case .wired:
guard let incomingConnectionsSemaphore = self.incomingConnectionsSemaphore else { return
finish(.failure(ALTServerError(.connectionFailed))) }
print("Waiting for incoming connection...")
let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
switch server.connectionType
{
case .wired: CFNotificationCenterPostNotification(notificationCenter, .wiredServerConnectionStartRequest, nil, nil, true)
case .local, .wireless, .manual: break
}
_ = incomingConnectionsSemaphore.wait(timeout: .now() + 10.0)
if let connection = self.incomingConnections?.popLast()
{
self.connectToRemoteServer(server, connection: connection, completion: finish(_:))
}
else
{
finish(.failure(ALTServerError(.connectionFailed)))
}
case .wireless:
guard let service = server.service else { return finish(.failure(ALTServerError(.connectionFailed))) }
print("Connecting to mDNS service:", service)
let connection = NWConnection(to: .service(name: service.name, type: service.type, domain: service.domain, interface: nil), using: .tcp)
self.connectToRemoteServer(server, connection: connection, completion: finish(_:))
case .manual:
guard let service = server.service else { return finish(.failure(ALTServerError(.connectionFailed))) }
connectNetmuxd()
print("Connecting to manual service:", service.domain)
print("Port: ", String(service.port.description))
let connection = NWConnection(host: NWEndpoint.Host(service.domain), port: NWEndpoint.Port(String(service.port))!, using: .tcp)
self.connectToRemoteServer(server, connection: connection, completion: finish(_:))
}
}
}
}
private extension ServerManager
{
func addDiscoveredServer(_ server: Server)
{
var server = server
server.isPreferred = true
guard !self.discoveredServers.contains(server) else { return }
self.discoveredServers.append(server)
}
func makeListener() -> NWListener
{
let listener = try! NWListener(using: .tcp, on: NWEndpoint.Port(rawValue: ALTDeviceListeningSocket)!)
listener.newConnectionHandler = { [weak self] (connection) in
self?.incomingConnections?.append(connection)
self?.incomingConnectionsSemaphore?.signal()
}
listener.stateUpdateHandler = { (state) in
switch state
{
case .ready: break
case .waiting, .setup: print("Listener socket waiting...")
case .cancelled: print("Listener socket cancelled.")
case .failed(let error): print("Listener socket failed:", error)
@unknown default: break
}
}
return listener
}
func startListeningForWiredConnections()
{
self.incomingConnections = []
self.incomingConnectionsSemaphore = DispatchSemaphore(value: 0)
self.connectionListener = self.makeListener()
self.connectionListener?.start(queue: self.dispatchQueue)
}
func stopListeningForWiredConnection()
{
self.connectionListener?.cancel()
self.connectionListener = nil
self.incomingConnections = nil
self.incomingConnectionsSemaphore = nil
}
func connectToRemoteServer(_ server: Server, connection: NWConnection, completion: @escaping (Result<Connection, Error>) -> Void)
{
connection.stateUpdateHandler = { [unowned connection] (state) in
switch state
{
case .failed(let error):
print("Failed to connect to service \(server.service?.name ?? "").", error)
completion(.failure(ConnectionError.connectionFailed))
case .cancelled:
completion(.failure(OperationError.cancelled))
case .ready:
let connection = NetworkConnection(connection)
completion(.success(connection))
case .waiting: break
case .setup: break
case .preparing: break
@unknown default: break
}
}
print("Connected to server!")
connection.start(queue: self.dispatchQueue)
}
func connectToLocalServer(_ server: Server, completion: @escaping (Result<Connection, Error>) -> Void)
{
guard let machServiceName = server.machServiceName else { return completion(.failure(ConnectionError.connectionFailed)) }
let xpcConnection = NSXPCConnection.makeConnection(machServiceName: machServiceName)
let connection = XPCConnection(xpcConnection)
connection.connect { (result) in
switch result
{
case .failure(let error):
print("Could not connect to AltDaemon XPC service \(machServiceName).", error)
completion(.failure(error))
case .success: completion(.success(connection))
}
}
}
}
extension ServerManager: NetServiceBrowserDelegate
{
func netServiceBrowserWillSearch(_ browser: NetServiceBrowser)
{
print("Discovering servers...")
// Send a post request to JitStreamer to deal with the devil
connectNetmuxd()
}
func netServiceBrowserDidStopSearch(_ browser: NetServiceBrowser)
{
print("Stopped discovering servers.")
}
func netServiceBrowser(_ browser: NetServiceBrowser, didNotSearch errorDict: [String : NSNumber])
{
print("Failed to discovering servers.", errorDict)
}
func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool)
{
service.delegate = self
if let txtData = service.txtRecordData(), let server = Server(service: service, txtData: txtData)
{
self.addDiscoveredServer(server)
}
else
{
service.resolve(withTimeout: 3)
self.services.insert(service)
}
}
func netServiceBrowser(_ browser: NetServiceBrowser, didRemove service: NetService, moreComing: Bool)
{
if let index = self.discoveredServers.firstIndex(where: { $0.service == service })
{
self.discoveredServers.remove(at: index)
}
self.services.remove(service)
}
}
extension ServerManager: NetServiceDelegate
{
func netServiceDidResolveAddress(_ service: NetService)
{
guard let data = service.txtRecordData(), let server = Server(service: service, txtData: data) else { return }
self.addDiscoveredServer(server)
}
func netService(_ sender: NetService, didNotResolve errorDict: [String : NSNumber])
{
print("Error resolving net service \(sender).", errorDict)
}
func netService(_ sender: NetService, didUpdateTXTRecord data: Data)
{
let txtDict = NetService.dictionary(fromTXTRecord: data)
print("Service \(sender) updated TXT Record:", txtDict)
}
}
func connectNetmuxd() {
// declare the parameter as a dictionary that contains string as key and value combination. considering inputs are valid
let parameters: [String: Any] = ["nothing": 0]
// create the url with URL
let url = URL(string: "http://69.69.0.1/netmuxd/")!
// create the session object
let session = URLSession.shared
// now create the URLRequest object using the url object
var request = URLRequest(url: url)
request.httpMethod = "POST" //set http method as POST
// add headers for the request
request.addValue("application/json", forHTTPHeaderField: "Content-Type") // change as per server requirements
request.addValue("application/json", forHTTPHeaderField: "Accept")
do {
// convert parameters to Data and assign dictionary to httpBody of request
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
print(error.localizedDescription)
return
}
// create dataTask using the session object to send data to the server
let task = session.dataTask(with: request) { data, response, error in
if let error = error {
print("Post Request Error: \(error.localizedDescription)")
return
}
// ensure there is valid response code returned from this HTTP response
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode)
else {
print("Invalid Response received from the server")
return
}
// ensure there is data returned
guard let responseData = data else {
print("nil Data received from the server")
return
}
do {
// create json object from data or use JSONDecoder to convert to Model stuct
if let jsonResponse = try JSONSerialization.jsonObject(with: responseData, options: .mutableContainers) as? [String: Any] {
print(jsonResponse)
// handle json response
} else {
print("data maybe corrupted or in wrong format")
throw URLError(.badServerResponse)
}
} catch let error {
print(error.localizedDescription)
}
}
// perform the task
task.resume()
}

1
Dependencies/em_proxy vendored Submodule

Submodule Dependencies/em_proxy added at 57ab5a0002

1
Dependencies/minimuxer vendored Submodule

Submodule Dependencies/minimuxer added at 1a98d69ef0

View File

@@ -0,0 +1,18 @@
//
// EmotionalDamage.swift
// EmotionalDamage
//
// Created by Jackson Coxson on 10/26/22.
//
import Foundation
public func start_em_proxy(bind_addr: String) {
let host = NSString(string: bind_addr)
let host_pointer = UnsafeMutablePointer<CChar>(mutating: host.utf8String)
let _ = start_emotional_damage(host_pointer)
}
public func stop_em_proxy() {
stop_emotional_damage()
}

View File

@@ -0,0 +1,31 @@
// Jackson Coxson
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
/**
* Starts your emotional damage
* # Arguments
* * `bind_addr` - The UDP socket to listen to
* # Returns
* A handle to stop further emotional damage.
* Null on failure
* # Safety
* Don't be stupid
*/
void *start_emotional_damage(const char *bind_addr);
/**
* Stops further emotional damage
* # Arguments
* * `handle` - The coping mechanism generated by start_emotional_damage
* # Returns
* The knowledge of knowing that you couldn't handle failure
* # Safety
* Don't be stupid
*/
void stop_emotional_damage(void *handle);

View File

@@ -17,7 +17,7 @@ public extension Bundle
public static let certificateID = "ALTCertificateID" public static let certificateID = "ALTCertificateID"
public static let appGroups = "ALTAppGroups" public static let appGroups = "ALTAppGroups"
public static let altBundleID = "ALTBundleIdentifier" public static let altBundleID = "ALTBundleIdentifier"
public static let devicePairingString = "ALTPairingFile"
public static let urlTypes = "CFBundleURLTypes" public static let urlTypes = "CFBundleURLTypes"
public static let exportedUTIs = "UTExportedTypeDeclarations" public static let exportedUTIs = "UTExportedTypeDeclarations"

81
minimuxer/minimuxer.swift Normal file
View File

@@ -0,0 +1,81 @@
//
// minimuxer.swift
// minimuxer
//
// Created by Jackson Coxson on 10/27/22.
//
import Foundation
public enum Uhoh: Error {
case Good
case Bad(code: Int32)
}
public func start_minimuxer(pairing_file: String) {
let pf = NSString(string: pairing_file)
let pf_pointer = UnsafeMutablePointer<CChar>(mutating: pf.utf8String)
let u = NSString(string: getDocumentsDirectory().absoluteString)
let u_ptr = UnsafeMutablePointer<CChar>(mutating: u.utf8String)
minimuxer_c_start(pf_pointer, u_ptr)
}
public func set_usbmuxd_socket() {
target_minimuxer_address()
}
public func debug_app(app_id: String) throws -> Uhoh {
let ai = NSString(string: app_id)
let ai_pointer = UnsafeMutablePointer<CChar>(mutating: ai.utf8String)
let res = minimuxer_debug_app(ai_pointer)
if res != 0 {
throw Uhoh.Bad(code: res)
}
return Uhoh.Good
}
public func install_provisioning_profile(plist: Data) throws -> Uhoh {
let pls = String(decoding: plist, as: UTF8.self)
print(pls)
print(plist)
let x = plist.withUnsafeBytes { buf in UnsafeMutableRawPointer(mutating: buf) }
let res = minimuxer_install_provisioning_profile(x, UInt32(plist.count))
if res != 0 {
throw Uhoh.Bad(code: res)
}
return Uhoh.Good
}
public func remove_provisioning_profile(id: String) throws -> Uhoh {
let id_ns = NSString(string: id)
let id_pointer = UnsafeMutablePointer<CChar>(mutating: id_ns.utf8String)
let res = minimuxer_remove_provisioning_profile(id_pointer)
if res != 0 {
throw Uhoh.Bad(code: res)
}
return Uhoh.Good
}
public func remove_app(app_id: String) throws -> Uhoh {
let ai = NSString(string: app_id)
let ai_pointer = UnsafeMutablePointer<CChar>(mutating: ai.utf8String)
let res = minimuxer_remove_app(ai_pointer)
if res != 0 {
throw Uhoh.Bad(code: res)
}
return Uhoh.Good
}
public func auto_mount_dev_image() {
let u = NSString(string: getDocumentsDirectory().absoluteString)
let u_ptr = UnsafeMutablePointer<CChar>(mutating: u.utf8String)
minimuxer_auto_mount(u_ptr)
}
func getDocumentsDirectory() -> URL {
// find all possible documents directories for this user
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
// just send back the first one, which ought to be the only one
return paths[0]
}