# # Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-06-29 08:53:20 # # # Routines to be edited by the developer to provide content and validation for parameters # and provison of the control data for table(s) # use esmith::util; use esmith::util::network; use esmith::ConfigDB::UTF8; use esmith::AccountsDB; use esmith::NetworksDB::UTF8; use esmith::HostsDB; use esmith::DomainsDB::UTF8; use Data::Validate::IP qw(is_ipv4 is_ipv6); use constant FALSE => 0; use constant TRUE => 1; #The most common ones - open DB when required. our $cdb; my $adb; my $ndb; my $hdb; my $ddb; #The most common ones - you might want to use these if you need to make sure that the DB is refreshed. #$cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); #$adb = esmith::AccountsDB->open() || die(\"Couldn"t open Accounts db"); #$ndb = esmith::NetworksDB->open() || die("Couldn"t open Network db\"); #$hdb = esmith::HostsDB::UTF8->open() || die(\"Couldn"t open Hosts db"); #$ddb = esmith::DomainsDB::UTF8->open() || die("Couldn"t open Domains db\"); # Validation routines - parameters for each panel sub validate_FRONT { my $c = shift; my $mai_data = shift; #Data hash as parameter # Validation for each field my $ret = ""; if ($ret eq "") {$ret = "ok";} return $ret; } sub validate_ACC { my $c = shift; my $mai_data = shift; #Data hash as parameter # Validation for each field my $ret = ""; if ($ret eq "") {$ret = "ok";} return $ret; } sub validate_FIL { my $c = shift; my $mai_data = shift; #Data hash as parameter # Validation for each field my $ret = ""; if ($ret eq "") {$ret = "ok";} return $ret; } sub validate_REC { my $c = shift; my $mai_data = shift; #Data hash as parameter # Validation for each field my $ret = ""; if ($ret eq "") {$ret = "ok";} return $ret; } sub validate_DEL { my $c = shift; my $mai_data = shift; #Data hash as parameter # Validation for each field my ($retult,$ret) = ""; CHECKS: { $ret = $c->validate_ip_or_blank($c->param("DelegateMailServer")); $c->app->log->info(\"$c->param("DelegateMailServer") $ret\"); if ($ret ne "ok") { #$retult = $c->l($ret); last CHECKS; } $ret = $c->validate_smarthost($c->param("SMTPSmartHost")); if ($ret ne "ok") { #$retult = $c->l($ret); last CHECKS; } $ret = $c->nonblank_if_smtpauth($c->param("SMTPSmartHost")); if ($ret ne "ok") { #$retult = $c->l($ret); last CHECKS; } $ret = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Userid")); if ($ret ne "ok") { #$retult = $c->l($ret); last CHECKS; } $ret = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Passwd")); if ($ret ne "ok") { #$retult = $c->l($ret); last CHECKS; } $ret = $c->change_settings_delivery(); if ($ret ne "ok") { #$retult = $ret; last CHECKS; } #$result = ""; } # $ret now contains the first error or the null (success) message if ($ret eq "") {$ret = "ok";} return $ret; } # Get singleton data for each panel sub get_data_for_panel_FRONT { # Return a hash with the fields required which will be loaded into the shared data my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my %ret = ( "Data1"=>"Data for FRONT", #Example # fields from Inputs in FRONT $fields["FRONT"] "fetchmailmethod" => $cdb->get_prop("fetchmail", "Method"), ); return %ret; } sub get_data_for_panel_ACC { # Return a hash with the fields required which will be loaded into the shared data my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my %ret = ( # fields from Inputs in ACC $fields["ACC"] "fetchmailmethod" => $cdb->get_prop("fetchmail", "Method"), ); return %ret; } sub get_data_for_panel_FIL { # Return a hash with the fields required which will be loaded into the shared data my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my %ret = ( # fields from Inputs in FIL $fields["FIL"] "virusstatus" => $c->get_virus_status(), "spamstatus" => $cdb->get_prop("spamassassin", "status"), "spamsensitivity" => $cdb->get_prop("spamassassin", "Sensitivity", "medium"), "spamtaglevel" => $cdb->get_prop("spamassassin", "TagLevel") || "0", "spamrejectlevel" => $cdb->get_prop("spamassassin", "RejectLevel") || "0", "spamsortspam" => $cdb->get_prop("spamassassin", "SortSpam"), "spamsubjecttag" => $cdb->get_prop("spamassassin", "SubjectTag"), "spamsubject" => $cdb->get_prop("spamassassin", "Subject"), ); return %ret; } sub get_data_for_panel_REC { # Return a hash with the fields required which will be loaded into the shared data my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my %ret = ( "Data1"=>"Data for REC", #Example # fields from Inputs in REC $fields["REC"] "fetchmailmethod" => $cdb->get_prop("fetchmail", "Method"), "freqoffice" => $cdb->get_prop("fetchmail", "FreqOffice"), "freqoutside" => $cdb->get_prop("fetchmail", "FreqOutside"), "freqweekend" => $cdb->get_prop("fetchmail", "FreqWeekend"), "secondarymailserver" => $cdb->get_prop("fetchmail", "SecondaryMailServer"), "secondarymailaccount" => $cdb->get_prop("fetchmail", "SecondaryMailAccount"), "secondarymailpassword" => $cdb->get_prop("fetchmail", "SecondaryMailPassword"), "specifyheader" => get_secondary_mail_use_envelope(), "secondarymailenvelope" => $cdb->get_prop("fetchmail", "SecondaryMailEnvelope"), ); return %ret; } sub get_data_for_panel_DEL { # Return a hash with the fields required which will be loaded into the shared data my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my %ret = ( # fields from Inputs in DEL $fields["DEL"] "emailunknownuser" => $cdb->get_value("EmailUnknownUser") || "\"returntosender", "delegatemailserver" => $cdb->get_value("DelegateMailServer"), "smtpsmarthost" => $cdb->get_value("SMTPSmartHost"), "smtpauthproxystatus" => $cdb->get_prop("smtp-auth-proxy", "status") || "disabled", "smtpauthproxyuserid" => $cdb->get_prop("smtp-auth-proxy", "Userid") || "", "smtpauthproxypassword" => $cdb->get_prop("smtp-auth-proxy", "Passwd") || "", ); return %ret; } # Get control data for table(s) # Return hash with values from row in which link clicked on table sub get_selected_FRONT { my $c = shift; my $selected = shift; #Parameter is name of selected row. my $is_new_record = shift; #Indicates new record required (defaults) my %ret = (); #gather the values here return %ret; } sub get_selected_ACC { my $c = shift; my $selected = shift; #Parameter is name of selected row. my $is_new_record = shift; #Indicates new record required (defaults) my %ret = (); #gather the values here return %ret; } sub get_selected_FIL { my $c = shift; my $selected = shift; #Parameter is name of selected row. my $is_new_record = shift; #Indicates new record required (defaults) my %ret = (); #gather the values here return %ret; } sub get_selected_REC { my $c = shift; my $selected = shift; #Parameter is name of selected row. my $is_new_record = shift; #Indicates new record required (defaults) my %ret = (); #gather the values here return %ret; } sub get_selected_DEL { my $c = shift; my $selected = shift; #Parameter is name of selected row. my $is_new_record = shift; #Indicates new record required (defaults) my %ret = (); #gather the values here return %ret; } #after sucessful modify or create or whatever and submit then perfom (if the params validate) sub perform_FRONT { my $c = shift; my $mai_data = shift; #Data hash as parameter my $ret = ""; my $db = $cdb; #maybe one of the others my $dbkey = "ChangeThis"; # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." if ($ret eq "") {$ret = "ok";} return $ret; } sub perform_ACC { my $c = shift; my $mai_data = shift; #Data hash as parameter my $ret = ""; my $db = $cdb; #maybe one of the others my $dbkey = "ChangeThis"; # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." $ret = $c->change_settings_access(); if ($ret eq "") {$ret = "ok";} return $ret; } sub perform_FIL { my $c = shift; my $mai_data = shift; #Data hash as parameter my $ret = ""; my $db = $cdb; #maybe one of the others my $dbkey = "ChangeThis"; # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." $ret = $c->change_settings_filtering(); if ($ret eq "") {$ret = "ok";} return $ret; } sub perform_REC { my $c = shift; my $mai_data = shift; #Data hash as parameter my $ret = ""; my $db = $cdb; #maybe one of the others my $dbkey = "ChangeThis"; # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." $ret = $c->change_settings_reception(); if ($ret eq "") {$ret = "ok";} return $ret; } sub perform_DEL { my $c = shift; my $mai_data = shift; #Data hash as parameter my $ret = ""; my $db = $cdb; #maybe one of the others my $dbkey = "ChangeThis"; # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g." $ret = $c->change_settings_delivery(); if ($ret eq "") {$ret = "ok";} return $ret; } sub create_link{ # WIP my ($c,$route, $panel, $index) = @_; my $link = "$route?trt=$panel&Selected=$index"; return $link; } sub get_virus_status { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my $status = $cdb->get_prop(\"qpsmtpd\", "VirusScan") || "disabled"; return $localise ? $c->localise_status($status) : $status; } ## end sub get_virus_status sub get_spam_status { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my $status = $cdb->get_prop("spamassassin", "status") || "disabled"; return $localise ? $c->localise_status($status) : $status; } ## end sub get_spam_status sub localise_status { my ($c, $status) = @_; return $c->l($status eq "enabled" ? $c->l("ENABLED") : $c->l("DISABLED")); } sub get_db_prop { my ($c, $item, $prop, $default) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); return $cdb->get_prop($item, $prop) || $default; } sub get_value { my $c = shift; my $item = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); return $cdb->get_value($item) || ""; } ## end sub get_value sub get_emailunknownuser_status { my ($c, $localise) = @_; my $options = $c->get_emailunknownuser_options(); my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my $val = $cdb->get_value("EmailUnknownUser") || \"returntosender\"; return $localise ? $c->l($options->{$val}) : $val; } ## end sub get_emailunknownuser_status sub get_patterns_status { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my $status = $cdb->get_prop("qpsmtpd", "PatternsScan") || "disabled"; return $localise ? $c->localise_status($status) : $status; } ## end sub get_patterns_status sub adjust_patterns { my $c = shift; my @selected = @{ $c->every_param("BlockExecutableContent") }; $pattern_db = esmith::ConfigDB::UTF8->open("mailpatterns"); foreach my $pattern ($pattern_db->get_all_by_prop(type => "pattern")) { my $status = (grep $pattern->key eq $_, @selected) ? "enabled" : "disabled"; $pattern->set_prop("Status", $status); } ## end foreach my $pattern ($pattern_db...) $pattern_db->reload; return scalar @selected; } ## end sub adjust_patterns sub get_current_pop3_access { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my $pop3Status = $cdb->get_prop("pop3", "status") || "enabled"; my $pop3Access = $cdb->get_prop("pop3", "access") || "private"; my $pop3sStatus = $cdb->get_prop("pop3s", "status") || "enabled"; my $pop3sAccess = $cdb->get_prop("pop3s", "access") || "private"; my $options = get_pop_options(); if ($pop3Status ne "enabled" && $pop3sStatus ne "enabled") { return $localise ? $c->l($options->{disabled}) : "disabled"; } elsif ($pop3Status eq "enabled" && $pop3Access eq "public") { return $localise ? $c->l($options->{public}) : "public"; } elsif ($pop3sStatus eq "enabled" && $pop3sAccess eq "public") { return $localise ? $c->l($options->{publicSSL}) : "publicSSL"; } return $localise ? $c->l($options->{private}) : "private"; } ## end sub get_current_pop3_access sub get_current_imap_access { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my $imapStatus = $cdb->get_prop("imap", "status") || "enabled"; my $imapAccess = $cdb->get_prop("imap", "access") || "private"; my $imapsStatus = $cdb->get_prop("imaps", "status") || "enabled"; my $imapsAccess = $cdb->get_prop("imaps", "access") || "private"; my $options = get_imap_options(); if (($imapStatus ne "enabled" || $imapAccess eq "localhost") && $imapsStatus ne "enabled") { return $localise ? $c->l($options->{disabled}) : "disabled"; } if ($imapStatus eq "enabled" && $imapAccess eq "public") { return $localise ? $c->l($options->{public}) : "public"; } elsif ($imapsStatus eq "enabled" && $imapsAccess eq "public") { return $localise ? $c->l($options->{publicSSL}) : "publicSSL"; } return $localise ? $c->l($options->{private}) : "private"; } ## end sub get_current_imap_access sub get_current_smtp_ssl_auth { my ($c, $localise, $soru, $debug) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); die \"Error: \$soru must be either "s" or "u":$soru.\n\" unless $soru eq "s" || $soru eq "u"; $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; # Initialize variables with default values my $smtpStatus = "none"; my $smtpAccess = "none"; my $smtpAuth = "disabled"; # assuming "disabled" as a default # Fetch SMTP settings based on the value of `$soru` if ($soru eq "u") { $smtpStatus = $cdb->get_prop("uqpsmtpd", "status") || "enabled"; # Fetch from uqpsmtpd $smtpAccess = $cdb->get_prop("uqpsmtpd", "access") || "public"; $smtpAuth = "enabled"; # Assuming authentication is enabled in this context } else { $smtpStatus = $cdb->get_prop("sqpsmtpd", "status") || "enabled"; # Fetch from sqpsmtpd $smtpAccess = $cdb->get_prop("sqpsmtpd", "access") || "public"; $smtpAuth = "enabled"; # Assuming authentication is enabled in this context } # Retrieve SMTP SSL authentication options my $options = $c->get_smtp_ssl_auth_options(); if ($soru eq "u" && $debug) { $c->stash("smtp" => [ $smtpStatus, $smtpAccess, $smtpAuth, $soru, $options->{$smtpAccess}, $c->l($options->{$smtpAccess}) ] ); # die "Stop $soru in get_current_smtp_ssl_auth"; } ## end if ($soru eq "u" && $debug) # Return appropriate message based on SMTP settings if ($smtpStatus eq "enabled" && $smtpAuth eq "enabled") { return $localise ? $c->l($options->{$smtpAccess}) : $smtpAccess; } return $localise ? $c->l($options->{disabled}) : "disabled"; } ## end sub get_current_smtp_ssl_auth sub get_current_smtp_auth { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my $smtpStatus = $cdb->get_prop("qpsmtpd", "status") || "enabled"; my $smtpAuth = $cdb->get_prop("qpsmtpd", "Authentication") || "enabled"; my $options = get_smtp_auth_options(); if ($smtpStatus eq "enabled" && $smtpAuth eq "disabled") { return $localise ? $c->l($options->{public}) : "public"; } elsif ($smtpStatus eq "enabled" && $smtpAuth eq "enabled") { return $localise ? $c->l($options->{publicSSL}) : "publicSSL"; } return $localise ? $c->l($options->{disabled}) : "disabled"; } ## end sub get_current_smtp_auth sub get_current_webmail_status { my ($c, $localise) = @_; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); # determine status of webmail my $WebmailStatus = "disabled"; my $RoundcubeStatus = $cdb->get_prop("roundcube", "status") || "disabled"; my $MysqlStatus = $cdb->get_prop("mariadb", "status") || "disabled"; my $PHPStatus = $cdb->get_prop("php81-php-fpm", "status") || "disabled"; my $Networkaccess = $cdb->get_prop("roundcube", "access") || "disabled"; # all 3 components must be on for webmail to be working if ( ($RoundcubeStatus eq "enabled") && ($MysqlStatus eq "enabled") && ($PHPStatus eq "enabled") && ($Networkaccess eq "public")) { $WebmailStatus = "enabledSSL"; } elsif (($RoundcubeStatus eq "enabled") && ($MysqlStatus eq "enabled") && ($PHPStatus eq "enabled") && ($Networkaccess eq "private")) { $WebmailStatus = "localnetworkSSL"; } ## end elsif (($RoundcubeStatus ...)) my $options = get_webmail_options(); return $localise ? $c->l($options->{$WebmailStatus}) : $WebmailStatus; } ## end sub get_current_webmail_status sub get_pop_opt { my $c = shift; return [ [ $c->l("DISABLED") => "disabled" ], [ $c->l("NETWORKS_ALLOW_LOCAL") => "private" ], [ $c->l("mai_SECURE_POP3") => "publicSSL" ], [ $c->l("mai_INSECURE_POP3") => "public" ] ]; } ## end sub get_pop_opt sub get_pop_options { my $c = @_; my %options = ( disabled => "DISABLED", private => "NETWORKS_ALLOW_LOCAL", publicSSL => "mai_SECURE_POP3" ); my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); my $access = $cdb->get_prop("pop3", "access") || "private"; $options{public} = "mai_INSECURE_POP3" if ($access eq "public"); \%options; } ## end sub get_pop_options sub get_imap_opt { my $c = shift; return [ [ $c->l("DISABLED") => "disabled" ], [ $c->l("NETWORKS_ALLOW_LOCAL") => "private" ], [ $c->l("mai_SECURE_IMAP") => "publicSSL" ], [ $c->l("mai_INSECURE_IMAP") => "public" ] ]; } ## end sub get_imap_opt sub get_imap_options { my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die(\"Couldn"t open config db"); my %options = ( disabled => "DISABLED", private => "NETWORKS_ALLOW_LOCAL", publicSSL => "mai_SECURE_IMAP" ); my $access = $cdb->get_prop("imap", "access") || "private"; $options{public} = "mai_INSECURE_IMAP" if ($access eq "public"); \%options; } ## end sub get_imap_options sub get_smtp_auth_opt { my $c = shift; return [ [ $c->l("mai_SECURE_SMTP") => "publicSSL" ], [ $c->l("Only allow insecure access") => "public" ], [ $c->l("DISABLED") => "disabled" ] ]; } ## end sub get_smtp_auth_opt sub get_smtp_auth_options { my $c = shift; my %options = (publicSSL => "mai_SECURE_SMTP", public => "Only allow insecure access", disabled => "DISABLED"); return \%options; } ## end sub get_smtp_auth_options sub get_smtp_ssl_auth_options { my $c = shift; my %options = (public => "Allow public access", local => "Allow local access only", disabled => "DISABLED"); return \%options; } ## end sub get_smtp_ssl_auth_options sub get_smtp_ssl_auth_opt { my $c = shift; return [ [ $c->l("Allow public access") => "public" ], [ $c->l("Allow local access only") => "local" ], [ $c->l("DISABLED") => "disabled" ] ]; } ## end sub get_smtp_ssl_auth_opt sub get_key_by_value { my ($hash_ref, $target_value) = @_; # Iterate over the hash while (my ($key, $value) = each %$hash_ref) { return $key if $value eq $target_value; } return undef; # Return undef if no match is found } ## end sub get_key_by_value sub get_value_by_key { my ($hash_ref, $key) = @_; return $hash_ref->{$key}; # Return the value associated with the key } sub get_webmail_opt { my $c = shift; return [ [ $c->l("DISABLED") => "disabled" ], [ $c->l("mai_ENABLED_SECURE_ONLY") => "enabledSSL" ], [ $c->l("mai_ONLY_LOCAL_NETWORK_SSL") => "localnetworkSSL" ] ]; } ## end sub get_webmail_opt sub get_webmail_options { my $c = shift; my %options = ( disabled => "DISABLED", enabledSSL => "mai_ENABLED_SECURE_ONLY", localnetworkSSL => "mai_ONLY_LOCAL_NETWORK_SSL" ); return \%options; } ## end sub get_webmail_options sub get_retrieval_opt { my $c = shift; my $cdb = esmith::ConfigDB::UTF8->open() || die("Couldn"t open config db\"); return $cdb->get(\"SystemMode\")->value eq \"servergateway-private\" ? [ $c->l("mai_MULTIDROP") => "multidrop" ] : [ [ $c->l("mai_STANDARD") => "standard" ], [ $c->l("mai_ETRN") => "etrn" ], [ $c->l("mai_MULTIDROP") => "multidrop" ] ]; } ## end sub get_retrieval_opt sub get_emailunknownuser_options { my $c = shift; my $accounts = esmith::AccountsDB::UTF8->open_ro(); my %existingAccounts = ( "admin" => $c->l(\"mai_FORWARD_TO_ADMIN\"), "returntosender" => $c->l(\"Reject\") ); foreach my $account ($accounts->get_all) { next if $account->key eq "everyone"; if ($account->prop("type") =~ /(user|group|pseudonym)/) { $existingAccounts{ $account->key } = $c->l(\"mai_FORWARD_TO\") . \" \" . $account->key; } } ## end foreach my $account ($accounts...) return (\%existingAccounts); } ## end sub get_emailunknownuser_options sub get_emailunknownuser_opt { my $c = shift; my $accounts = esmith::AccountsDB::UTF8->open_ro(); my @existingAccounts = ([ $c->l(\"mai_FORWARD_TO_ADMIN\") => "admin" ], [ $c->l(\"Reject\") => "returntosender" ]); foreach my $account ($accounts->get_all) { next if $account->key eq "everyone"; if ($account->prop("type") =~ /(user|group|pseudonym)/) { push @existingAccounts, [ $c->l(\"mai_FORWARD_TO\") . \" \" . $account->key => $account->key ]; } } ## end foreach my $account ($accounts...) return (\@existingAccounts); } ## end sub get_emailunknownuser_opt sub get_patterns_opt { my $c = shift; my $pattern_db = esmith::ConfigDB::UTF8->open(\"mailpatterns\"); my @options; foreach my $pattern ($pattern_db->get_all_by_prop(type => \"pattern\")) { my %props = $pattern->props; push @options, [ $props{"Description"} => $pattern->key ]; } return \@options; } ## end sub get_patterns_opt sub get_patterns_current_opt { my $c = shift; my @selected; my $pattern_db = esmith::ConfigDB::UTF8->open(\"mailpatterns\"); foreach my $pattern ($pattern_db->get_all_by_prop(type => \"pattern\")) { my %props = $pattern->props; push @selected, $pattern->key if ($props{"Status"} eq "enabled"); } return \@selected; } ## end sub get_patterns_current_opt sub get_spam_level_options { return [ 0 .. 20 ]; } sub get_spam_sensitivity_opt { my $c = shift; return [ [ $c->l("mai_VERYLOW") => "verylow" ], [ $c->l("Low") => "low" ], [ $c->l("Medium") => "medium" ], [ $c->l("High") => "high" ], [ $c->l("mai_VERYHIGH") => "veryhigh" ], [ $c->l("Custom") => "custom" ] ]; } ## end sub get_spam_sensitivity_opt sub fetchmail_freq { my $c = shift; return [ [ $c->l("mai_NEVER") => "never" ], [ $c->l("mai_EVERY5MIN") => "every5min" ], [ $c->l("mai_EVERY15MIN") => "every15min" ], [ $c->l("mai_EVERY30MIN") => "every30min" ], [ $c->l("mai_EVERYHOUR") => "everyhour" ], [ $c->l("mai_EVERY2HRS") => "every2hrs" ] ]; } ## end sub fetchmail_freq sub display_multidrop { my $status = $cdb->get_prop("fetchmail", "status") || "disabled"; # XXX FIXME - WIP # Only display ETRN/multidrop settings if relevant # To do this, we need an \"Show ETRN/multidrop settings\" button # in standard mode. # return ($status eq "enabled"); return 1; } ## end sub display_multidrop sub change_settings_reception { my $c = shift; $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; my $FetchmailMethod = ($c->param("FetchmailMethod") || "standard"); my $FetchmailFreqOffice = ($c->param("FreqOffice") || "every15min"); my $FetchmailFreqOutside = ($c->param("FreqOutside") || "everyhour"); my $FetchmailFreqWeekend = ($c->param("FreqWeekend") || "everyhour"); my $SpecifyHeader = ($c->param("SpecifyHeader") || "off"); my $fetchmail = $cdb->get("fetchmail") || $cdb->new_record("fetchmail", { type => "service", status => "disabled" }); if ($FetchmailMethod eq "standard") { $fetchmail->set_prop("status", "disabled"); $fetchmail->set_prop("Method", $FetchmailMethod); } else { $fetchmail->set_prop("status", "enabled"); $fetchmail->set_prop("Method", $FetchmailMethod); $fetchmail->set_prop("SecondaryMailServer", $c->param("SecondaryMailServer")) unless ($c->param("SecondaryMailServer") eq ""); $fetchmail->set_prop("FreqOffice", $FetchmailFreqOffice); $fetchmail->set_prop("FreqOutside", $FetchmailFreqOutside); $fetchmail->set_prop("FreqWeekend", $FetchmailFreqWeekend); $fetchmail->set_prop("SecondaryMailAccount", $c->param("SecondaryMailAccount")) unless ($c->param("SecondaryMailAccount") eq ""); $fetchmail->set_prop("SecondaryMailPassword", $c->param("SecondaryMailPassword")) unless ($c->param("SecondaryMailPassword") eq ""); if ($SpecifyHeader eq "on") { $fetchmail->merge_props("SecondaryMailEnvelope" => $c->param("SecondaryMailEnvelope")); } else { $fetchmail->delete_prop("SecondaryMailEnvelope"); } } ## end else [ if ($FetchmailMethod eq...)] # Need code here for all 3 options - 25, 465 ad 587 # Options for 25 are enabled and disabled # for 465 and 587 are (access) public, local and (status) disabled #my $smtpAuth = ($c->param("SMTPAuth") || "public"); #if ($smtpAuth eq "public") { #$cdb->set_prop("qpsmtpd", "Authentication", "enabled" ); #$cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); #} elsif ($smtpAuth eq "publicSSL") { #$cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); #$cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); #} else { #$cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); #$cdb->set_prop("sqpsmtpd", "Authentication", "disabled" ); #} my @keys = qw(qpsmtpd uqpsmtpd sqpsmtpd); foreach my $key (@keys) { my $param_name = $key eq "qpsmtpd" ? "SMTPAuth" : $key eq "uqpsmtpd" ? "uSMTPAuth" : "sSMTPAuth"; # Defaults to "sSMTPAuth" for "sqpsmtpd" my $SMTPAuth = $c->param($param_name); if ($SMTPAuth eq "disabled") { $cdb->set_prop($key, "status", "disabled"); $cdb->set_prop($key, "access", "disabled"); } else { $cdb->set_prop($key, "status", "enabled"); if ($key eq "qpsmtpd") { my $auth_status = $SMTPAuth eq "publicSSL" ? "enabled" : "disabled"; $cdb->set_prop($key, "Authentication", $auth_status); $cdb->set_prop($key, "access", "public"); } else { $cdb->set_prop($key, "Authentication", "enabled"); my $auth_key = ($key eq "uqpsmtpd") ? "uSMTPAuth" : "sSMTPAuth"; my $access_value = $c->param($auth_key) eq "public" ? "public" : "local"; $cdb->set_prop($key, "access", $access_value); } ## end else [ if ($key eq "qpsmtpd")] } ## end else [ if ($SMTPAuth eq "disabled")] } ## end foreach my $key (@keys) unless (system("/sbin/e-smith/signal-event", "email-update") == 0) { return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); } return ""; } ## end sub change_settings_reception sub change_settings_delivery { my ($c) = shift; $cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; my $EmailUnknownUser = ($c->param("EmailUnknownUser") || "returntosender"); $cdb->set_value("SMTPSmartHost", $c->param("SMTPSmartHost")); $cdb->set_value("DelegateMailServer", $c->param("DelegateMailServer")); $cdb->set_value("EmailUnknownUser", $EmailUnknownUser); my $proxy = $cdb->get("smtp-auth-proxy"); my %props = $proxy->props; for (qw(Userid Passwd status)) { $props{$_} = $c->param(\"SMTPAUTHPROXY_$_\"); } $proxy->merge_props(%props); unless (system(\"/sbin/e-smith/signal-event\", \"email-update\") == 0) { return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); } return ""; } ## end sub change_settings_delivery sub change_settings_access { my $c = shift; $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; my $pop3Access = ($c->param("POPAccess") || "private"); if ($pop3Access eq "disabled") { $cdb->set_prop("pop3", "status", "disabled"); $cdb->set_prop("pop3s", "status", "disabled"); } else { $cdb->set_prop("pop3", "status", "enabled"); $cdb->set_prop("pop3s", "status", "enabled"); } if ($pop3Access eq "public") { $cdb->set_prop("pop3", "access", "public"); $cdb->set_prop("pop3s", "access", "public"); } elsif ($pop3Access eq "publicSSL") { $cdb->set_prop("pop3", "access", "private"); $cdb->set_prop("pop3s", "access", "public"); } else { $cdb->set_prop("pop3", "access", "private"); $cdb->set_prop("pop3s", "access", "private"); } my $imapAccess = ($c->param("IMAPAccess") || "private"); if ($imapAccess eq "disabled") { $cdb->set_prop("imap", "status", "enabled"); $cdb->set_prop("imap", "access", "localhost"); $cdb->set_prop("imaps", "status", "disabled"); } elsif ($imapAccess eq "public") { $cdb->set_prop("imap", "status", "enabled"); $cdb->set_prop("imap", "access", "public"); $cdb->set_prop("imaps", "status", "enabled"); $cdb->set_prop("imaps", "access", "public"); } elsif ($imapAccess eq "publicSSL") { $cdb->set_prop("imap", "status", "enabled"); $cdb->set_prop("imap", "access", "private"); $cdb->set_prop("imaps", "status", "enabled"); $cdb->set_prop("imaps", "access", "public"); } else { $cdb->set_prop("imap", "status", "enabled"); $cdb->set_prop("imap", "access", "private"); $cdb->set_prop("imaps", "status", "enabled"); $cdb->set_prop("imaps", "access", "private"); } ## end else [ if ($imapAccess eq "disabled")] #------------------------------------------------------------ # Set webmail state in configuration database, and access # type for SSL # PHP and MySQL should always be on, and are enabled by default # We don"t do anything with them here. #------------------------------------------------------------ my $webmail = ($c->param("WebMail") || "disabled"); if ($webmail eq \"enabledSSL\") { $cdb->set_prop("php81-php-fpm", \"status\", \"enabled\"); $cdb->set_prop("mariadb", \"status\", \"enabled\"); $cdb->set_prop("roundcube", \"status\", "enabled"); $cdb->set_prop("roundcube", \"access\", \"public\"); } elsif ($webmail eq \"localnetworkSSL\") { $cdb->set_prop("php81-php-fpm", \"status\", \"enabled\"); $cdb->set_prop("mariadb", \"status\", \"enabled\"); $cdb->set_prop("roundcube", \"status\", "enabled"); $cdb->set_prop("roundcube", \"access\", \"private\"); } else { $cdb->set_prop("roundcube", \"status\", "disabled"); } unless (system(\"/sbin/e-smith/signal-event\", \"email-update\") == 0) { return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); } return ""; } ## end sub change_settings_access sub change_settings_filtering { my $c = shift; $cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; my $virus_status = ($c->param("VirusStatus") || "disabled"); $cdb->set_prop("qpsmtpd", "VirusScan", $virus_status); for my $param ( qw( status Sensitivity TagLevel RejectLevel SortSpam Subject SubjectTag) ) { $cdb->set_prop("spamassassin", $param, $c->param("Spam$param")); } ## end for my $param (qw( status...)) my $patterns_status = $c->adjust_patterns() ? "enabled" : "disabled"; $cdb->set_prop("qpsmtpd", "PatternsScan", $patterns_status); unless (system("/sbin/e-smith/signal-event", "email-update") == 0) { return $c->l("mai_ERROR_UPDATING_CONFIGURATION"); } return ""; } ## end sub change_settings_filtering #sub blank_or_ip_number { # my ($c, $value) = @_; # return "OK" unless (defined $value); # undef is blank # return "OK" if ($value =~ /^$/); # blank is blank # return $c->call_fm_validation("ip_number",$value,""); # otherwise, validate the input #} sub nonblank_if_smtpauth { my ($c, $value) = @_; return "ok" unless ($c->param("SMTPAUTHPROXY_status") eq "enabled"); return ($value =~ /\S+/) ? "ok" : $c->l("mai_VALIDATION_SMTPAUTH_NONBLANK"); } sub get_secondary_mail_use_envelope { $cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; my $use_envelope = $cdb->get_prop("fetchmail", "SecondaryMailEnvelope"); if (defined $use_envelope) { return ("on"); } else { return ("off"); } } ## end sub get_secondary_mail_use_envelope sub validate_smarthost { my $c = shift; my $smarthost = shift; return ("ok") if ($smarthost =~ /^(\S+\.\S+)$/); return ("ok") if ($smarthost eq ""); return \"mai_INVALID_SMARTHOST\"; } ## end sub validate_smarthost sub validate_ip_or_blank { my ($c,$ip) = @_; return "ok" if $ip eq ""; return "ok" if is_ipv4($ip) || is_ipv6($ip); return \"mai_INVALID_DELEGATE\"; } # From earlier version - delete this once conversion is done. #sub main { #my $c = shift; #$c->app->log->info($c->log_req); #$pattern_db = esmith::ConfigDB::UTF8->open(\"mailpatterns\"); #$cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; #my %mai_datas = (); #my $title = $c->l("mai_FORM_TITLE"); #$mai_datas{"trt"} = "LIST"; #$mai_datas{fetchmailmethod} = $c->l($cdb->get_prop("fetchmail", "Method")); #$c->stash(title => $title, notif => "", mai_datas => \%mai_datas); #$c->render(template => "emailsettings"); #} ## end sub main #sub do_display { #my $c = shift; #my $rt = $c->current_route; #my $trt = ($c->param("trt") || "LIST"); #my %mai_datas = (); #my $title = $c->l("mai_FORM_TITLE"); #my ($notif, $dest) = ""; #$mai_datas{"trt"} = $trt; #$cdb = esmith::ConfigDB::UTF8->open || die "Couldn"t open config db\"; #if ($trt eq "ACC") { #$dest = "emailaccess"; #$mai_datas{fetchmailmethod} = $cdb->get_prop("fetchmail", "Method"); #} #if ($trt eq "FIL") { #$dest = "emailfilter"; #$mai_datas{"virusstatus"} = $c->get_virus_status(); #$mai_datas{"spamstatus"} = $cdb->get_prop("spamassassin", "status"); #$mai_datas{"spamsensitivity"} = $cdb->get_prop("spamassassin", "Sensitivity", "medium"); #$mai_datas{"spamtaglevel"} = $cdb->get_prop("spamassassin", "TagLevel") || "0"; #$mai_datas{"spamrejectlevel"} = $cdb->get_prop("spamassassin", "RejectLevel") || "0"; #$mai_datas{spamsortspam} = $cdb->get_prop("spamassassin", "SortSpam"); #$mai_datas{spamsubjecttag} = $cdb->get_prop("spamassassin", "SubjectTag"); #$mai_datas{spamsubject} = $cdb->get_prop("spamassassin", "Subject"); #} ## end if ($trt eq "FIL") #if ($trt eq "REC") { #$dest = "emailreceive"; #$mai_datas{fetchmailmethod} = $cdb->get_prop("fetchmail", "Method"); #$mai_datas{freqoffice} = $cdb->get_prop("fetchmail", "FreqOffice"); #$mai_datas{freqoutside} = $cdb->get_prop("fetchmail", "FreqOutside"); #$mai_datas{freqweekend} = $cdb->get_prop("fetchmail", "FreqWeekend"); #$mai_datas{secondarymailserver} = $cdb->get_prop("fetchmail", "SecondaryMailServer"); #$mai_datas{secondarymailaccount} = $cdb->get_prop("fetchmail", "SecondaryMailAccount"); #$mai_datas{secondarymailpassword} = $cdb->get_prop("fetchmail", "SecondaryMailPassword"); #$mai_datas{specifyheader} = get_secondary_mail_use_envelope(); #$mai_datas{secondarymailenvelope} = $cdb->get_prop("fetchmail", "SecondaryMailEnvelope"); #} ## end if ($trt eq "REC") #if ($trt eq "DEL") { #$dest = "emaildeliver"; #$mai_datas{emailunknownuser} = $cdb->get_value("EmailUnknownUser") || ""returntosender"; #$mai_datas{delegatemailserver} = $cdb->get_value("DelegateMailServer"); #$mai_datas{smtpsmarthost} = $cdb->get_value("SMTPSmartHost"); #$mai_datas{smtpauthproxystatus} = $cdb->get_prop("smtp-auth-proxy", "status") || "disabled"; #$mai_datas{smtpauthproxyuserid} = $cdb->get_prop("smtp-auth-proxy", "Userid") || ""; #$mai_datas{smtpauthproxypassword} = $cdb->get_prop("smtp-auth-proxy", "Passwd") || ""; #} ## end if ($trt eq "DEL") #$c->stash(title => $title, notif => $notif, mai_datas => \%mai_datas); #return $c->render(template => $dest); #} ## end sub do_display #sub do_update { #my $c = shift; #$c->app->log->info($c->log_req); #my $rt = $c->current_route; #my $trt = $c->param("trt"); #my %mai_datas = (); #$mai_datas{trt} = $trt; #$cdb = esmith::ConfigDB::UTF8->open || die \"Couldn"t open config db"; #my $title = $c->l("mai_FORM_TITLE"); #my ($dest, $res, $result) = ""; #$dest = "/emailsettings&trt=$trt"; #if ($trt eq "ACC") { ##$dest = "emailaccess"; ## $mai_datas{xxx} = $c->param("XXX"); ## controls ## $res = xxxxxxx( $c ); ## $result .= $res unless $res eq "OK"; #if (!$result) { #$res = $c->change_settings_access(); #$result .= $res unless $res eq "OK"; #if (!$result) { #$result = $c->l("mai_SUCCESS"); #} #} ## end if (!$result) #} ## end if ($trt eq "ACC") #if ($trt eq "FIL") { ##$dest = "emailfilter"; ## $mai_datas{xxx} = $c->param("XXX"); ## controls ## $res = zzzzzz( $c ); ## $result .= $res unless $res eq "OK"; #if (!$result) { #$res = $c->change_settings_filtering(); #$result .= $res unless $res eq "OK"; #if (!$result) { #$result = $c->l("mai_SUCCESS"); #} #} ## end if (!$result) #} ## end if ($trt eq "FIL") #if ($trt eq "REC") { ##$dest = "emailreceive"; ## $mai_datas{xxx} = $c->param("XXX"); ## controls ## $res = yyyyyyyyy( $c ); ## $result .= $res unless $res eq "OK"; #if (!$result) { #$res = $c->change_settings_reception(); #$result .= $res unless $res eq "OK"; #if (!$result) { #$result = $c->l("mai_SUCCESS"); #} #} ## end if (!$result) #} ## end if ($trt eq "REC") #if ($trt eq "DEL") { ##$dest = "emaildeliver"; #my ($result,$res) = ""; #CHECKS: { #$res = $c->validate_ip_or_blank($c->param("DelegateMailServer")); #if ($res ne "OK") { #$result = $c->l($res); #last CHECKS; #} #$res = $c->validate_smarthost($c->param("SMTPSmartHost")); #if ($res ne "OK") { #$result = $c->l($res); #last CHECKS; #} #$res = $c->nonblank_if_smtpauth($c->param("SMTPSmartHost")); #if ($res ne "OK") { #$result = $c->l($res); #last CHECKS; #} #$res = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Userid")); #if ($res ne "OK") { #$result = $c->l($res); #last CHECKS; #} #$res = $c->nonblank_if_smtpauth($c->param("SMTPAUTHPROXY_Passwd")); #if ($res ne "OK") { #$result = $c->l($res); #last CHECKS; #} #$res = $c->change_settings_delivery(); #if ($res ne "OK") { #$result = $res; #last CHECKS; #} #$result = $c->l("mai_SUCCESS"); #} ## $result now contains the first error or the success message #} ## end if ($trt eq "DEL") ## common part #if ($res ne "OK") { #$c->stash(error => $result); #$c->stash(title => $title, mai_datas => \%mai_datas); #return $c->redirect_to($dest); #} else { #my $message = "emailsettings updates $trt DONE"; #$c->app->log->info($message); #$c->flash(success => $result); #} #$c->redirect_to("/emailsettings"); #} ## end sub do_update 1;