@@ -6,15 +6,16 @@ use isideload::{
66 certificates:: { CertificatesApi , DevelopmentCertificate } ,
77 developer_session:: DeveloperSession ,
88 } ,
9- sideload:: { builder:: MaxCertsBehavior , sideloader:: Sideloader , SideloaderBuilder } ,
10- util:: keyring_storage:: KeyringStorage ,
9+ sideload:: { SideloaderBuilder , builder:: MaxCertsBehavior , sideloader:: Sideloader } ,
10+ util:: { fs_storage :: FsStorage , keyring_storage:: KeyringStorage , storage :: SideloadingStorage } ,
1111} ;
1212use keyring:: Entry ;
1313use serde:: { Deserialize , Serialize } ;
1414use serde_json:: Value ;
15- use std:: time:: Duration ;
16- use tauri:: { AppHandle , Emitter , Listener , State , Window } ;
15+ use std:: { path :: PathBuf , time:: Duration } ;
16+ use tauri:: { AppHandle , Emitter , Listener , Manager , State , Window } ;
1717use tauri_plugin_store:: StoreExt ;
18+ use tracing:: warn;
1819
1920use crate :: sideload:: { SideloaderGuard , SideloaderMutex } ;
2021
@@ -28,7 +29,7 @@ pub async fn login_new(
2829 anisette_server : String ,
2930 save_credentials : bool ,
3031) -> Result < ( ) , String > {
31- let account = login ( & window, & email, & password, anisette_server) . await ?;
32+ let account = login ( & handle , & window, & email, & password, anisette_server) . await ?;
3233 let mut sideloader_guard = sideloader_state. lock ( ) . unwrap ( ) ;
3334 * sideloader_guard = Some ( account) ;
3435
@@ -58,6 +59,7 @@ pub async fn login_new(
5859
5960#[ tauri:: command]
6061pub async fn login_stored (
62+ handle : AppHandle ,
6163 window : Window ,
6264 email : String ,
6365 anisette_server : String ,
@@ -68,7 +70,7 @@ pub async fn login_stored(
6870 let password = pass_entry
6971 . get_password ( )
7072 . map_err ( |e| format ! ( "Failed to get credentials: {:?}" , e) ) ?;
71- let account = login ( & window, & email, & password, anisette_server) . await ?;
73+ let account = login ( & handle , & window, & email, & password, anisette_server) . await ?;
7274 let mut sideloader_guard = sideloader_state. lock ( ) . unwrap ( ) ;
7375 * sideloader_guard = Some ( account) ;
7476
@@ -123,6 +125,7 @@ pub fn reset_anisette_state() -> Result<(), String> {
123125}
124126
125127async fn login (
128+ app : & AppHandle ,
126129 window : & Window ,
127130 email : & str ,
128131 password : & str ,
@@ -158,11 +161,31 @@ async fn login(
158161 anisette_server
159162 } ;
160163
164+ let ( anisette_storage, sideloader_storage) : (
165+ Box < dyn SideloadingStorage > ,
166+ Box < dyn SideloadingStorage > ,
167+ ) = if keyring_available ( ) {
168+ (
169+ Box :: new ( KeyringStorage :: new ( "iloader" . to_string ( ) ) ) ,
170+ Box :: new ( KeyringStorage :: new ( "iloader" . to_string ( ) ) ) ,
171+ )
172+ } else {
173+ warn ! ( "Keyring storage is not available, falling back to file storage (less secure)" ) ;
174+ let data_dir = app
175+ . path ( )
176+ . app_data_dir ( )
177+ . unwrap_or_else ( |_| PathBuf :: from ( "Failed to get app data directory" ) ) ;
178+ (
179+ Box :: new ( FsStorage :: new ( data_dir. clone ( ) ) ) ,
180+ Box :: new ( FsStorage :: new ( data_dir) ) ,
181+ )
182+ } ;
183+
161184 let mut account = AppleAccount :: builder ( email)
162185 . anisette_provider (
163186 RemoteV3AnisetteProvider :: default ( )
164187 . set_serial_number ( "0" . to_string ( ) )
165- . set_storage ( Box :: new ( KeyringStorage :: new ( "iloader" . to_string ( ) ) ) )
188+ . set_storage ( anisette_storage )
166189 . set_url ( & anisette_url) ,
167190 )
168191 . login ( password, tfa_closure)
@@ -207,7 +230,7 @@ async fn login(
207230 // TODO: Team Selection
208231 SideloaderBuilder :: new ( dev_session, account. email )
209232 . machine_name ( "iloader" . to_string ( ) )
210- . storage ( Box :: new ( KeyringStorage :: new ( "iloader" . to_string ( ) ) ) )
233+ . storage ( sideloader_storage )
211234 . max_certs_behavior ( MaxCertsBehavior :: Prompt ( Box :: new ( max_certs_callback) ) )
212235 . build ( ) ,
213236 )
@@ -317,3 +340,7 @@ pub async fn delete_app_id(
317340
318341 Ok ( ( ) )
319342}
343+
344+ fn keyring_available ( ) -> bool {
345+ keyring:: Entry :: new ( "iloader" , "test" ) . is_ok ( )
346+ }
0 commit comments