Fix linux build and add increased memory entitlement support

This commit is contained in:
nab138
2026-02-14 13:11:47 -05:00
parent 4c4a5d0051
commit ccc8a685bf
7 changed files with 86 additions and 12 deletions

View File

@@ -43,6 +43,12 @@ jobs:
- name: Install Rust stable - name: Install Rust stable
uses: dtolnay/rust-toolchain@stable uses: dtolnay/rust-toolchain@stable
- name: Install Linux dependencies
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y pkg-config libdbus-1-dev
- name: Build - name: Build
run: cargo build -p minimal run: cargo build -p minimal

View File

@@ -23,6 +23,6 @@ This project is licensed under the MIT License. See the [LICENSE](LICENSE) file
## Credits ## Credits
- The [idevice](https://github.com/jkcoxson/idevice) crate is used to communicate with the device - The [idevice](https://github.com/jkcoxson/idevice) crate is used to communicate with the device
- A [modified version of apple-platform-rs](https://github.com/nab138/isideload-apple-platform-rs) was used for codesigning - A [modified version of apple-platform-rs](https://github.com/nab138/isideload-apple-platform-rs) was used for codesigning, based off [plume-apple-platform-rs](https://github.com/plumeimpactor/plume-apple-platform-rs)
- [Sideloader](https://github.com/Dadoum/Sideloader) was used as a reference for how some of the private API endpoints work - [Sideloader](https://github.com/Dadoum/Sideloader) was used as a reference for how some of the private API endpoints work
- [Impactor](https://github.com/khcrysalis/Impactor) was used as a reference for some cryptography code - [Impactor](https://github.com/khcrysalis/Impactor) was used as a reference for some cryptography code

View File

@@ -132,7 +132,7 @@ async fn main() {
.machine_name("isideload-minimal".to_string()) .machine_name("isideload-minimal".to_string())
.build(); .build();
let result = sideloader.install_app(&provider, app_path).await; let result = sideloader.install_app(&provider, app_path, true).await;
match result { match result {
Ok(_) => println!("App installed successfully"), Ok(_) => println!("App installed successfully"),
Err(e) => panic!("Failed to install app: {:?}", e), Err(e) => panic!("Failed to install app: {:?}", e),

View File

@@ -97,6 +97,15 @@ impl GrandSlam {
Ok(builder) Ok(builder)
} }
pub fn patch(&self, url: &str) -> Result<reqwest::RequestBuilder, Report> {
let builder = self
.client
.patch(url)
.headers(Self::base_headers(&self.client_info, false)?);
Ok(builder)
}
pub async fn plist_request( pub async fn plist_request(
&self, &self,
url: &str, url: &str,

View File

@@ -8,6 +8,7 @@ use crate::{
}; };
use plist::{Data, Date, Dictionary, Value}; use plist::{Data, Date, Dictionary, Value};
use plist_macro::plist; use plist_macro::plist;
use reqwest::header::HeaderValue;
use rootcause::prelude::*; use rootcause::prelude::*;
use serde::Deserialize; use serde::Deserialize;
@@ -171,6 +172,41 @@ pub trait AppIdsApi {
Ok(response) Ok(response)
} }
async fn add_increased_memory_limit(
&mut self,
team: &DeveloperTeam,
app_id: &AppId,
) -> Result<(), Report> {
let dev_session = self.developer_session();
let mut headers = dev_session.get_headers().await?;
headers.insert(
"Content-Type",
HeaderValue::from_static("application/vnd.api+json"),
);
headers.insert(
"Accept",
HeaderValue::from_static("application/vnd.api+json"),
);
dev_session
.get_grandslam_client()
.patch(&format!(
"https://developerservices2.apple.com/services/v1/bundleIds/{}",
app_id.app_id_id
))?
.headers(headers)
.body(format!(
"{{\"data\":{{\"relationships\":{{\"bundleIdCapabilities\":{{\"data\":[{{\"relationships\":{{\"capability\":{{\"data\":{{\"id\":\"INCREASED_MEMORY_LIMIT\",\"type\":\"capabilities\"}}}}}},\"type\":\"bundleIdCapabilities\",\"attributes\":{{\"settings\":[],\"enabled\":true}}}}]}}}},\"id\":\"{}\",\"attributes\":{{\"hasExclusiveManagedCapabilities\":false,\"teamId\":\"{}\",\"bundleType\":\"bundle\",\"identifier\":\"{}\",\"seedId\":\"{}\",\"name\":\"{}\"}},\"type\":\"bundleIds\"}}}}",
app_id.app_id_id, team.team_id, app_id.identifier, team.team_id, app_id.name
))
.send()
.await.context("Failed to request increased memory entitlement")?
.error_for_status().context("Failed to add increased memory entitlement")?;
Ok(())
}
} }
impl AppIdsApi for DeveloperSession { impl AppIdsApi for DeveloperSession {

View File

@@ -2,6 +2,7 @@ use std::sync::Arc;
use plist::Dictionary; use plist::Dictionary;
use plist_macro::{plist, plist_to_xml_string}; use plist_macro::{plist, plist_to_xml_string};
use reqwest::header::{HeaderMap, HeaderValue};
use rootcause::prelude::*; use rootcause::prelude::*;
use serde::de::DeserializeOwned; use serde::de::DeserializeOwned;
use tracing::{error, warn}; use tracing::{error, warn};
@@ -65,6 +66,26 @@ impl DeveloperSession {
)) ))
} }
pub async fn get_headers(&mut self) -> Result<HeaderMap, Report> {
let mut headers = self
.anisette_generator
.get_anisette_data(self.client.clone())
.await?
.get_header_map();
headers.insert(
"X-Apple-GS-Token",
HeaderValue::from_str(&self.token.token)?,
);
headers.insert("X-Apple-I-Identity-Id", HeaderValue::from_str(&self.adsid)?);
Ok(headers)
}
pub fn get_grandslam_client(&self) -> Arc<GrandSlam> {
self.client.clone()
}
async fn send_dev_request_internal( async fn send_dev_request_internal(
&mut self, &mut self,
url: &str, url: &str,
@@ -85,14 +106,7 @@ impl DeveloperSession {
.client .client
.post(url)? .post(url)?
.body(plist_to_xml_string(&body)) .body(plist_to_xml_string(&body))
.header("X-Apple-GS-Token", &self.token.token) .headers(self.get_headers().await?)
.header("X-Apple-I-Identity-Id", &self.adsid)
.headers(
self.anisette_generator
.get_anisette_data(self.client.clone())
.await?
.get_header_map(),
)
.send() .send()
.await? .await?
.error_for_status() .error_for_status()

View File

@@ -63,6 +63,8 @@ impl Sideloader {
&mut self, &mut self,
app_path: PathBuf, app_path: PathBuf,
team: Option<DeveloperTeam>, team: Option<DeveloperTeam>,
// this will be replaced with proper entitlement handling later
increased_memory_limit: bool,
) -> Result<PathBuf, Report> { ) -> Result<PathBuf, Report> {
let team = match team { let team = match team {
Some(t) => t, Some(t) => t,
@@ -128,7 +130,11 @@ impl Sideloader {
.assign_app_group(&team, &app_group, app_id, None) .assign_app_group(&team, &app_group, app_id, None)
.await?; .await?;
// TODO: Increased memory entitlement if increased_memory_limit {
self.dev_session
.add_increased_memory_limit(&team, app_id)
.await?;
}
} }
app.apply_special_app_behavior(&special, &group_identifier, &cert_identity) app.apply_special_app_behavior(&special, &group_identifier, &cert_identity)
@@ -189,6 +195,7 @@ impl Sideloader {
&mut self, &mut self,
device_provider: &impl IdeviceProvider, device_provider: &impl IdeviceProvider,
app_path: PathBuf, app_path: PathBuf,
increased_memory_limit: bool,
) -> Result<(), Report> { ) -> Result<(), Report> {
let device_info = IdeviceInfo::from_device(device_provider).await?; let device_info = IdeviceInfo::from_device(device_provider).await?;
@@ -197,7 +204,9 @@ impl Sideloader {
.ensure_device_registered(&team, &device_info.name, &device_info.udid, None) .ensure_device_registered(&team, &device_info.name, &device_info.udid, None)
.await?; .await?;
let signed_app_path = self.sign_app(app_path, Some(team)).await?; let signed_app_path = self
.sign_app(app_path, Some(team), increased_memory_limit)
.await?;
info!("Installing..."); info!("Installing...");