Skip to content

Commit 9c4f8a2

Browse files
authored
Merge pull request #170 from NatLabRockies/fix/tui-with-auth
Add TORC_PASSWORD and basic auth support to TUI
2 parents 901bf52 + e515088 commit 9c4f8a2

File tree

5 files changed

+49
-16
lines changed

5 files changed

+49
-16
lines changed

src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,8 @@ fn main() {
733733
handle_config_commands(command);
734734
}
735735
Commands::Tui(args) => {
736-
if let Err(e) = tui_runner::run(args) {
736+
let basic_auth = config.basic_auth.clone();
737+
if let Err(e) = tui_runner::run(args, basic_auth) {
737738
eprintln!("Error running TUI: {}", e);
738739
std::process::exit(1);
739740
}

src/tui.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crossterm::{
88
};
99
use ratatui::{Terminal, backend::CrosstermBackend};
1010

11+
use crate::client::apis::configuration::BasicAuth;
1112
use crate::client::apis::default_api;
1213

1314
mod api;
@@ -23,9 +24,11 @@ use components::StatusMessage;
2324
fn check_server_connection(
2425
base_url: &str,
2526
tls: &crate::client::apis::configuration::TlsConfig,
27+
basic_auth: &Option<BasicAuth>,
2628
) -> bool {
2729
let mut config = crate::client::apis::configuration::Configuration::with_tls(tls.clone());
2830
config.base_path = base_url.to_string();
31+
config.basic_auth = basic_auth.clone();
2932

3033
default_api::ping(&config).is_ok()
3134
}
@@ -36,6 +39,7 @@ pub fn run(
3639
database: Option<String>,
3740
tls_ca_cert: Option<String>,
3841
tls_insecure: bool,
42+
basic_auth: Option<BasicAuth>,
3943
) -> Result<()> {
4044
env_logger::init();
4145

@@ -47,14 +51,21 @@ pub fn run(
4751
let mut terminal = Terminal::new(backend)?;
4852

4953
// Create app - this will work even if server is not running
50-
let mut app = App::new_with_options(standalone, port, database, tls_ca_cert, tls_insecure)?;
54+
let mut app = App::new_with_options(
55+
standalone,
56+
port,
57+
database,
58+
tls_ca_cert,
59+
tls_insecure,
60+
basic_auth,
61+
)?;
5162

5263
// In standalone mode, auto-start the server
5364
if standalone {
5465
app.start_server_standalone();
5566
// Give server a moment to start, then try to connect
5667
std::thread::sleep(std::time::Duration::from_millis(500));
57-
if check_server_connection(&app.server_url, &app.tls) {
68+
if check_server_connection(&app.server_url, &app.tls, &app.basic_auth) {
5869
app.set_status(StatusMessage::success("Server started in standalone mode"));
5970
let _ = app.refresh_workflows();
6071
// Check server version
@@ -66,7 +77,7 @@ pub fn run(
6677
}
6778
} else {
6879
// Check if server is running and show appropriate message
69-
if check_server_connection(&app.server_url, &app.tls) {
80+
if check_server_connection(&app.server_url, &app.tls, &app.basic_auth) {
7081
// Connected - check version
7182
app.check_server_version();
7283
} else {

src/tui/api.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::client::apis::configuration::{Configuration, TlsConfig};
1+
use crate::client::apis::configuration::{BasicAuth, Configuration, TlsConfig};
22
use crate::client::apis::default_api;
33
use crate::client::config::TorcConfig;
44
use crate::client::workflow_spec::WorkflowSpec;
@@ -15,10 +15,10 @@ pub struct TorcClient {
1515
impl TorcClient {
1616
#[allow(dead_code)]
1717
pub fn new() -> Result<Self> {
18-
Self::new_with_tls(TlsConfig::default())
18+
Self::new_with_tls(TlsConfig::default(), None)
1919
}
2020

21-
pub fn new_with_tls(tls: TlsConfig) -> Result<Self> {
21+
pub fn new_with_tls(tls: TlsConfig, basic_auth: Option<BasicAuth>) -> Result<Self> {
2222
// Load configuration from files (system, user, local) and environment variables
2323
// Priority: TORC_API_URL env var > config system > default
2424
//
@@ -32,18 +32,24 @@ impl TorcClient {
3232

3333
let mut config = Configuration::with_tls(tls);
3434
config.base_path = base_url;
35+
config.basic_auth = basic_auth;
3536

3637
Ok(Self { config })
3738
}
3839

3940
#[allow(dead_code)]
4041
pub fn from_url(base_url: String) -> Result<Self> {
41-
Self::from_url_with_tls(base_url, TlsConfig::default())
42+
Self::from_url_with_tls(base_url, TlsConfig::default(), None)
4243
}
4344

44-
pub fn from_url_with_tls(base_url: String, tls: TlsConfig) -> Result<Self> {
45+
pub fn from_url_with_tls(
46+
base_url: String,
47+
tls: TlsConfig,
48+
basic_auth: Option<BasicAuth>,
49+
) -> Result<Self> {
4550
let mut config = Configuration::with_tls(tls);
4651
config.base_path = base_url;
52+
config.basic_auth = basic_auth;
4753

4854
Ok(Self { config })
4955
}

src/tui/app.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::client::log_paths::{
1313
use crate::client::sse_client::SseEvent;
1414
use crate::models::{FileModel, JobModel, ResultModel, ScheduledComputeNodesModel, WorkflowModel};
1515

16-
use crate::client::apis::configuration::TlsConfig;
16+
use crate::client::apis::configuration::{BasicAuth, TlsConfig};
1717

1818
use super::api::TorcClient;
1919
use super::components::{
@@ -269,12 +269,15 @@ pub struct App {
269269

270270
// TLS configuration
271271
pub tls: TlsConfig,
272+
273+
// Authentication
274+
pub basic_auth: Option<BasicAuth>,
272275
}
273276

274277
impl App {
275278
#[allow(dead_code)]
276279
pub fn new() -> Result<Self> {
277-
Self::new_with_options(false, 8080, None, None, false)
280+
Self::new_with_options(false, 8080, None, None, false, None)
278281
}
279282

280283
pub fn new_with_options(
@@ -283,12 +286,13 @@ impl App {
283286
database: Option<String>,
284287
tls_ca_cert: Option<String>,
285288
tls_insecure: bool,
289+
basic_auth: Option<BasicAuth>,
286290
) -> Result<Self> {
287291
let tls = TlsConfig {
288292
ca_cert_path: tls_ca_cert.as_ref().map(std::path::PathBuf::from),
289293
insecure: tls_insecure,
290294
};
291-
let client = TorcClient::new_with_tls(tls.clone())?;
295+
let client = TorcClient::new_with_tls(tls.clone(), basic_auth.clone())?;
292296

293297
// In standalone mode, override the server URL to use the specified port
294298
let server_url = if standalone {
@@ -346,6 +350,7 @@ impl App {
346350
sse_thread: None,
347351
sse_workflow_id: None,
348352
tls,
353+
basic_auth,
349354
};
350355

351356
// Update client to use the correct URL
@@ -755,9 +760,12 @@ impl App {
755760
return Ok(());
756761
}
757762

758-
// Create new client with updated URL
759-
self.client =
760-
TorcClient::from_url_with_tls(self.server_url_input.clone(), self.tls.clone())?;
763+
// Create new client with updated URL, preserving authentication
764+
self.client = TorcClient::from_url_with_tls(
765+
self.server_url_input.clone(),
766+
self.tls.clone(),
767+
self.basic_auth.clone(),
768+
)?;
761769
self.server_url = self.server_url_input.clone();
762770
self.focus = Focus::Workflows;
763771

@@ -905,6 +913,7 @@ impl App {
905913
let mut config =
906914
crate::client::apis::configuration::Configuration::with_tls(self.tls.clone());
907915
config.base_path = self.server_url.clone();
916+
config.basic_auth = self.basic_auth.clone();
908917

909918
let result = version_check::check_version(&config);
910919

@@ -2055,11 +2064,13 @@ impl App {
20552064
// Get the base URL for SSE connection
20562065
let base_url = self.server_url.clone();
20572066
let tls = self.tls.clone();
2067+
let basic_auth = self.basic_auth.clone();
20582068

20592069
// Start background thread for SSE connection
20602070
let handle = std::thread::spawn(move || {
20612071
let mut config = crate::client::apis::configuration::Configuration::with_tls(tls);
20622072
config.base_path = base_url;
2073+
config.basic_auth = basic_auth;
20632074

20642075
match crate::client::sse_client::SseConnection::connect(&config, workflow_id, None) {
20652076
Ok(mut connection) => {

src/tui_runner.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use anyhow::Result;
22
use clap::Parser;
33

4+
use crate::client::apis::configuration::BasicAuth;
5+
46
#[derive(Parser, Debug)]
57
#[command(about = "Interactive terminal UI for managing workflows", long_about = None)]
68
pub struct Args {
@@ -25,7 +27,7 @@ pub struct Args {
2527
pub tls_insecure: bool,
2628
}
2729

28-
pub fn run(args: &Args) -> Result<()> {
30+
pub fn run(args: &Args, basic_auth: Option<BasicAuth>) -> Result<()> {
2931
// Initialize the TUI
3032
// The TUI code will be in the optional 'tui' module
3133
#[cfg(feature = "tui")]
@@ -36,12 +38,14 @@ pub fn run(args: &Args) -> Result<()> {
3638
args.database.clone(),
3739
args.tls_ca_cert.clone(),
3840
args.tls_insecure,
41+
basic_auth,
3942
)
4043
}
4144

4245
#[cfg(not(feature = "tui"))]
4346
{
4447
let _ = args; // Suppress unused warning
48+
let _ = basic_auth;
4549
eprintln!("Error: TUI support was not compiled into this binary");
4650
eprintln!("Please rebuild with --features tui or use the standalone torc-tui binary");
4751
std::process::exit(1);

0 commit comments

Comments
 (0)