aboutsummaryrefslogtreecommitdiffstats
path: root/config/spamd/spamd.inc
diff options
context:
space:
mode:
Diffstat (limited to 'config/spamd/spamd.inc')
-rw-r--r--config/spamd/spamd.inc323
1 files changed, 323 insertions, 0 deletions
diff --git a/config/spamd/spamd.inc b/config/spamd/spamd.inc
new file mode 100644
index 00000000..8747df29
--- /dev/null
+++ b/config/spamd/spamd.inc
@@ -0,0 +1,323 @@
+<?php
+/* $Id$ */
+/*
+ spamd.inc
+ part of the SpamD package for pfSense
+ Copyright (C) 2008 Scott Ullrich
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+*/
+
+if(!function_exists("filter_configure"))
+ require_once("filter.inc");
+
+function sync_package_spamd() {
+ global $config, $g;
+
+ conf_mount_rw();
+ config_lock();
+ $fd = fopen("/etc/spamd.conf","w");
+ /* all header */
+ fwrite($fd, "all:\\\n\t:whitelist:blacklist");
+ if($config['installedpackages']['spamdsources']['config']) {
+ foreach($config['installedpackages']['spamdsources']['config'] as $spamd) {
+ if($spamd['providername']) {
+ fwrite($fd, ":" . remove_spaces($spamd['providername']));
+ }
+ }
+ }
+ fwrite($fd, ":\n\n");
+ fwrite($fd, "whitelist:\\\n");
+ fwrite($fd, "\t:method=file:\\\n");
+ fwrite($fd, "\t:white:\\\n");
+ fwrite($fd, "\t:file=/var/db/whitelist.txt:\n");
+ fwrite($fd, "\n");
+ fwrite($fd, "blacklist:\\\n");
+ fwrite($fd, "\t:black:\\\n");
+ fwrite($fd, "\t:msg=\"Sorry, you spammed us before.\":\\\n");
+ fwrite($fd, "\t:method=file:\\\n");
+ fwrite($fd, "\t:file=/var/db/blacklist.txt:\n\n");
+ log_error("Looping through each item and write out its configuration");
+ /* loop through each item and write out its configuration */
+ if($config['installedpackages']['spamdsources']['config'] != "") {
+ foreach($config['installedpackages']['spamdsources']['config'] as $spamd) {
+ if(remove_spaces($spamd['providername'])) {
+ if($spamd['providername']) {
+ fwrite($fd, remove_spaces($spamd['providername']) . ":\\\n");
+ fwrite($fd, "\t:" . remove_spaces($spamd['providertype']) . ":\\\n");
+ fwrite($fd, "\t:msg=\"" . rtrim($spamd['rejectmessage']) . "\":\\\n");
+ fwrite($fd, "\t:method=" . remove_spaces($spamd['providermethod']) . ":\\\n");
+ $providerurl = $spamd['providerurl'];
+ $providerurl = str_replace("http://", "", $providerurl);
+ $providerurl = str_replace("https://", "", $providerurl);
+ fwrite($fd, "\t:file=" . remove_spaces($providerurl) . ":\n\n");
+ }
+ }
+ }
+ }
+ fclose($fd);
+ log_error("Creating /var/db/whitelist.txt");
+ $fd = fopen("/var/db/whitelist.txt","w");
+ if($config['installedpackages']['spamdwhitelist']['config'] != "") {
+ foreach($config['installedpackages']['spamdwhitelist']['config'] as $spamd) {
+ if($spamd['ip'])
+ fwrite($fd, $spamd['ip'] . "\n");
+ }
+ }
+ fclose($fd);
+ $passtime = "5";
+ $greyexp = "4";
+ $whiteexp = "864";
+ $identifier = "";
+ $maxcon = "";
+ $maxblack = "";
+ $stuttersecs = "";
+ $delaysecs = "";
+ log_error("Looping through spamdsettings");
+ if($config['installedpackages']['spamdsettings']['config']) {
+ foreach($config['installedpackages']['spamdsettings']['config'] as $ss) {
+ if($ss['nextmta'] <> "")
+ $nextmta = $ss['nextmta'];
+ if($ss['greylistingparms'] <> "")
+ $passtime = " -G " . $ss['greylistingparms'];
+ if($ss['identifier'] <> "")
+ $identifier = " -n \"" . $ss['identifier'] . "\"";
+ // Default is greylisting, turn on blacklisting if not checked.
+ if($ss['greylisting'] <> "on")
+ $greylisting = " -b";
+ if($ss['maxblack'] <> "")
+ $maxblack = " -B " . $ss['maxblack'];
+ if($ss['maxcon'] <> "")
+ $maxcon = " -c " . $ss['maxcon'];
+ if($ss['stuttersecs'] <> "")
+ $stuttersecs = " -S " . $ss['stuttersecs'];
+ if($ss['delaysecs'] <> "")
+ $delaysecs = " -s " . $ss['delaysecs'];
+ if($ss['window'] <> "")
+ $window = " -w " . $ss['window'];
+ if($ss['passtime'] <> "")
+ $passtime = $ss['passtime'];
+ if($ss['greyexp'] <> "")
+ $greyexp = $ss['greyexp'];
+ if($ss['whiteexp'] <> "")
+ $whiteexp = $ss['whiteexp'];
+ }
+ }
+ $greyparms = " -G {$passtime}:{$greyexp}:{$whiteexp}";
+ $start = "if [ `mount | grep -v grep | grep fdescfs | wc -l` -lt 1 ]; then \n" .
+ "/sbin/mount -t fdescfs fdescfs /dev/fd\n" .
+ "fi\n" .
+ "/usr/local/sbin/spamd-setup -d &\n" .
+ "/sbin/pflogd &\n" .
+ "/usr/local/libexec/spamd {$greyparms}{$identifier}{$greylisting}{$maxcon}{$maxblack}{$window}{$replysmtperror} 127.0.0.1 &\n" .
+ "/usr/local/libexec/spamlogd\n";
+ $stop = "/usr/bin/killall spamd-setup\n" .
+ "/usr/bin/killall spamlogd\n" .
+ "/usr/bin/killall spamd\n" .
+ "/usr/bin/killall pflogd\n" .
+ "sleep 2";
+ log_error("Writing rc_file");
+ write_rcfile(array(
+ "file" => "spamd.sh",
+ "start" => $start,
+ "stop" => $stop
+ )
+ );
+ log_error("Installing CRON");
+ spamd_install_cron(true);
+ log_error("Mounting RO");
+ conf_mount_ro();
+ log_error("Unlocking config");
+ config_unlock();
+ log_error("Restart cron");
+ mwexec("killall -HUP cron");
+ log_error("Setting up spamd.conf symlink");
+ mwexec("ln -s /etc/spamd.conf /usr/local/etc/spamd/spamd.conf");
+ log_error("Stopping spamd");
+ mwexec("/usr/local/etc/rc.d/spamd.sh stop");
+ sleep(1);
+ log_error("Starting spamd");
+ mwexec_bg("/usr/local/etc/rc.d/spamd.sh start");
+ log_error("Reconfiguring filter");
+ filter_configure();
+ log_error("SpamD setup completed");
+}
+
+function spamd_generate_rules($type) {
+ global $config;
+
+ $natrules = "";
+ switch($type) {
+ case 'rdr':
+ $natrules .= "\n# spam table \n";
+ $wanif = get_real_interface("wan");
+ $natrules .= "table <whitelist> persist\n";
+ $natrules .= "table <blacklist> persist\n";
+ $natrules .= "table <spamd> persist\n";
+ if(file_exists("/var/db/whitelist.txt"))
+ $natrules .= "table <spamd-white> persist file \"/var/db/whitelist.txt\"\n";
+ $natrules .= "rdr pass on {$wanif} proto tcp from <blacklist> to port smtp -> 127.0.0.1 port spamd\n";
+ $natrules .= "rdr pass on {$wanif} proto tcp from <spamd> to port smtp -> 127.0.0.1 port spamd\n";
+ $natrules .= "rdr pass on {$wanif} proto tcp from !<spamd-white> to port smtp -> 127.0.0.1 port spamd\n";
+ if($config['installedpackages']['spamdsettings']['config'])
+ foreach($config['installedpackages']['spamdsettings']['config'] as $ss)
+ $nextmta = $ss['nextmta'];
+ if($nextmta <> "") {
+ $natrules .= "rdr pass on {$wanif} proto tcp from <spamd-white> to port smtp -> {$nextmta} port smtp\n";
+ }
+
+ break;
+ }
+
+ return $natrules;
+}
+
+function remove_spaces($string) {
+ $string = str_replace(" ", "", $string);
+ return $string;
+}
+
+function sync_spamd_config_to_backup() {
+ global $g, $config;
+ if(is_array($config['installedpackages']['carpsettings']['config'])) {
+ foreach($config['installedpackages']['carpsettings']['config'] as $carp) {
+ if($carp['synchronizetoip'] != "" ) {
+ $synctoip = $carp['synchronizetoip'];
+ $password = $carp['password'];
+ if($config['system']['username'])
+ $username = $config['system']['username'];
+ else
+ $username = "admin";
+ }
+ }
+ }
+ if($synctoip and $password) {
+ if($config['system']['webgui']['protocol'] != "") {
+ $synchronizetoip = $config['system']['webgui']['protocol'];
+ $synchronizetoip .= "://";
+ }
+ $port = $config['system']['webgui']['port'];
+ /* if port is empty lets rely on the protocol selection */
+ if($port == "") {
+ if($config['system']['webgui']['protocol'] == "http") {
+ $port = "80";
+ } else {
+ $port = "443";
+ }
+ }
+ $params = array(XML_RPC_encode($password),XML_RPC_encode($xml));
+ /* create files to sync array */
+ $filetosync = array("/var/db/spamd", "/var/db/whitelist.txt");
+ /* loop through files to sync list and sync them up */
+ foreach($filetosync as $f2s) {
+ $f2c_contents = file_get_contents($f2s);
+ xmlrpc_sync_file($url, $password, $f2s, $f2c_contents, $port);
+ }
+ /* signal remote process config reload */
+ xmlrpc_exec_shell($url, $password, "/usr/bin/killall -HUP spamlogd", $port);
+ xmlrpc_exec_shell($url, $password, "/usr/bin/killall -HUP spamd", $port);
+ }
+}
+
+function custom_php_install_command() {
+ global $config, $g;
+ system("touch /var/db/whitelist.txt");
+ system("touch /var/db/blacklist.txt");
+ sync_package_spamd();
+ exec("pw user mod_spamd -u 0");
+}
+
+function custom_php_deinstall_command() {
+ global $config, $g;
+ conf_mount_rw();
+ exec("killall -9 spamd");
+ unlink_if_exists("/usr/local/pkg/pf/spamd_rules.php");
+ unlink_if_exists("/usr/local/www/spamd_rules.php");
+ unlink_if_exists("/usr/local/etc/rc.d/spamd.sh");
+ spamd_install_cron(false);
+ conf_mount_ro();
+ filter_configure();
+}
+
+function spamd_install_cron($should_install) {
+ global $config, $g;
+ $is_installed = false;
+ if(!$config['cron']['item'])
+ return;
+ $x=0;
+ foreach($config['cron']['item'] as $item) {
+ if(strstr($item['command'], "spamd-setup")) {
+ $is_installed = true;
+ break;
+ }
+ $x++;
+ }
+ switch($should_install) {
+ case true:
+ if(!$is_installed) {
+ $cron_item = array();
+ $cron_item['minute'] = "*/120";
+ $cron_item['hour'] = "*";
+ $cron_item['mday'] = "*";
+ $cron_item['month'] = "*";
+ $cron_item['wday'] = "*";
+ $cron_item['who'] = "root";
+ $cron_item['command'] = "/usr/bin/nice -n20 /usr/local/sbin/spamd-setup";
+ $config['cron']['item'][] = $cron_item;
+ write_config("Installed SPAMD crontab entries.");
+ configure_cron();
+ }
+ break;
+ case false:
+ if($is_installed == true) {
+ if($x > 0) {
+ unset($config['cron']['item'][$x]);
+ write_config();
+ }
+ configure_cron();
+ }
+ break;
+ }
+}
+
+function spamd_validate_input($post, $input_errors) {
+ global $config, $g;
+ $nextmta = str_replace("$", "", $post['nextmta']);
+ if(stristr($nextmta, "{")) {
+ /* item is an alias, make sure the name exists */
+ $nextmta = str_replace("$", "", $nextmta);
+ $found = false;
+ if($config['aliases']['alias']) {
+ foreach($config['aliases']['alias'] as $alias) {
+ if($alias['name'] == $nextmta) {
+ $found = true;
+ }
+ }
+ }
+ if($found == false)
+ $intput_errors = "Could not locate alias named " . htmlentities($nextmta);
+ }
+}
+
+?> \ No newline at end of file