From fda43fc7427b60a7a10fa5a738ec863c2f6fc55d Mon Sep 17 00:00:00 2001 From: wolf4ood Date: Wed, 11 Sep 2024 23:08:26 +0200 Subject: [PATCH] feat: add support for configurable api keys with keyring --- Cargo.lock | 166 +++++++++++++++++- edc-connector-tui/Cargo.toml | 1 + edc-connector-tui/src/app.rs | 46 +++-- .../src/components/connectors.rs | 9 +- edc-connector-tui/src/config.rs | 26 +++ edc-connector-tui/src/types/connector.rs | 32 +++- 6 files changed, 258 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2051bc9..00ccd15 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -341,6 +341,30 @@ dependencies = [ "syn", ] +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi", +] + +[[package]] +name = "dbus-secret-service" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1caa0c241c01ad8d99a78d553567d38f873dd3ac16eca33a5370d650ab25584e" +dependencies = [ + "dbus", + "futures-util", + "num", + "once_cell", + "rand", +] + [[package]] name = "deranged" version = "0.3.11" @@ -423,6 +447,7 @@ dependencies = [ "edc-connector-client", "enum-ordinalize", "futures", + "keyring", "ratatui", "serde", "serde_json", @@ -967,6 +992,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keyring" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c163ef0b9da5ccf44ae4d7c9d24fb1a8750aa1969d484865fc1eedc44b26c09" +dependencies = [ + "byteorder", + "dbus-secret-service", + "security-framework", + "windows-sys 0.52.0", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -979,6 +1016,15 @@ version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +[[package]] +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "pkg-config", +] + [[package]] name = "libloading" version = "0.8.3" @@ -1110,17 +1156,81 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -1405,6 +1515,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro2" version = "1.0.81" @@ -1432,6 +1551,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "ratatui" version = "0.26.2" @@ -1607,18 +1756,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.198" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.198" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1794,9 +1943,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -2553,6 +2702,7 @@ version = "0.7.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" dependencies = [ + "byteorder", "zerocopy-derive", ] diff --git a/edc-connector-tui/Cargo.toml b/edc-connector-tui/Cargo.toml index 96d1a69..78bfbb1 100644 --- a/edc-connector-tui/Cargo.toml +++ b/edc-connector-tui/Cargo.toml @@ -21,3 +21,4 @@ edc-connector-client = { path = "../edc-connector-client", version = "0.1.0"} enum-ordinalize = "4.3.0" strum = "0.26.2" arboard = { version = "3.4.0", features = ["wayland-data-control"] } +keyring = { version = "3", features = ["apple-native", "windows-native", "sync-secret-service"] } diff --git a/edc-connector-tui/src/app.rs b/edc-connector-tui/src/app.rs index 925556d..8104dd8 100644 --- a/edc-connector-tui/src/app.rs +++ b/edc-connector-tui/src/app.rs @@ -5,7 +5,8 @@ pub mod model; mod msg; use crossterm::event::{self, Event, KeyCode}; -use edc_connector_client::EdcConnectorClient; +use edc_connector_client::{Auth, EdcConnectorClient}; +use keyring::Entry; use ratatui::{ layout::{Constraint, Direction, Layout, Rect}, Frame, @@ -18,9 +19,9 @@ use crate::{ header::HeaderComponent, launch_bar::LaunchBar, policies::PolicyDefinitionsComponent, Component, ComponentEvent, ComponentMsg, ComponentReturn, }, - config::Config, + config::{AuthKind, Config, ConnectorConfig}, types::{ - connector::Connector, + connector::{Connector, ConnectorStatus}, info::InfoSheet, nav::{Menu, Nav}, }, @@ -41,17 +42,42 @@ pub struct App { } impl App { + fn auth(cfg: &ConnectorConfig) -> (ConnectorStatus, Auth) { + match cfg.auth() { + AuthKind::NoAuth => (ConnectorStatus::Connected, Auth::NoAuth), + AuthKind::Token { token_alias } => { + let entry = + Entry::new("edc-tui", &token_alias).and_then(|entry| entry.get_password()); + + match entry { + Ok(pwd) => (ConnectorStatus::Connected, Auth::api_token(pwd)), + Err(_err) => ( + ConnectorStatus::Custom(format!( + "Token not found for alias {}", + token_alias + )), + Auth::NoAuth, + ), + } + } + } + } + + fn init_connector(cfg: ConnectorConfig) -> Connector { + let (status, auth) = Self::auth(&cfg); + let client = EdcConnectorClient::builder() + .management_url(cfg.address()) + .with_auth(auth) + .build() + .unwrap(); + Connector::new(cfg, client, status) + } + pub fn init(cfg: Config) -> App { let connectors = cfg .connectors .into_iter() - .map(|cfg| { - let client = EdcConnectorClient::builder() - .management_url(cfg.address()) - .build() - .unwrap(); - Connector::new(cfg, client) - }) + .map(App::init_connector) .collect(); let connectors = ConnectorsComponent::new(connectors); diff --git a/edc-connector-tui/src/components/connectors.rs b/edc-connector-tui/src/components/connectors.rs index 60bf522..89d543f 100644 --- a/edc-connector-tui/src/components/connectors.rs +++ b/edc-connector-tui/src/components/connectors.rs @@ -24,11 +24,16 @@ pub struct ConnectorEntry(Connector); impl TableEntry for ConnectorEntry { fn row(&self) -> Row { - Row::new(vec![self.0.config().name(), self.0.config().address()]) + Row::new(vec![ + self.0.config().name(), + self.0.config().address(), + self.0.config().auth().kind(), + self.0.status().as_str(), + ]) } fn headers() -> Row<'static> { - Row::new(vec!["NAME", "ADDRESS"]) + Row::new(vec!["NAME", "ADDRESS", "AUTH", "STATUS"]) } } diff --git a/edc-connector-tui/src/config.rs b/edc-connector-tui/src/config.rs index 946777b..4f95a45 100644 --- a/edc-connector-tui/src/config.rs +++ b/edc-connector-tui/src/config.rs @@ -47,6 +47,28 @@ pub fn default_file() -> anyhow::Result { pub struct ConnectorConfig { name: String, address: String, + #[serde(default)] + auth: AuthKind, +} + +#[derive(Deserialize, Debug, Clone, Default)] +#[serde(tag = "type")] +#[serde(rename_all = "kebab-case")] +pub enum AuthKind { + #[default] + NoAuth, + Token { + token_alias: String, + }, +} + +impl AuthKind { + pub fn kind(&self) -> &str { + match self { + AuthKind::NoAuth => "No auth", + AuthKind::Token { .. } => "Token based", + } + } } impl ConnectorConfig { @@ -57,4 +79,8 @@ impl ConnectorConfig { pub fn address(&self) -> &str { &self.address } + + pub fn auth(&self) -> &AuthKind { + &self.auth + } } diff --git a/edc-connector-tui/src/types/connector.rs b/edc-connector-tui/src/types/connector.rs index e0feb0f..6e56b38 100644 --- a/edc-connector-tui/src/types/connector.rs +++ b/edc-connector-tui/src/types/connector.rs @@ -8,11 +8,35 @@ use crate::config::ConnectorConfig; pub struct Connector { config: ConnectorConfig, client: EdcConnectorClient, + status: ConnectorStatus, +} + +#[derive(Clone, Debug)] +pub enum ConnectorStatus { + Connected, + Custom(String), +} + +impl ConnectorStatus { + pub fn as_str(&self) -> &str { + match self { + ConnectorStatus::Connected => "connected", + ConnectorStatus::Custom(msg) => &msg, + } + } } impl Connector { - pub fn new(config: ConnectorConfig, client: EdcConnectorClient) -> Self { - Self { config, client } + pub fn new( + config: ConnectorConfig, + client: EdcConnectorClient, + status: ConnectorStatus, + ) -> Self { + Self { + config, + client, + status, + } } pub fn config(&self) -> &ConnectorConfig { @@ -22,6 +46,10 @@ impl Connector { pub fn client(&self) -> &EdcConnectorClient { &self.client } + + pub fn status(&self) -> &ConnectorStatus { + &self.status + } } impl Debug for Connector {