mirror of
https://github.com/youwen5/iamb.git
synced 2025-06-20 13:49:52 -07:00
Add support for logging in with SSO (#160)
This commit is contained in:
parent
8943909f06
commit
25eef55eb7
5 changed files with 129 additions and 4 deletions
19
src/main.rs
19
src/main.rs
|
@ -679,9 +679,24 @@ async fn login(worker: Requester, settings: &ApplicationSettings) -> IambResult<
|
|||
}
|
||||
|
||||
loop {
|
||||
let password = rpassword::prompt_password("Password: ")?;
|
||||
println!("Please select login type: [p]assword / [s]ingle sign on");
|
||||
|
||||
match worker.login(LoginStyle::Password(password)) {
|
||||
let mut input = String::new();
|
||||
std::io::stdin().read_line(&mut input).unwrap();
|
||||
|
||||
let login_style = match input.chars().next().map(|c| c.to_ascii_lowercase()) {
|
||||
None | Some('p') => {
|
||||
let password = rpassword::prompt_password("Password: ")?;
|
||||
LoginStyle::Password(password)
|
||||
},
|
||||
Some('s') => LoginStyle::SingleSignOn,
|
||||
Some(_) => {
|
||||
println!("Failed to login. Please enter 'p' or 's'");
|
||||
continue;
|
||||
},
|
||||
};
|
||||
|
||||
match worker.login(login_style) {
|
||||
Ok(info) => {
|
||||
if let Some(msg) = info {
|
||||
println!("{msg}");
|
||||
|
|
|
@ -421,6 +421,7 @@ async fn send_receipts_forever(client: &Client, store: &AsyncProgramStore) {
|
|||
pub enum LoginStyle {
|
||||
SessionRestore(Session),
|
||||
Password(String),
|
||||
SingleSignOn,
|
||||
}
|
||||
|
||||
pub struct ClientResponse<T>(Receiver<T>);
|
||||
|
@ -1071,6 +1072,29 @@ impl ClientWorker {
|
|||
let session = Session::from(resp);
|
||||
serde_json::to_writer(writer, &session).map_err(IambError::from)?;
|
||||
},
|
||||
LoginStyle::SingleSignOn => {
|
||||
let resp = client
|
||||
.login_sso(|url| {
|
||||
let opened = format!(
|
||||
"The following URL should have been opened in your browser:\n {url}"
|
||||
);
|
||||
|
||||
async move {
|
||||
tokio::task::spawn_blocking(move || open::that(url));
|
||||
println!("\n{opened}\n");
|
||||
Ok(())
|
||||
}
|
||||
})
|
||||
.initial_device_display_name(initial_devname().as_str())
|
||||
.send()
|
||||
.await
|
||||
.map_err(IambError::from)?;
|
||||
|
||||
let file = File::create(self.settings.session_json.as_path())?;
|
||||
let writer = BufWriter::new(file);
|
||||
let session = Session::from(resp);
|
||||
serde_json::to_writer(writer, &session).map_err(IambError::from)?;
|
||||
},
|
||||
}
|
||||
|
||||
self.sync_handle = tokio::spawn(async move {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue