use rsasl::prelude::*;
use std::io;
use std::io::Cursor;
pub fn main() {
let mut username = String::new();
println!("Enter username:");
if let Err(error) = io::stdin().read_line(&mut username) {
println!("error: {error}");
return;
}
println!("\nEnter password:");
let mut password = String::new();
if let Err(error) = io::stdin().read_line(&mut password) {
println!("error: {error}");
return;
}
println!();
let config = SASLConfig::with_credentials(None, username, password).unwrap();
let sasl = SASLClient::new(config);
let offered = [Mechname::parse(b"PLAIN").unwrap()];
let mut session = sasl.start_suggested(&offered).unwrap();
let mut out = Cursor::new(Vec::new());
let input: Option<&[u8]> = None;
let state = session.step(input, &mut out).unwrap();
match state {
State::Running => panic!("PLAIN exchange took more than one step"),
State::Finished(MessageSent::Yes) => {
let buffer = out.into_inner();
println!("Encoded bytes: {buffer:?}");
println!("As string: {:?}", std::str::from_utf8(buffer.as_ref()));
}
State::Finished(MessageSent::No) => {
panic!("PLAIN exchange produced no output")
}
}
}