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
58pub struct SideloadConfiguration<'a> {
60 pub machine_name: String,
62 pub logger: &'a dyn SideloadLogger,
64 pub store_dir: std::path::PathBuf,
66 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}