mirror of
https://github.com/nab138/isideload.git
synced 2026-03-02 06:26:16 +01:00
Improve documentation and clean up temporary files
This commit is contained in:
@@ -79,9 +79,11 @@ pub struct SideloaderBuilder {
|
|||||||
//extensions_behavior: Option<ExtensionsBehavior>,
|
//extensions_behavior: Option<ExtensionsBehavior>,
|
||||||
storage: Option<Box<dyn SideloadingStorage>>,
|
storage: Option<Box<dyn SideloadingStorage>>,
|
||||||
machine_name: Option<String>,
|
machine_name: Option<String>,
|
||||||
|
delete_app_after_install: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SideloaderBuilder {
|
impl SideloaderBuilder {
|
||||||
|
/// Create a new `SideloaderBuilder` with the provided Apple developer session and Apple ID email.
|
||||||
pub fn new(developer_session: DeveloperSession, apple_email: String) -> Self {
|
pub fn new(developer_session: DeveloperSession, apple_email: String) -> Self {
|
||||||
SideloaderBuilder {
|
SideloaderBuilder {
|
||||||
team_selection: None,
|
team_selection: None,
|
||||||
@@ -90,6 +92,7 @@ impl SideloaderBuilder {
|
|||||||
machine_name: None,
|
machine_name: None,
|
||||||
apple_email,
|
apple_email,
|
||||||
max_certs_behavior: None,
|
max_certs_behavior: None,
|
||||||
|
delete_app_after_install: true,
|
||||||
// extensions_behavior: None,
|
// extensions_behavior: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,6 +131,12 @@ impl SideloaderBuilder {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set whether to delete the signed app from the temporary storage after installation. Defaults to `true`.
|
||||||
|
pub fn delete_app_after_install(mut self, delete: bool) -> Self {
|
||||||
|
self.delete_app_after_install = delete;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
// pub fn extensions_behavior(mut self, behavior: ExtensionsBehavior) -> Self {
|
// pub fn extensions_behavior(mut self, behavior: ExtensionsBehavior) -> Self {
|
||||||
// self.extensions_behavior = Some(behavior);
|
// self.extensions_behavior = Some(behavior);
|
||||||
// self
|
// self
|
||||||
@@ -145,6 +154,7 @@ impl SideloaderBuilder {
|
|||||||
.unwrap_or_else(|| Box::new(crate::util::storage::new_storage())),
|
.unwrap_or_else(|| Box::new(crate::util::storage::new_storage())),
|
||||||
// self.extensions_behavior
|
// self.extensions_behavior
|
||||||
// .unwrap_or(ExtensionsBehavior::RegisterAll),
|
// .unwrap_or(ExtensionsBehavior::RegisterAll),
|
||||||
|
self.delete_app_after_install,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ pub struct Sideloader {
|
|||||||
apple_email: String,
|
apple_email: String,
|
||||||
max_certs_behavior: MaxCertsBehavior,
|
max_certs_behavior: MaxCertsBehavior,
|
||||||
//extensions_behavior: ExtensionsBehavior,
|
//extensions_behavior: ExtensionsBehavior,
|
||||||
|
delete_app_after_install: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Sideloader {
|
impl Sideloader {
|
||||||
@@ -44,6 +45,7 @@ impl Sideloader {
|
|||||||
machine_name: String,
|
machine_name: String,
|
||||||
storage: Box<dyn SideloadingStorage>,
|
storage: Box<dyn SideloadingStorage>,
|
||||||
//extensions_behavior: ExtensionsBehavior,
|
//extensions_behavior: ExtensionsBehavior,
|
||||||
|
delete_app_after_install: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Sideloader {
|
Sideloader {
|
||||||
team_selection,
|
team_selection,
|
||||||
@@ -53,10 +55,11 @@ impl Sideloader {
|
|||||||
apple_email,
|
apple_email,
|
||||||
max_certs_behavior,
|
max_certs_behavior,
|
||||||
//extensions_behavior,
|
//extensions_behavior,
|
||||||
|
delete_app_after_install,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sign and install an app
|
/// Sign the app at the provided path and return the path to the signed app bundle (in a temp dir). To sign and install, see [`Self::install_app`].
|
||||||
pub async fn sign_app(
|
pub async fn sign_app(
|
||||||
&mut self,
|
&mut self,
|
||||||
app_path: PathBuf,
|
app_path: PathBuf,
|
||||||
@@ -178,10 +181,12 @@ impl Sideloader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "install")]
|
#[cfg(feature = "install")]
|
||||||
|
/// Sign and install an app to a device.
|
||||||
pub async fn install_app(
|
pub async fn install_app(
|
||||||
&mut self,
|
&mut self,
|
||||||
device_provider: &impl IdeviceProvider,
|
device_provider: &impl IdeviceProvider,
|
||||||
app_path: PathBuf,
|
app_path: PathBuf,
|
||||||
|
// this is gross but will be replaced with proper entitlement handling later
|
||||||
increased_memory_limit: bool,
|
increased_memory_limit: bool,
|
||||||
) -> Result<Option<SpecialApp>, Report> {
|
) -> Result<Option<SpecialApp>, Report> {
|
||||||
let device_info = IdeviceInfo::from_device(device_provider).await?;
|
let device_info = IdeviceInfo::from_device(device_provider).await?;
|
||||||
@@ -203,8 +208,15 @@ impl Sideloader {
|
|||||||
.await
|
.await
|
||||||
.context("Failed to install app on device")?;
|
.context("Failed to install app on device")?;
|
||||||
|
|
||||||
|
if self.delete_app_after_install {
|
||||||
|
if let Err(e) = tokio::fs::remove_dir_all(signed_app_path).await {
|
||||||
|
tracing::warn!("Failed to remove temporary signed app file: {}", e);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
Ok(special_app)
|
Ok(special_app)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the developer team according to the configured team selection behavior
|
/// Get the developer team according to the configured team selection behavior
|
||||||
pub async fn get_team(&mut self) -> Result<DeveloperTeam, Report> {
|
pub async fn get_team(&mut self) -> Result<DeveloperTeam, Report> {
|
||||||
let teams = self.dev_session.list_teams().await?;
|
let teams = self.dev_session.list_teams().await?;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use std::{collections::HashMap, sync::Mutex};
|
|||||||
use base64::prelude::*;
|
use base64::prelude::*;
|
||||||
use rootcause::prelude::*;
|
use rootcause::prelude::*;
|
||||||
|
|
||||||
|
/// A trait for storing and retrieving sideloading related data, such as anisette state and certificates.
|
||||||
pub trait SideloadingStorage: Send + Sync {
|
pub trait SideloadingStorage: Send + Sync {
|
||||||
fn store(&self, key: &str, value: &str) -> Result<(), Report>;
|
fn store(&self, key: &str, value: &str) -> Result<(), Report>;
|
||||||
fn retrieve(&self, key: &str) -> Result<Option<String>, Report>;
|
fn retrieve(&self, key: &str) -> Result<Option<String>, Report>;
|
||||||
@@ -24,6 +25,7 @@ pub trait SideloadingStorage: Send + Sync {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Factory function to create a new storage instance based on enabled features. The priority is `keyring-storage`, then `fs-storage`, and finally an in-memory storage if neither of those features are enabled.
|
||||||
pub fn new_storage() -> impl SideloadingStorage {
|
pub fn new_storage() -> impl SideloadingStorage {
|
||||||
#[cfg(feature = "keyring-storage")]
|
#[cfg(feature = "keyring-storage")]
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user