difftreelog
feat auto prompter
in: trunk
9 files changed
Cargo.lockdiffbeforeafterboth308308309[[package]]309[[package]]310name = "bifrostlink"310name = "bifrostlink"311version = "0.2.3"311version = "0.2.4"312source = "registry+https://github.com/rust-lang/crates.io-index"312source = "registry+https://github.com/rust-lang/crates.io-index"313checksum = "704657867d2107831c57edd363726440c86675464b5fc113702854e17062cafc"313checksum = "ad2d0e30a2aa432b78f41f9676572f88201d4dc73bc2b7bc90704d2e02b7d062"314dependencies = [314dependencies = [315 "async-trait",315 "async-trait",316 "async_fn_traits",316 "async_fn_traits",327327328[[package]]328[[package]]329name = "bifrostlink-macros"329name = "bifrostlink-macros"330version = "0.2.3"330version = "0.2.4"331source = "registry+https://github.com/rust-lang/crates.io-index"331source = "registry+https://github.com/rust-lang/crates.io-index"332checksum = "158308eb569b467c0116680f79d0ecc389f4d540f6d5a0c9279bfe79b1cd5bdb"332checksum = "e2121559c45cbe89c4f8d1d741360d5b028577254f6beca053dc02332da85b43"333dependencies = [333dependencies = [334 "proc-macro2",334 "proc-macro2",335 "quote",335 "quote",338338339[[package]]339[[package]]340name = "bifrostlink-ports"340name = "bifrostlink-ports"341version = "0.2.3"341version = "0.2.4"342source = "registry+https://github.com/rust-lang/crates.io-index"342source = "registry+https://github.com/rust-lang/crates.io-index"343checksum = "7612993f0bd8bc6a71867461266567212a35a716b2a5aef5f9967ab08c891782"343checksum = "e9395c4ccca497b0c50583e6de57aca921c046ae0c10f56030cd2c5a20db05f8"344dependencies = [344dependencies = [345 "bifrostlink",345 "bifrostlink",346 "bytes",346 "bytes",183518351836[[package]]1836[[package]]1837name = "polkit-backend"1837name = "polkit-backend"1838version = "0.1.3"1838version = "0.1.4"1839dependencies = [1839dependencies = [1840 "anyhow",1840 "anyhow",1841 "clap",1841 "clap",205520552056[[package]]2056[[package]]2057name = "remowt-agent"2057name = "remowt-agent"2058version = "0.1.3"2058version = "0.1.4"2059dependencies = [2059dependencies = [2060 "anyhow",2060 "anyhow",2061 "bifrostlink",2061 "bifrostlink",208320832084[[package]]2084[[package]]2085name = "remowt-client"2085name = "remowt-client"2086version = "0.1.3"2086version = "0.1.4"2087dependencies = [2087dependencies = [2088 "anyhow",2088 "anyhow",2089 "bifrostlink",2089 "bifrostlink",210621062107[[package]]2107[[package]]2108name = "remowt-endpoints"2108name = "remowt-endpoints"2109version = "0.1.3"2109version = "0.1.4"2110dependencies = [2110dependencies = [2111 "anyhow",2111 "anyhow",2112 "bifrostlink",2112 "bifrostlink",212421242125[[package]]2125[[package]]2126name = "remowt-link-shared"2126name = "remowt-link-shared"2127version = "0.1.3"2127version = "0.1.4"2128dependencies = [2128dependencies = [2129 "bifrostlink",2129 "bifrostlink",2130 "bytes",2130 "bytes",213821382139[[package]]2139[[package]]2140name = "remowt-plugin"2140name = "remowt-plugin"2141version = "0.1.3"2141version = "0.1.4"2142dependencies = [2142dependencies = [2143 "anyhow",2143 "anyhow",2144 "bifrostlink",2144 "bifrostlink",215221522153[[package]]2153[[package]]2154name = "remowt-polkit-shared"2154name = "remowt-polkit-shared"2155version = "0.1.3"2155version = "0.1.4"2156dependencies = [2156dependencies = [2157 "nix",2157 "nix",2158 "serde",2158 "serde",216121612162[[package]]2162[[package]]2163name = "remowt-ssh"2163name = "remowt-ssh"2164version = "0.1.3"2164version = "0.1.4"2165dependencies = [2165dependencies = [2166 "anyhow",2166 "anyhow",2167 "async-trait",2167 "async-trait",218921892190[[package]]2190[[package]]2191name = "remowt-ui-prompt"2191name = "remowt-ui-prompt"2192version = "0.1.3"2192version = "0.1.4"2193dependencies = [2193dependencies = [2194 "anyhow",2194 "bifrostlink",2195 "bifrostlink",2195 "bifrostlink-macros",2196 "bifrostlink-macros",2196 "serde",2197 "serde",Cargo.tomldiffbeforeafterboth3resolver = "2"3resolver = "2"445[workspace.package]5[workspace.package]6version = "0.1.3"6version = "0.1.4"7license = "MIT"7license = "MIT"8edition = "2021"8edition = "2021"9repository = "https://git.delta.rocks/r/remowt"9repository = "https://git.delta.rocks/r/remowt"52thiserror = "2.0.18"52thiserror = "2.0.18"535354[profile.release]54[profile.release]55strip = true56panic = "abort"55panic = "abort"57opt-level = "z"56opt-level = "z"58lto = true57lto = truecmds/remowt-agent/src/askpass.rsdiffbeforeafterboth2use std::io::Write as _;2use std::io::Write as _;334use anyhow::Context as _;4use anyhow::Context as _;5use remowt_ui_prompt::bifrost::PromptEndpointsClient;6use remowt_ui_prompt::dbus::{DbusPrompterInterface, DbusPrompterProxy};5use remowt_ui_prompt::dbus::{DbusPrompterInterface, DbusPrompterProxy, BUS_NAME, PROMPTER_PATH};7use remowt_ui_prompt::Source;6use remowt_ui_prompt::{Prompter, Source};8use zbus::Connection;7use tracing::debug;910use remowt_link_shared::BifConfig;8use zbus::Connection;1112const BUS_NAME: &str = "lach.RemowtAskpass";13const PROMPTER_PATH: &str = "/lach/Askpass";14915pub async fn serve(10pub async fn serve<P>(conn: &Connection, prompter: P) -> anyhow::Result<()>16 conn: &Connection,11where17 prompter: PromptEndpointsClient<BifConfig>,12 P: Prompter + 'static,18) -> anyhow::Result<()> {13{19 conn.object_server()14 conn.object_server()20 .at(PROMPTER_PATH, DbusPrompterInterface(prompter))15 .at(PROMPTER_PATH, DbusPrompterInterface(prompter))21 .await?;16 .await?;22 conn.request_name(BUS_NAME).await?;17 match conn.request_name(BUS_NAME).await {18 Ok(()) => {}19 Err(zbus::Error::NameTaken) => {20 debug!("{BUS_NAME} already owned, chaining to upstream");21 }22 Err(e) => return Err(e.into()),23 }23 Ok(())24 Ok(())24}25}2526cmds/remowt-agent/src/main.rsdiffbeforeafterboth12use bifrostlink_ports::unix_socket::from_socket;12use bifrostlink_ports::unix_socket::from_socket;13use clap::Parser;13use clap::Parser;14use remowt_endpoints::{fs::Fs, nix_daemon::NixDaemon, pty::Pty, subprocess::Subprocess, systemd::Systemd};14use remowt_endpoints::{15 fs::Fs, nix_daemon::NixDaemon, pty::Pty, subprocess::Subprocess, systemd::Systemd,16};15use remowt_link_shared::{editor::EditorEndpointsClient, Address, BifConfig};17use remowt_link_shared::{editor::EditorEndpointsClient, Address, BifConfig};16use remowt_polkit_shared::{emphasize, BackendRequest, Identity, PidDisplay};18use remowt_polkit_shared::{emphasize, BackendRequest, Identity, PidDisplay};250 }252 }251}253}252async fn main_real() -> anyhow::Result<()> {254async fn main_real() -> anyhow::Result<()> {253 let conn = Connection::system().await?;255 let system_conn = Connection::system().await?;254 let helper = SocketHelper {256 let helper = SocketHelper {255 fallback: SuidHelper,257 fallback: SuidHelper,256 };258 };257 register_auth_agent(&conn, Agent::new(helper, RofiPrompter)).await?;259 register_auth_agent(&system_conn, Agent::new(helper, RofiPrompter)).await?;258260259 let _conn = conn;261 let session_conn = Connection::session().await?;262 askpass::serve(&session_conn, RofiPrompter).await?;263264 let _keep_alive = (system_conn, session_conn);260 pending().await265 pending().await261}266}262async fn main_real_agent(267async fn main_real_agent(cmds/remowt-ssh/src/main.rsdiffbeforeafterboth13use remowt_client::editor::SshEditor;13use remowt_client::editor::SshEditor;14use remowt_client::{AgentBundle, Remowt};14use remowt_client::{AgentBundle, Remowt};15use remowt_link_shared::editor::serve_editor;15use remowt_link_shared::editor::serve_editor;16use remowt_ui_prompt::bifrost::serve_prompts;16use remowt_ui_prompt::auto::AutoPrompter;17use remowt_ui_prompt::rofi::RofiPrompter;17use remowt_ui_prompt::bifrost::serve_prompts;18use remowt_ui_prompt::{PrependSourcePrompter, Source};18use remowt_ui_prompt::{PrependSourcePrompter, Source};19use tokio::io::unix::AsyncFd;19use tokio::io::unix::AsyncFd;20use tokio::io::{AsyncRead, ReadBuf};20use tokio::io::{AsyncRead, ReadBuf};61 serve_prompts(61 serve_prompts(62 &mut rpc,62 &mut rpc,63 PrependSourcePrompter {63 PrependSourcePrompter {64 prompter: RofiPrompter,64 prompter: AutoPrompter::new().await,65 source: match opts {65 source: match opts {66 Opts::Ssh { host, .. } => vec![Source(Cow::Owned(format!("ssh host: {}", host)))],66 Opts::Ssh { host, .. } => vec![Source(Cow::Owned(format!("ssh host: {}", host)))],67 Opts::Local { .. } => vec![],67 Opts::Local { .. } => vec![],crates/remowt-ui-prompt/Cargo.tomldiffbeforeafterboth6license.workspace = true6license.workspace = true778[dependencies]8[dependencies]9anyhow.workspace = true9bifrostlink.workspace = true10bifrostlink.workspace = true10bifrostlink-macros.workspace = true11bifrostlink-macros.workspace = true11serde.workspace = true12serde.workspace = truecrates/remowt-ui-prompt/src/auto.rsdiffbeforeafterbothno changes
crates/remowt-ui-prompt/src/dbus.rsdiffbeforeafterboth5use crate::{BlockingPrompter, Result};5use crate::{BlockingPrompter, Result};6use crate::{Error, Prompter};6use crate::{Error, Prompter};78pub const BUS_NAME: &str = "lach.RemowtAskpass";9pub const PROMPTER_PATH: &str = "/lach/Askpass";7108pub struct DbusPrompterInterface<P>(pub P);11pub struct DbusPrompterInterface<P>(pub P);91210#[interface(name = "lach.PolkitInputHandler")]13#[interface(name = "lach.PolkitInputHandler")]11impl<P: Prompter + Send + Sync + 'static> DbusPrompterInterface<P> {14impl<P: Prompter + Send + Sync + 'static> DbusPrompterInterface<P> {12 async fn prompt_radio(15 async fn prompt_enum(13 &self,16 &self,14 prompt: &str,17 prompt: &str,15 description: &str,18 description: &str,19 variants: Vec<String>,16 source: Vec<Source>,20 source: Vec<Source>,17 ) -> fdo::Result<bool> {21 ) -> fdo::Result<u32> {22 let variants: Vec<&str> = variants.iter().map(|v| v.as_str()).collect();18 Ok(self.0.prompt_radio(prompt, description, &source).await?)23 Ok(self24 .025 .prompt_enum(prompt, description, &variants, &source)26 .await?)19 }27 }20 async fn prompt_text(28 async fn prompt_text(crates/remowt-ui-prompt/src/lib.rsdiffbeforeafterboth3use std::future::Future;3use std::future::Future;4use std::result;4use std::result;556pub mod auto;6pub mod bifrost;7pub mod bifrost;7pub mod dbus;8pub mod dbus;8pub mod rofi;9pub mod rofi;