comparison src/module.rs @ 72:47eb242a4f88

Fill out the PamHandle trait. This updates the PamHandle trait to have methods for each Item, and implements them on the LibPamHandle.
author Paul Fisher <paul@pfish.zone>
date Wed, 04 Jun 2025 03:53:36 -0400
parents 58f9d2a4df38
children ac6881304c78
comparison
equal deleted inserted replaced
71:58f9d2a4df38 72:47eb242a4f88
30 30
31 /// Authenticate the user. 31 /// Authenticate the user.
32 /// 32 ///
33 /// This is probably the first thing you want to implement. 33 /// This is probably the first thing you want to implement.
34 /// In most cases, you will want to get the user and password, 34 /// In most cases, you will want to get the user and password,
35 /// using [`LibPamHandle::get_user`] and [`LibPamHandle::get_authtok`], 35 /// using [`PamHandle::get_user`] and [`PamModuleHandle::get_authtok`],
36 /// and verify them against something. 36 /// and verify them against something.
37 /// 37 ///
38 /// See [the Module Writer's Guide entry for `pam_sm_authenticate`][mwg] 38 /// See [the Module Writer's Guide entry for `pam_sm_authenticate`][mwg]
39 /// for more information. 39 /// for more information.
40 /// 40 ///
253 /// # fn _do_test(conv: impl Conversation) -> Result<()> { 253 /// # fn _do_test(conv: impl Conversation) -> Result<()> {
254 /// let mut mux = ConversationMux(conv); 254 /// let mut mux = ConversationMux(conv);
255 /// let token = mux.masked_prompt("enter your one-time token")?; 255 /// let token = mux.masked_prompt("enter your one-time token")?;
256 /// # Ok(()) 256 /// # Ok(())
257 /// # } 257 /// # }
258 pub struct ConversationMux<C: Conversation>(pub C); 258 pub struct ConversationMux<'a, C: Conversation>(pub &'a mut C);
259 259
260 impl<C: Conversation> Conversation for ConversationMux<C> { 260 impl<C: Conversation> Conversation for ConversationMux<'_, C> {
261 fn send(&mut self, messages: &[Message]) -> Result<Vec<Response>> { 261 fn send(&mut self, messages: &[Message]) -> Result<Vec<Response>> {
262 self.0.send(messages) 262 self.0.send(messages)
263 } 263 }
264 } 264 }
265 265
266 impl<C: Conversation> ConversationMux<C> { 266 impl<C: Conversation> ConversationMux<'_, C> {
267 /// Prompts the user for something. 267 /// Prompts the user for something.
268 pub fn prompt(&mut self, request: &str) -> Result<String> { 268 pub fn prompt(&mut self, request: &str) -> Result<String> {
269 let resp = self.send(&[Message::Prompt(request)])?.pop(); 269 let resp = self.send(&[Message::Prompt(request)])?.pop();
270 match resp { 270 match resp {
271 Some(Response::Text(s)) => Ok(s), 271 Some(Response::Text(s)) => Ok(s),
522 panic!("messages is the wrong size ({len})", len = messages.len()) 522 panic!("messages is the wrong size ({len})", len = messages.len())
523 } 523 }
524 } 524 }
525 } 525 }
526 526
527 let mut mux = ConversationMux(MuxTester); 527 let mut tester = MuxTester;
528
529 let mut mux = ConversationMux(&mut tester);
528 assert_eq!("answer", mux.prompt("question").unwrap()); 530 assert_eq!("answer", mux.prompt("question").unwrap());
529 assert_eq!( 531 assert_eq!(
530 SecureString::from("open sesame"), 532 SecureString::from("open sesame"),
531 mux.masked_prompt("password!").unwrap() 533 mux.masked_prompt("password!").unwrap()
532 ); 534 );