commit 8cc6dac893e3a7630a6be438ac4331f0f7023dad
parent b7c4316c778568d23cdd7e3922e03cf16a3fec18
Author: soruh <mail@soruh.de>
Date: Wed, 25 Jan 2023 22:54:50 +0100
check if SENDMAIL_COMMAND is valid using 'which' crate
Diffstat:
3 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
@@ -3230,6 +3230,7 @@ dependencies = [
"url",
"uuid",
"webauthn-rs",
+ "which",
"yubico",
]
@@ -3397,6 +3398,17 @@ dependencies = [
]
[[package]]
+name = "which"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
name = "widestring"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
@@ -151,6 +151,7 @@ semver = "1.0.16"
# Allow overriding the default memory allocator
# Mainly used for the musl builds, since the default musl malloc is very slow
mimalloc = { version = "0.1.34", features = ["secure"], default-features = false, optional = true }
+which = "4.4.0"
# Strip debuginfo from the release builds
# Also enable thin LTO for some optimizations
diff --git a/src/config.rs b/src/config.rs
@@ -749,31 +749,34 @@ fn validate_config(cfg: &ConfigItems) -> Result<(), Error> {
}
if cfg.use_sendmail {
- if let Some(ref command) = cfg.sendmail_command {
- let path = std::path::Path::new(&command);
+ let command = cfg.sendmail_command.as_deref().unwrap_or("sendmail");
- if !path.is_absolute() {
- err!(format!("path to sendmail command `{path:?}` is not absolute"));
+ let mut path = std::path::PathBuf::from(command);
+
+ if !path.is_absolute() {
+ match which::which(command) {
+ Ok(result) => path = result,
+ Err(_) => err!(format!("sendmail command {command:?} not found in $PATH")),
}
+ }
- match path.metadata() {
- Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
- err!(format!("sendmail command not found at `{path:?}`"))
- }
- Err(err) => {
- err!(format!("failed to access sendmail command at `{path:?}`: {err}"))
+ match path.metadata() {
+ Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
+ err!(format!("sendmail command not found at `{path:?}`"))
+ }
+ Err(err) => {
+ err!(format!("failed to access sendmail command at `{path:?}`: {err}"))
+ }
+ Ok(metadata) => {
+ if metadata.is_dir() {
+ err!(format!("sendmail command at `{path:?}` isn't a directory"));
}
- Ok(metadata) => {
- if metadata.is_dir() {
- err!(format!("sendmail command at `{path:?}` isn't a directory"));
- }
- #[cfg(unix)]
- {
- use std::os::unix::fs::PermissionsExt;
- if !metadata.permissions().mode() & 0o111 != 0 {
- err!(format!("sendmail command at `{path:?}` isn't executable"));
- }
+ #[cfg(unix)]
+ {
+ use std::os::unix::fs::PermissionsExt;
+ if !metadata.permissions().mode() & 0o111 != 0 {
+ err!(format!("sendmail command at `{path:?}` isn't executable"));
}
}
}