Add support for logging in with SSO (#160)

This commit is contained in:
chloe 2023-11-04 17:39:17 -04:00 committed by GitHub
parent 8943909f06
commit 25eef55eb7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 129 additions and 4 deletions

View file

@ -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}");

View file

@ -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 {