git.delta.rocks / remowt / refs/commits / 023a07f7fe9b

difftreelog

source

cmds/remowt-agent/src/helper/socket.rs1.4 KiBsourcehistory
1use anyhow::{anyhow, bail};2use nix::unistd::User;3use remowt_polkit_shared::Identity;4use remowt_ui_prompt::Prompter;5use tokio::io::AsyncWriteExt as _;6use tokio::net::UnixStream;7use tracing::debug;89use super::protocol::run_conversation;10use super::Helper;1112/// Polkit 127 introduced an alternative backend similar to `lach.PolkitHelper`13const SOCKET_PATH: &str = "/run/polkit/agent-helper.socket";1415#[derive(Clone)]16pub struct SocketHelper<F> {17	pub fallback: F,18}1920impl<F: Helper + Sync> Helper for SocketHelper<F> {21	async fn help_me<P: Prompter + Send + Sync + 'static>(22		&self,23		cookie: &str,24		prompt: P,25		identity: Identity,26	) -> anyhow::Result<()> {27		let Some(uid) = identity.uid() else {28			bail!("can't process identity");29		};3031		let stream = match UnixStream::connect(SOCKET_PATH).await {32			Ok(stream) => stream,33			Err(e) => {34				debug!("agent-helper.socket unavailable ({e}), using fallback helper");35				return self.fallback.help_me(cookie, prompt, identity).await;36			}37		};3839		let user = User::from_uid(uid)40			.map_err(|e| anyhow!("error querying user: {e}"))?41			.ok_or_else(|| anyhow!("user not found"))?;4243		assert!(!cookie.contains('\n'));44		let (reader, mut writer) = stream.into_split();4546		writer.write_all(user.name.as_bytes()).await?;47		writer.write_all(b"\n").await?;48		writer.write_all(cookie.as_bytes()).await?;49		writer.write_all(b"\n").await?;5051		run_conversation(reader, writer, prompt).await52	}53}