remowt-agent 0.1.0

remowt on-host agent serving fs/pty/systemd endpoints over bifrostlink
use std::borrow::Cow;
use std::io::Write as _;

use anyhow::Context as _;
use remowt_ui_prompt::bifrost::PromptEndpointsClient;
use remowt_ui_prompt::dbus::{DbusPrompterInterface, DbusPrompterProxy};
use remowt_ui_prompt::Source;
use zbus::Connection;

use remowt_link_shared::BifConfig;

const BUS_NAME: &str = "lach.RemowtAskpass";
const PROMPTER_PATH: &str = "/lach/Askpass";

pub async fn serve(
	conn: &Connection,
	prompter: PromptEndpointsClient<BifConfig>,
) -> anyhow::Result<()> {
	conn.object_server()
		.at(PROMPTER_PATH, DbusPrompterInterface(prompter))
		.await?;
	conn.request_name(BUS_NAME).await?;
	Ok(())
}

pub async fn ask(prompt: &str, description: String) -> anyhow::Result<()> {
	let conn = Connection::session()
		.await
		.context("connecting to the session bus (DBUS_SESSION_BUS_ADDRESS)")?;
	let proxy = DbusPrompterProxy::builder(&conn)
		.destination(BUS_NAME)?
		.path(PROMPTER_PATH)?
		.build()
		.await?;

	let password = proxy
		.prompt_text(
			false,
			prompt,
			&description,
			&[Source(Cow::Borrowed("remowt-askpass"))],
		)
		.await?;

	let mut out = std::io::stdout().lock();
	out.write_all(password.as_bytes())?;
	out.write_all(b"\n")?;
	out.flush()?;
	Ok(())
}