]> git.proxmox.com Git - proxmox-backup.git/commitdiff
src/client/http_client.rs: new password_env option
authorDietmar Maurer <dietmar@proxmox.com>
Mon, 27 Jan 2020 09:42:19 +0000 (10:42 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 27 Jan 2020 09:42:37 +0000 (10:42 +0100)
src/bin/proxmox-backup-client.rs
src/client/http_client.rs

index aa08ff066861ff9a1a495f8e8bfa2eb5f30ca8f3..5c234985c26875e3f873a99ff680dfbcb0a7601f 100644 (file)
@@ -167,6 +167,7 @@ fn connect(server: &str, userid: &str) -> Result<HttpClient, Error> {
 
     let options = HttpClientOptions::new()
         .prefix(Some("proxmox-backup".to_string()))
+        .password_env(Some("PBS_PASSWORD".to_string()))
         .interactive(true)
         .fingerprint_cache(true)
         .ticket_cache(true);
@@ -1476,6 +1477,7 @@ async fn try_get(repo: &BackupRepository, url: &str) -> Value {
 
     let options = HttpClientOptions::new()
         .prefix(Some("proxmox-backup".to_string()))
+        .password_env(Some("PBS_PASSWORD".to_string()))
         .interactive(false)
         .fingerprint_cache(true)
         .ticket_cache(true);
index af14d41fa68dadd66cf454dd82dfdf3376172b35..7472330ce679b05e427bcc1521de35161345271c 100644 (file)
@@ -33,6 +33,7 @@ pub struct AuthInfo {
 pub struct HttpClientOptions {
     prefix: Option<String>,
     password: Option<String>,
+    password_env: Option<String>,
     fingerprint: Option<String>,
     interactive: bool,
     ticket_cache: bool,
@@ -46,6 +47,7 @@ impl HttpClientOptions {
         Self {
             prefix: None,
             password: None,
+            password_env: None,
             fingerprint: None,
             interactive: false,
             ticket_cache: false,
@@ -64,6 +66,11 @@ impl HttpClientOptions {
         self
     }
 
+    pub fn password_env(mut self, password_env: Option<String>) -> Self {
+        self.password_env = password_env;
+        self
+    }
+
     pub fn fingerprint(mut self, fingerprint: Option<String>) -> Self {
         self.fingerprint = fingerprint;
         self
@@ -303,7 +310,7 @@ impl HttpClient {
             if let Some((ticket, _token)) = ticket_info {
                 ticket
             } else {
-                Self::get_password(&username, options.interactive)?
+                Self::get_password(&username, options.interactive, options.password_env.clone())?
             }
         };
 
@@ -347,19 +354,22 @@ impl HttpClient {
         (*self.fingerprint.lock().unwrap()).clone()
     }
 
-    fn get_password(_username: &str, interactive: bool) -> Result<String, Error> {
-        use std::env::VarError::*;
-        match std::env::var("PBS_PASSWORD") {
-            Ok(p) => return Ok(p),
-            Err(NotUnicode(_)) => bail!("PBS_PASSWORD contains bad characters"),
-            Err(NotPresent) => {
-                // Try another method
+    fn get_password(username: &str, interactive: bool, password_env: Option<String>) -> Result<String, Error> {
+        if let Some(password_env) = password_env {
+            use std::env::VarError::*;
+            match std::env::var(&password_env) {
+                Ok(p) => return Ok(p),
+                Err(NotUnicode(_)) => bail!(format!("{} contains bad characters", password_env)),
+                Err(NotPresent) => {
+                    // Try another method
+                }
             }
         }
 
         // If we're on a TTY, query the user for a password
         if interactive && tty::stdin_isatty() {
-            return Ok(String::from_utf8(tty::read_password("Password: ")?)?);
+            let msg = format!("Password for \"{}\": ", username);
+            return Ok(String::from_utf8(tty::read_password(&msg)?)?);
         }
 
         bail!("no password input mechanism available");