@@ -162,6 +162,8 @@ pub(crate) struct MockPrompterService {
162162 unlock_password : Arc < tokio:: sync:: Mutex < Option < oo7:: Secret > > > ,
163163 /// Whether to accept (true) or dismiss (false) prompts
164164 should_accept : Arc < tokio:: sync:: Mutex < bool > > ,
165+ /// Queue of passwords to use for for testing retry logic
166+ password_queue : Arc < tokio:: sync:: Mutex < Vec < oo7:: Secret > > > ,
165167}
166168
167169impl MockPrompterService {
@@ -171,13 +173,18 @@ impl MockPrompterService {
171173 "test-password-long-enough" ,
172174 ) ) ) ) ,
173175 should_accept : Arc :: new ( tokio:: sync:: Mutex :: new ( true ) ) ,
176+ password_queue : Arc :: new ( tokio:: sync:: Mutex :: new ( Vec :: new ( ) ) ) ,
174177 }
175178 }
176179
177180 /// Set whether prompts should be accepted or dismissed
178181 pub async fn set_accept ( & self , accept : bool ) {
179182 * self . should_accept . lock ( ) . await = accept;
180183 }
184+
185+ pub async fn set_password_queue ( & self , passwords : Vec < oo7:: Secret > ) {
186+ * self . password_queue . lock ( ) . await = passwords;
187+ }
181188}
182189
183190#[ zbus:: interface( name = "org.gnome.keyring.internal.Prompter" ) ]
@@ -240,6 +247,7 @@ impl MockPrompterService {
240247 let callback_path = callback. to_owned ( ) ;
241248 let unlock_password = self . unlock_password . clone ( ) ;
242249 let should_accept = self . should_accept . clone ( ) ;
250+ let password_queue = self . password_queue . clone ( ) ;
243251 let exchange = exchange. to_owned ( ) ;
244252 let connection = connection. clone ( ) ;
245253
@@ -266,24 +274,29 @@ impl MockPrompterService {
266274 . await ?;
267275 tracing:: debug!( "MockPrompter: PromptReady(no) completed" ) ;
268276
269- // Call PromptDone to clean up the callback
270- tracing:: debug!( "MockPrompter: calling PromptDone" ) ;
271- connection
272- . call_method (
273- None :: < ( ) > ,
274- & callback_path,
275- Some ( "org.gnome.keyring.internal.Prompter.Callback" ) ,
276- "PromptDone" ,
277- & ( ) ,
278- )
279- . await ?;
280- tracing:: debug!( "MockPrompter: PromptDone completed" ) ;
281-
282277 return Ok ( ( ) ) ;
283278 } else if type_ == PromptType :: Password {
284279 tracing:: debug!( "MockPrompter: performing unlock (password prompt)" ) ;
285280 // Unlock prompt - perform secret exchange
286- let password = unlock_password. lock ( ) . await . clone ( ) . unwrap ( ) ;
281+
282+ let mut queue = password_queue. lock ( ) . await ;
283+ let password = if !queue. is_empty ( ) {
284+ let pwd = queue. remove ( 0 ) ;
285+ tracing:: debug!(
286+ "MockPrompter: using password from queue (length: {}, queue remaining: {})" ,
287+ std:: str :: from_utf8( pwd. as_bytes( ) ) . unwrap_or( "<binary>" ) ,
288+ queue. len( )
289+ ) ;
290+ pwd
291+ } else {
292+ let pwd = unlock_password. lock ( ) . await . clone ( ) . unwrap ( ) ;
293+ tracing:: debug!(
294+ "MockPrompter: using default password (length: {})" ,
295+ std:: str :: from_utf8( pwd. as_bytes( ) ) . unwrap_or( "<binary>" )
296+ ) ;
297+ pwd
298+ } ;
299+ drop ( queue) ;
287300
288301 // Generate our own key pair
289302 let private_key = oo7:: Key :: generate_private_key ( ) . unwrap ( ) ;
@@ -330,27 +343,40 @@ impl MockPrompterService {
330343 tracing:: debug!( "MockPrompter: PromptReady(yes) completed" ) ;
331344 }
332345
333- // Call PromptDone to clean up the callback
334- tracing:: debug!( "MockPrompter: calling PromptDone" ) ;
335- connection
346+ Ok :: < _ , zbus:: Error > ( ( ) )
347+ } ) ;
348+
349+ Ok ( ( ) )
350+ }
351+
352+ async fn stop_prompting (
353+ & self ,
354+ callback : ObjectPath < ' _ > ,
355+ #[ zbus( connection) ] connection : & zbus:: Connection ,
356+ ) -> zbus:: fdo:: Result < ( ) > {
357+ tracing:: debug!( "MockPrompter: stop_prompting called for {}" , callback) ;
358+ let callback_path = callback. to_owned ( ) ;
359+ let connection = connection. clone ( ) ;
360+
361+ tokio:: spawn ( async move {
362+ tracing:: debug!( "MockPrompter: calling PromptDone for {}" , callback_path) ;
363+ let result = connection
336364 . call_method (
337365 None :: < ( ) > ,
338366 & callback_path,
339367 Some ( "org.gnome.keyring.internal.Prompter.Callback" ) ,
340368 "PromptDone" ,
341369 & ( ) ,
342370 )
343- . await ?;
344- tracing:: debug!( "MockPrompter: PromptDone completed" ) ;
371+ . await ;
345372
346- Ok :: < _ , zbus:: Error > ( ( ) )
373+ if let Err ( err) = result {
374+ tracing:: debug!( "MockPrompter: PromptDone failed: {}" , err) ;
375+ } else {
376+ tracing:: debug!( "MockPrompter: PromptDone completed for {}" , callback_path) ;
377+ }
347378 } ) ;
348379
349380 Ok ( ( ) )
350381 }
351-
352- async fn stop_prompting ( & self , _callback : ObjectPath < ' _ > ) -> zbus:: fdo:: Result < ( ) > {
353- // Called when prompting is complete
354- Ok ( ( ) )
355- }
356382}
0 commit comments