isideload/
lib.rs

1pub mod application;
2pub mod bundle;
3pub mod certificate;
4pub mod developer_session;
5pub mod device;
6pub mod sideload;
7
8use std::io::Error as IOError;
9
10pub use icloud_auth::{AnisetteConfiguration, AppleAccount};
11
12use developer_session::DeveloperTeam;
13use idevice::IdeviceError;
14use thiserror::Error as ThisError;
15use zsign_rust::ZSignError;
16
17#[derive(Debug, ThisError)]
18pub enum Error {
19    #[error("Authentication error {0}: {1}")]
20    Auth(i64, String),
21    #[error("Developer session error {0}: {1}")]
22    DeveloperSession(i64, String),
23    #[error("Error: {0}")]
24    Generic(String),
25    #[error("Failed to parse: {0}")]
26    Parse(String),
27    #[error("Invalid bundle: {0}")]
28    InvalidBundle(String),
29    #[error("Certificate error: {0}")]
30    Certificate(String),
31    #[error(transparent)]
32    Filesystem(#[from] IOError),
33    #[error(transparent)]
34    IdeviceError(#[from] IdeviceError),
35    #[error(transparent)]
36    ZSignError(#[from] ZSignError),
37    #[error(transparent)]
38    ICloudError(#[from] icloud_auth::Error),
39}
40
41pub trait SideloadLogger: Send + Sync {
42    fn log(&self, message: &str);
43    fn error(&self, error: &Error);
44}
45
46pub struct DefaultLogger;
47
48impl SideloadLogger for DefaultLogger {
49    fn log(&self, message: &str) {
50        println!("{message}");
51    }
52
53    fn error(&self, error: &Error) {
54        eprintln!("Error: {}", error);
55    }
56}
57
58/// Sideload configuration options.
59pub struct SideloadConfiguration<'a> {
60    /// An arbitrary machine name to appear on the certificate (e.x. "YCode")
61    pub machine_name: String,
62    /// Logger for reporting progress and errors
63    pub logger: &'a dyn SideloadLogger,
64    /// Directory used to store intermediate artifacts (profiles, certs, etc.). This directory will not be cleared at the end.
65    pub store_dir: std::path::PathBuf,
66    /// Whether or not to revoke the certificate immediately after installation
67    pub revoke_cert: bool,
68}
69
70impl Default for SideloadConfiguration<'_> {
71    fn default() -> Self {
72        SideloadConfiguration::new()
73    }
74}
75
76impl<'a> SideloadConfiguration<'a> {
77    pub fn new() -> Self {
78        SideloadConfiguration {
79            machine_name: "isideload".to_string(),
80            logger: &DefaultLogger,
81            store_dir: std::env::current_dir().unwrap(),
82            revoke_cert: false,
83        }
84    }
85
86    pub fn set_machine_name(mut self, machine_name: String) -> Self {
87        self.machine_name = machine_name;
88        self
89    }
90
91    pub fn set_logger(mut self, logger: &'a dyn SideloadLogger) -> Self {
92        self.logger = logger;
93        self
94    }
95
96    pub fn set_store_dir(mut self, store_dir: std::path::PathBuf) -> Self {
97        self.store_dir = store_dir;
98        self
99    }
100
101    pub fn set_revoke_cert(mut self, revoke_cert: bool) -> Self {
102        self.revoke_cert = revoke_cert;
103        self
104    }
105}
106
107#[cfg(feature = "obfuscate")]
108#[macro_export]
109macro_rules! obf {
110    ($lit:literal) => {
111        &obfstr::obfstring!($lit)
112    };
113}
114
115#[cfg(not(feature = "obfuscate"))]
116#[macro_export]
117macro_rules! obf {
118    ($lit:literal) => {
119        &$lit.to_string()
120    };
121}