imap: add server_password_command
parent
1811fb51cb
commit
6ca8c3b964
|
@ -183,6 +183,9 @@ example:
|
||||||
.Qq mail.example.tld
|
.Qq mail.example.tld
|
||||||
.It Ic server_username Ar String
|
.It Ic server_username Ar String
|
||||||
.It Ic server_password Ar String
|
.It Ic server_password Ar String
|
||||||
|
.It Ic server_password_command Ar String
|
||||||
|
(optional) Use instead of
|
||||||
|
.Ic server_password
|
||||||
.It Ic server_port Ar number
|
.It Ic server_port Ar number
|
||||||
(optional)
|
(optional)
|
||||||
.\" default value
|
.\" default value
|
||||||
|
|
|
@ -688,7 +688,29 @@ impl ImapType {
|
||||||
) -> Result<Box<dyn MailBackend>> {
|
) -> Result<Box<dyn MailBackend>> {
|
||||||
let server_hostname = get_conf_val!(s["server_hostname"])?;
|
let server_hostname = get_conf_val!(s["server_hostname"])?;
|
||||||
let server_username = get_conf_val!(s["server_username"])?;
|
let server_username = get_conf_val!(s["server_username"])?;
|
||||||
let server_password = get_conf_val!(s["server_password"])?;
|
let server_password = if !s.extra.contains_key("server_password_command") {
|
||||||
|
get_conf_val!(s["server_password"])?.to_string()
|
||||||
|
} else {
|
||||||
|
let invocation = get_conf_val!(s["server_password_command"])?
|
||||||
|
.split_whitespace()
|
||||||
|
.collect::<Vec<&str>>();
|
||||||
|
let output = std::process::Command::new(invocation[0])
|
||||||
|
.args(&invocation[1..])
|
||||||
|
.stdin(std::process::Stdio::piped())
|
||||||
|
.stdout(std::process::Stdio::piped())
|
||||||
|
.stderr(std::process::Stdio::piped())
|
||||||
|
.output()?;
|
||||||
|
if !output.status.success() {
|
||||||
|
return Err(MeliError::new(format!(
|
||||||
|
"({}) server_password_command `{}` returned {}: {}",
|
||||||
|
s.name,
|
||||||
|
get_conf_val!(s["server_password_command"])?,
|
||||||
|
output.status,
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
std::str::from_utf8(&output.stdout)?.trim_end().to_string()
|
||||||
|
};
|
||||||
let server_port = get_conf_val!(s["server_port"], 143)?;
|
let server_port = get_conf_val!(s["server_port"], 143)?;
|
||||||
let use_starttls = get_conf_val!(s["use_starttls"], !(server_port == 993))?;
|
let use_starttls = get_conf_val!(s["use_starttls"], !(server_port == 993))?;
|
||||||
let danger_accept_invalid_certs: bool =
|
let danger_accept_invalid_certs: bool =
|
||||||
|
@ -696,7 +718,7 @@ impl ImapType {
|
||||||
let server_conf = ImapServerConf {
|
let server_conf = ImapServerConf {
|
||||||
server_hostname: server_hostname.to_string(),
|
server_hostname: server_hostname.to_string(),
|
||||||
server_username: server_username.to_string(),
|
server_username: server_username.to_string(),
|
||||||
server_password: server_password.to_string(),
|
server_password,
|
||||||
server_port,
|
server_port,
|
||||||
use_starttls,
|
use_starttls,
|
||||||
danger_accept_invalid_certs,
|
danger_accept_invalid_certs,
|
||||||
|
@ -876,7 +898,14 @@ impl ImapType {
|
||||||
pub fn validate_config(s: &AccountSettings) -> Result<()> {
|
pub fn validate_config(s: &AccountSettings) -> Result<()> {
|
||||||
get_conf_val!(s["server_hostname"])?;
|
get_conf_val!(s["server_hostname"])?;
|
||||||
get_conf_val!(s["server_username"])?;
|
get_conf_val!(s["server_username"])?;
|
||||||
get_conf_val!(s["server_password"])?;
|
if !s.extra.contains_key("server_password_command") {
|
||||||
|
get_conf_val!(s["server_password"])?;
|
||||||
|
} else if s.extra.contains_key("server_password") {
|
||||||
|
return Err(MeliError::new(format!(
|
||||||
|
"Configuration error ({}): both server_password and server_password_command are set, cannot choose",
|
||||||
|
s.name.as_str(),
|
||||||
|
)));
|
||||||
|
}
|
||||||
get_conf_val!(s["server_port"], 143)?;
|
get_conf_val!(s["server_port"], 143)?;
|
||||||
get_conf_val!(s["use_starttls"], false)?;
|
get_conf_val!(s["use_starttls"], false)?;
|
||||||
get_conf_val!(s["danger_accept_invalid_certs"], false)?;
|
get_conf_val!(s["danger_accept_invalid_certs"], false)?;
|
||||||
|
|
Loading…
Reference in New Issue