@ -116,6 +116,14 @@ macro_rules! make_config {
serde_json ::from_str ( & config_str ) . map_err ( Into ::into )
}
fn clear_non_editable ( & mut self ) {
$( $(
if ! $editable {
self . $name = None ;
}
) + ) +
}
/// Merges the values of both builders into a new builder.
/// If both have the same element, `other` wins.
fn merge ( & self , other : & Self , show_overrides : bool , overrides : & mut Vec < String > ) -> Self {
@ -678,6 +686,8 @@ make_config! {
_enable_smtp : bool , true , def , true ;
/// Use Sendmail |> Whether to send mail via the `sendmail` command
use_sendmail : bool , true , def , false ;
/// Sendmail Command |> Which sendmail command to use. The one found in the $PATH is used if not specified.
sendmail_command : String , false , option ;
/// Host
smtp_host : String , true , option ;
/// DEPRECATED smtp_ssl |> DEPRECATED - Please use SMTP_SECURITY
@ -890,12 +900,16 @@ fn validate_config(cfg: &ConfigItems) -> Result<(), Error> {
}
if cfg . use_sendmail {
let command = format ! ( "sendmail{EXE_SUFFIX}" ) ;
let command = cfg . sendmail_command . clone ( ) . unwrap_or_else ( | | format ! ( "sendmail{EXE_SUFFIX}" ) ) ;
// Check if we can find the sendmail command to execute
let Ok ( path ) = which ::which ( & command ) else {
err ! ( format ! ( "sendmail command {command} not found in $PATH" ) )
} ;
let mut path = std ::path ::PathBuf ::from ( & command ) ;
// Check if we can find the sendmail command to execute when no absolute path is given
if ! path . is_absolute ( ) {
let Ok ( which_path ) = which ::which ( & command ) else {
err ! ( format ! ( "sendmail command {command} not found in $PATH" ) )
} ;
path = which_path ;
}
match path . metadata ( ) {
Err ( err ) if err . kind ( ) = = std ::io ::ErrorKind ::NotFound = > {
@ -1142,12 +1156,17 @@ impl Config {
} )
}
pub fn update_config ( & self , other : ConfigBuilder ) -> Result < ( ) , Error > {
pub fn update_config ( & self , other : ConfigBuilder , ignore_non_editable : bool ) -> Result < ( ) , Error > {
// Remove default values
//let builder = other.remove(&self.inner.read().unwrap()._env);
// TODO: Remove values that are defaults, above only checks those set by env and not the defaults
let builder = other ;
let mut builder = other ;
// Remove values that are not editable
if ignore_non_editable {
builder . clear_non_editable ( ) ;
}
// Serialize now before we consume the builder
let config_str = serde_json ::to_string_pretty ( & builder ) ? ;
@ -1182,7 +1201,7 @@ impl Config {
let mut _overrides = Vec ::new ( ) ;
usr . merge ( & other , false , & mut _overrides )
} ;
self . update_config ( builder )
self . update_config ( builder , false )
}
/// Tests whether an email's domain is allowed. A domain is allowed if it