1use std::borrow::Cow;2use std::io::Write as _;34use anyhow::Context as _;5use ui_prompt::bifrost::PromptEndpointsClient;6use ui_prompt::dbus::{DbusPrompterInterface, DbusPrompterProxy};7use ui_prompt::Source;8use zbus::Connection;910use remowt_link_shared::BifConfig;1112const BUS_NAME: &str = "lach.RemowtAskpass";13const PROMPTER_PATH: &str = "/lach/Askpass";1415pub async fn serve(16 conn: &Connection,17 prompter: PromptEndpointsClient<BifConfig>,18) -> anyhow::Result<()> {19 conn.object_server()20 .at(PROMPTER_PATH, DbusPrompterInterface(prompter))21 .await?;22 conn.request_name(BUS_NAME).await?;23 Ok(())24}2526pub async fn ask(prompt: &str, description: String) -> anyhow::Result<()> {27 let conn = Connection::session()28 .await29 .context("connecting to the session bus (DBUS_SESSION_BUS_ADDRESS)")?;30 let proxy = DbusPrompterProxy::builder(&conn)31 .destination(BUS_NAME)?32 .path(PROMPTER_PATH)?33 .build()34 .await?;3536 let password = proxy37 .prompt_text(38 false,39 prompt,40 &description,41 &[Source(Cow::Borrowed("remowt-askpass"))],42 )43 .await?;4445 let mut out = std::io::stdout().lock();46 out.write_all(password.as_bytes())?;47 out.write_all(b"\n")?;48 out.flush()?;49 Ok(())50}