From 3eab27426aa39497d87a9fb768fd860f924e10be Mon Sep 17 00:00:00 2001 From: Daniel Stefan Haischt Date: Sat, 15 Jul 2006 22:16:04 +0000 Subject: - initial version of the DSPAM package --- packages/dspam/conf.default/config.xml | 981 ++++++ packages/dspam/pkg/000.mysql.sh | 68 + packages/dspam/pkg/010.clamav-clamd.sh | 56 + packages/dspam/pkg/020.clamav-freshclam.sh | 33 + packages/dspam/pkg/030.p3scan.sh | 60 + packages/dspam/pkg/clamd.conf | 299 ++ packages/dspam/pkg/default.prefs.sample | 43 + packages/dspam/pkg/dspam.inc | 3916 +++++++++++++++++++++++ packages/dspam/pkg/dspam.xml | 146 + packages/dspam/pkg/dspam_alerts.xml | 102 + packages/dspam/pkg/freshclam.conf | 110 + packages/dspam/pkg/p3scan-pf-emer.xml | 82 + packages/dspam/pkg/p3scan-pf-msg.xml | 153 + packages/dspam/pkg/p3scan-pf-spam.xml | 74 + packages/dspam/pkg/p3scan-pf-vir.xml | 117 + packages/dspam/pkg/p3scan-pf.xml | 166 + packages/dspam/pkg/p3scan.inc | 277 ++ packages/dspam/pkg/verdana.ttf | Bin 0 -> 139640 bytes packages/dspam/www/dspam-admin-graph.php | 201 ++ packages/dspam/www/dspam-admin-prefs.php | 249 ++ packages/dspam/www/dspam-admin-stats.php | 123 + packages/dspam/www/dspam-admin.php | 207 ++ packages/dspam/www/dspam-analysis-graph.php | 137 + packages/dspam/www/dspam-analysis.php | 147 + packages/dspam/www/dspam-hfragment.php | 90 + packages/dspam/www/dspam-history.php | 172 + packages/dspam/www/dspam-perf.php | 222 ++ packages/dspam/www/dspam-prefs.php | 234 ++ packages/dspam/www/dspam-quarantine.php | 178 ++ packages/dspam/www/dspam-settings-algo.php | 204 ++ packages/dspam/www/dspam-settings-bmta.php | 202 ++ packages/dspam/www/dspam-settings-feat.php | 203 ++ packages/dspam/www/dspam-settings-header.php | 197 ++ packages/dspam/www/dspam-settings-overr.php | 197 ++ packages/dspam/www/dspam-settings-prefs.php | 197 ++ packages/dspam/www/dspam-settings-spwd.php | 197 ++ packages/dspam/www/dspam-settings-tuser.php | 195 ++ packages/dspam/www/dspam-settings.php | 2941 +++++++++++++++++ packages/dspam/www/dspam-train.php | 284 ++ packages/dspam/www/dspam-viewmsg.php | 158 + packages/dspam/www/dspam.php | 264 ++ packages/dspam/www/p3scan_rules.php | 12 + packages/dspam/www/themes/metallic/dspam.css | 115 + packages/dspam/www/wizards/dspam-lda-proxy.png | Bin 0 -> 20556 bytes packages/dspam/www/wizards/dspam-pop-proxy.png | Bin 0 -> 18247 bytes packages/dspam/www/wizards/dspam-smtp-relay.png | Bin 0 -> 30404 bytes packages/dspam/www/wizards/dspam_wizard.xml | 1830 +++++++++++ 47 files changed, 15839 insertions(+) create mode 100644 packages/dspam/conf.default/config.xml create mode 100644 packages/dspam/pkg/000.mysql.sh create mode 100644 packages/dspam/pkg/010.clamav-clamd.sh create mode 100644 packages/dspam/pkg/020.clamav-freshclam.sh create mode 100644 packages/dspam/pkg/030.p3scan.sh create mode 100644 packages/dspam/pkg/clamd.conf create mode 100644 packages/dspam/pkg/default.prefs.sample create mode 100644 packages/dspam/pkg/dspam.inc create mode 100644 packages/dspam/pkg/dspam.xml create mode 100644 packages/dspam/pkg/dspam_alerts.xml create mode 100644 packages/dspam/pkg/freshclam.conf create mode 100644 packages/dspam/pkg/p3scan-pf-emer.xml create mode 100644 packages/dspam/pkg/p3scan-pf-msg.xml create mode 100644 packages/dspam/pkg/p3scan-pf-spam.xml create mode 100644 packages/dspam/pkg/p3scan-pf-vir.xml create mode 100644 packages/dspam/pkg/p3scan-pf.xml create mode 100644 packages/dspam/pkg/p3scan.inc create mode 100644 packages/dspam/pkg/verdana.ttf create mode 100644 packages/dspam/www/dspam-admin-graph.php create mode 100644 packages/dspam/www/dspam-admin-prefs.php create mode 100644 packages/dspam/www/dspam-admin-stats.php create mode 100644 packages/dspam/www/dspam-admin.php create mode 100644 packages/dspam/www/dspam-analysis-graph.php create mode 100644 packages/dspam/www/dspam-analysis.php create mode 100644 packages/dspam/www/dspam-hfragment.php create mode 100644 packages/dspam/www/dspam-history.php create mode 100644 packages/dspam/www/dspam-perf.php create mode 100644 packages/dspam/www/dspam-prefs.php create mode 100644 packages/dspam/www/dspam-quarantine.php create mode 100644 packages/dspam/www/dspam-settings-algo.php create mode 100644 packages/dspam/www/dspam-settings-bmta.php create mode 100644 packages/dspam/www/dspam-settings-feat.php create mode 100644 packages/dspam/www/dspam-settings-header.php create mode 100644 packages/dspam/www/dspam-settings-overr.php create mode 100644 packages/dspam/www/dspam-settings-prefs.php create mode 100644 packages/dspam/www/dspam-settings-spwd.php create mode 100644 packages/dspam/www/dspam-settings-tuser.php create mode 100644 packages/dspam/www/dspam-settings.php create mode 100644 packages/dspam/www/dspam-train.php create mode 100644 packages/dspam/www/dspam-viewmsg.php create mode 100644 packages/dspam/www/dspam.php create mode 100644 packages/dspam/www/p3scan_rules.php create mode 100644 packages/dspam/www/themes/metallic/dspam.css create mode 100644 packages/dspam/www/wizards/dspam-lda-proxy.png create mode 100644 packages/dspam/www/wizards/dspam-pop-proxy.png create mode 100644 packages/dspam/www/wizards/dspam-smtp-relay.png create mode 100644 packages/dspam/www/wizards/dspam_wizard.xml (limited to 'packages') diff --git a/packages/dspam/conf.default/config.xml b/packages/dspam/conf.default/config.xml new file mode 100644 index 00000000..b06f65a3 --- /dev/null +++ b/packages/dspam/conf.default/config.xml @@ -0,0 +1,981 @@ + + + + 2.1 + + nione + + + normal + nione + local + + + Etc/UTC + 300 + pool.ntp.org + + admins + System Administrators + system + ANY + index.php + + + dspam_users + DSPAM Users + user + dspam.php + + dspam.php + wizard.php + system_usermanager.php + license.php + pkg.php + pkg_edit.php + index.php + dspam_alerts.xml + dspam.xml + dspam-perf.php + dspam-prefs.php + dspam-train.php + dspam-quarantine.php + dspam-viewmsg.php + dspam-hfragment.php + dspam-history.php + dspam-analysis-graph.php + dspam-analysis.php + ifstats.php + xmlrpc.php + preload.php + functions.inc.php + javascript.inc.php + sajax.class.php + + + + dspam_admins + DSPAM Administrators + user + dspam.php + + dspam.php + dspam_wizard.xml + wizard.php + system_usermanager.php + license.php + pkg.php + pkg_edit.php + index.php + status_services.php + dspam-admin-prefs.php + dspam_alerts.xml + dspam.xml + dspam-perf.php + dspam-prefs.php + dspam-train.php + dspam-admin-stats.php + dspam-admin-graph.php + dspam-admin.php + dspam-quarantine.php + dspam-viewmsg.php + dspam-hfragment.php + dspam-history.php + dspam-analysis-graph.php + dspam-analysis.php + dspam-settings-algo.php + dspam-settings-bmta.php + dspam-settings-feat.php + dspam-settings-prefs.php + dspam-settings-header.php + dspam-settings-overr.php + dspam-settings-spwd.php + dspam-settings-tuser.php + dspam-settings.php + p3scan-pf-emer.xml + p3scan-pf.xml + p3scan-pf-msg.xml + p3scan-pf-spam.xml + p3scan-pf-vir.xml + ifstats.php + xmlrpc.php + preload.php + functions.inc.php + javascript.inc.php + sajax.class.php + + + + admin + System Administrator + system + admins + $1$7.o6q5uM$T86K5z0xG.rOUPWUUnjzm/ + + lockwc + Lock webConfigurator + Indicates whether this user will lock access to the webConfigurator for other users. + + + lock-ipages + Lock individual pages + Indicates whether this user will lock individual HTML pages after having accessed a particular page(the lock will be freed if the user leaves or saves the page form). + + + hasshell + Has shell access + Indicates whether this user is able to login for example via SSH. + + + isroot + Is root user + This user is associated with the UNIX root user (you should associate this privilege only with one single user). + + + + dspamadm + DSPAM Administrator + user + dspam_admins + $1$utl.fBcK$ZDnGqMSm2fJHi8vxQ6EfT1 + + + http + + + + + + + + + + + sis0 + 192.168.1.1 + 24 + + + 100 + Mb + + + + sis1 + + dhcp + + + + + + + + + 100 + Mb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dyndns + + + + + + + + + + + 192.168.1.100 + 192.168.1.199 + + + + + + + + + + + + + + + + + + + + + + + + + + public + + + + + + + + + + + + + + + + + + + + + + + + + + + pass + Default LAN -> any + lan + + lan + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mysql + + /tmp/mysql.sock + + dspam + dspam + dspam + 10 + yes + yes + + + + + mail + yes + 192.168.1.6 + 24 + localhost + smtp + error + + + + + root + root desc + + + mail + mail desc + + + mailnull + mailnull desc + + + smmsp + smmsp desc + + + daemon + daemon desc + + + + + teft + yes + + chained + feat desc + + + whitelist + whitelist desc + + + graham + naive desc + + + burton + naive desc + + graham + yes + + "spamAction=quarantine" + desc + + + "signatureLocation=message" + 'message' or 'headers' + + + "showFactors=on" + desc + + + trainingMode + tmode desc + + + spamAction spamSubject + desc + + + statisticalSedation + desc + + + enableBNR + desc + + + enableWhitelist + desc + + + signatureLocation + desc + + + showFactors + desc + + + optIn optOut + desc + + + whitelistThreshold + desc + + + + + 1 + yes + + + + 14 + 90 + 90 + 30 + 15 + 15 + + + + 127.0.0.1 + yes + yes + out + yes + yes + 307200 + yes + + + + yes + 3310 + 127.0.0.1 + accept + + + + 24 + 32 + /var/run/dspam/dspam.pid + standard + --deliver=innocent -d %u + abysseleven.abyssworld.de + /var/run/dspam/dspam.sock + + + + dspam + http://dspam.nuclearelephant.com/ + + DSPAM is a scalable and open-source content-based spam filter designed for multi-user enterprise systems. + On a properly configured system, many users experience results between 99.5% - 99.95%, or one error for + every 200 to 2000 messages. DSPAM supports many different MTAs and can also be deployed as a stand-alone + SMTP appliance. + + http://www.abyssworld.de/packages/config/dspam.xml + http://www.abyssworld.de/packages/All/ + dspam-devel-3.6.4.20060315.1518.tbz + 3.6.6 + ALPHA + me@daniel.stefan.haischt.name + + dspam + + + + mysql + http://www.mysql.com/ + + MySQL RDBMS. + + http://www.abyssworld.de/packages/config/mysql.xml + http://www.abyssworld.de/packages/All/ + mysql-server-5.0.21.tbz + 5.0.21 + ALPHA + me@daniel.stefan.haischt.name + + mysql + + + + clamav + http://www.clamav.net/ + + Clam Antivirus. + + http://www.abyssworld.de/packages/config/clamav.xml + http://www.abyssworld.de/packages/All/ + clamav-devel-20060503_1.tbz + 20060503_1 + ALPHA + me@daniel.stefan.haischt.name + + clamav + + + + POP3 Proxy +
Services
+ p3scan.inc + /pkg_edit.php?xml=p3scan-pf.xml&id=0 +
+ + DSPAM +
Services
+ dspam.inc + /dspam.php +
+ + DSPAM Wizard +
Services
+ dspam.inc + /wizard.php?xml=dspam_wizard.xml +
+ + dspam + DSPAM content-based spam filter + /usr/local/etc/rc.d/dspam.sh + dspam + + + clamd + Clam AntiVirus Scanner + /usr/local/etc/rc.d/010.clamav-clamd.sh + clamd + + + Deamon that receives new AntiVirus signatures + freshclam + /usr/local/etc/rc.d/020.clamav-freshclam.sh + freshclam + + + mysql + MySQL RDBMS + /usr/local/etc/rc.d/000.mysql.sh + mysqld_safe + + + p3scan + + p3scan is a pop3 antivirus proxy that can be used completely transparently with any pop3 mail client. + + /usr/local/etc/rc.d/030.p3scan.sh + p3scan + +
+ + + 0 + * + * + * + * + root + /usr/bin/nice -n20 newsyslog + + + 1,31 + 0-5 + * + * + * + root + /usr/bin/nice -n20 adjkerntz -a + + + 1 + * + 1 + * + * + root + /usr/bin/nice -n20 /etc/rc.update_bogons.sh + + + */60 + * + * + * + * + root + /usr/bin/nice -n20 /usr/local/sbin/expiretable -v -t 3600 sshlockout + + + 1 + 1 + * + * + * + root + /usr/bin/nice -n20 /etc/rc.dyndns.update + + + */5 + * + * + * + * + root + /usr/bin/nice -n20 /etc/ping_hosts.sh + + +
diff --git a/packages/dspam/pkg/000.mysql.sh b/packages/dspam/pkg/000.mysql.sh new file mode 100644 index 00000000..9c25c370 --- /dev/null +++ b/packages/dspam/pkg/000.mysql.sh @@ -0,0 +1,68 @@ +#!/bin/sh +# This file was automatically generated +# by the pfSense service handler + +rc_start() { +test_mysql_user=`cat /etc/passwd | grep mysql` +test_mysql_group=`cat /etc/group | grep mysql` +mysql_user="mysql" +mysql_limits_args="-e -U ${mysql_user}" +pidfile="/var/db/mysql/`/bin/hostname`.pid" +command="/usr/local/bin/mysqld_safe" +command_args="--user=${mysql_user} --datadir=/var/db/mysql --pid-file=${pidfile} --bind-address=127.0.0.1 --set-variable=max_connections=500" +procname="/usr/local/libexec/mysqld" +mysql_install_db="/usr/local/bin/mysql_install_db" +mysql_install_db_args="--ldata=/var/db/mysql" + +/sbin/mount_fdescfs fdescfs /dev/fd + +if [ -z "${test_mysql_group}" ]; then + pw groupadd mysql -g 88 +fi + +if [ -z "${test_mysql_user}" ]; then + pw useradd mysql -u 88 -g 88 -d /nonexistent -s /sbin/nologin -c 'MySQL Daemon' +fi + +if [ ! -d "/var/db/mysql" ]; then + mkdir /var/db/mysql && chown mysql:mysql /var/db/mysql +fi + +if [ ! -d "/var/db/mysql/mysql/." ]; then + eval $mysql_install_db $mysql_install_db_args >/dev/null + [ $? -eq 0 ] && chown -R ${mysql_user}:${mysql_user} /var/db/mysql +fi + +#if checkyesno mysql_limits; then +# eval `/usr/bin/limits ${mysql_limits_args}` 2>/dev/null +#else +# return 0 +#fi + +${command} ${command_args} > /dev/null & +} + +rc_stop() { +/usr/bin/killall mysqld +sleep 2 +} + +rc_restart() { + rc_stop + rc_start +} + +case $1 in + start) + rc_start + ;; + stop) + rc_stop + ;; + restart) + rc_restart + ;; + *) + echo "Usage: $0 " + ;; +esac diff --git a/packages/dspam/pkg/010.clamav-clamd.sh b/packages/dspam/pkg/010.clamav-clamd.sh new file mode 100644 index 00000000..aeb23b04 --- /dev/null +++ b/packages/dspam/pkg/010.clamav-clamd.sh @@ -0,0 +1,56 @@ +#!/bin/sh +# This file was automatically generated +# by the pfSense service handler + +rc_start() { +test_clamav_group=`cat /etc/group | grep clam` +test_clamav_user=`cat /etc/passwd | grep clam` + +if [ -z "${test_clamav_group}" ]; then + pw groupadd clamav -g 106 +fi + +if [ -z "${test_clamav_user}" ]; then + pw useradd clamav -u 106 -g 106 -d /nonexistent -s /sbin/nologin -c 'Clam Antivirus' +fi + +if [ ! -d "/usr/local/share/clamav" ]; then + mkdir /usr/local/share/clamav && chown clamav:clamav /usr/local/share/clamav +fi + +if [ ! -d "/var/log/clamav" ]; then + mkdir /var/log/clamav && chown clamav:clamav /var/log/clamav +fi + +if [ ! -d "/var/run/clamav" ]; then + mkdir /var/run/clamav && chown clamav:clamav /var/run/clamav +fi + + /sbin/mount_fdescfs fdescfs /dev/fd + /usr/local/sbin/clamd +} + +rc_stop() { + /usr/bin/killall clamd + sleep 2 +} + +rc_restart() { + rc_stop + rc_start +} + +case $1 in + start) + rc_start + ;; + stop) + rc_stop + ;; + restart) + rc_restart + ;; + *) + echo "Usage: $0 " + ;; +esac diff --git a/packages/dspam/pkg/020.clamav-freshclam.sh b/packages/dspam/pkg/020.clamav-freshclam.sh new file mode 100644 index 00000000..4332d757 --- /dev/null +++ b/packages/dspam/pkg/020.clamav-freshclam.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# This file was automatically generated +# by the pfSense service handler + +rc_start() { + /sbin/mount_fdescfs fdescfs /dev/fd + /usr/local/bin/freshclam --daemon +} + +rc_stop() { + /usr/bin/killall freshclam + sleep 2 +} + +rc_restart() { + rc_stop + rc_start +} + +case $1 in + start) + rc_start + ;; + stop) + rc_stop + ;; + restart) + rc_restart + ;; + *) + echo "Usage: $0 " + ;; +esac diff --git a/packages/dspam/pkg/030.p3scan.sh b/packages/dspam/pkg/030.p3scan.sh new file mode 100644 index 00000000..ffd08abf --- /dev/null +++ b/packages/dspam/pkg/030.p3scan.sh @@ -0,0 +1,60 @@ +#!/bin/sh +# This file was automatically generated +# by the pfSense service handler + +rc_start() { +test_p3scan_user=`cat /etc/passwd | grep p3scan` +test_p3scan_group=`cat /etc/passwd | grep p3scan` + +if [ -z "${test_p3scan_group}" ]; then + pw groupadd p3scan -g 108 +fi + +if [ -z "${test_p3scan_user}" ]; then + pw useradd p3scan -u 108 -g p3scan -d /var/spool/p3scan -s /sbin/nologin -c 'P3Scan Daemon' +fi + +if [ ! -d "/var/spool/p3scan" ]; then + mkdir /var/spool/p3scan && chown p3scan:p3scan /var/spool/p3scan +fi + +if [ ! -d "/var/spool/p3scan/children" ]; then + mkdir /var/spool/p3scan/children && chown p3scan:p3scan /var/spool/p3scan/children +fi + +if [ ! -d "/var/spool/p3scannotify" ]; then + mkdir /var/spool/p3scannotify && chown p3scan:p3scan /var/spool/p3scannotify +fi + +if [ ! -d "/var/run/p3scan" ]; then + mkdir /var/run/p3scan && chown p3scan:p3scan /var/run/p3scan +fi + + /sbin/mount_fdescfs fdescfs /dev/fd + /usr/local/sbin/p3scan --configfile=/usr/local/etc/p3scan/p3scan.conf & +} + +rc_stop() { + /usr/bin/killall p3scan + sleep 2 +} + +rc_restart() { + rc_stop + rc_start +} + +case $1 in + start) + rc_start + ;; + stop) + rc_stop + ;; + restart) + rc_restart + ;; + *) + echo "Usage: $0 " + ;; +esac diff --git a/packages/dspam/pkg/clamd.conf b/packages/dspam/pkg/clamd.conf new file mode 100644 index 00000000..3ce0402f --- /dev/null +++ b/packages/dspam/pkg/clamd.conf @@ -0,0 +1,299 @@ +## +## Example config file for the Clam AV daemon +## Please read the clamd.conf(5) manual before editing this file. +## + + +# Comment or remove the line below. +#Example + +# Uncomment this option to enable logging. +# LogFile must be writable for the user running daemon. +# A full path is required. +# Default: disabled +#LogFile /tmp/clamd.log +LogFile /var/log/clamav/clamd.log + +# By default the log file is locked for writing - the lock protects against +# running clamd multiple times (if want to run another clamd, please +# copy the configuration file, change the LogFile variable, and run +# the daemon with --config-file option). +# This option disables log file locking. +# Default: no +#LogFileUnlock yes + +# Maximal size of the log file. +# Value of 0 disables the limit. +# You may use 'M' or 'm' for megabytes (1M = 1m = 1048576 bytes) +# and 'K' or 'k' for kilobytes (1K = 1k = 1024 bytes). To specify the size +# in bytes just don't use modifiers. +# Default: 1M +#LogFileMaxSize 2M + +# Log time with each message. +# Default: no +#LogTime yes + +# Also log clean files. Useful in debugging but drastically increases the +# log size. +# Default: no +#LogClean yes + +# Use system logger (can work together with LogFile). +# Default: no +#LogSyslog yes +LogSyslog yes + +# Specify the type of syslog messages - please refer to 'man syslog' +# for facility names. +# Default: LOG_LOCAL6 +#LogFacility LOG_MAIL + +# Enable verbose logging. +# Default: no +#LogVerbose yes + +# This option allows you to save a process identifier of the listening +# daemon (main thread). +# Default: disabled +#PidFile /var/run/clamd.pid +PidFile /var/run/clamav/clamd.pid + +# Optional path to the global temporary directory. +# Default: system specific (usually /tmp or /var/tmp). +#TemporaryDirectory /var/tmp + +# Path to the database directory. +# Default: hardcoded (depends on installation options) +#DatabaseDirectory /var/lib/clamav +DatabaseDirectory /usr/local/share/clamav + +# The daemon works in a local OR a network mode. Due to security reasons we +# recommend the local mode. + +# Path to a local socket file the daemon will listen on. +# Default: disabled (must be specified by a user) +#LocalSocket /tmp/clamd + +# Remove stale socket after unclean shutdown. +# Default: no +FixStaleSocket yes + +# TCP port address. +# Default: no +TCPSocket 3310 + +# TCP address. +# By default we bind to INADDR_ANY, probably not wise. +# Enable the following to provide some degree of protectiyes +# from the outside world. +# Default: no +TCPAddr 127.0.0.1 + +# Maximum length the queue of pending connections may grow to. +# Default: 15 +#MaxConnectionQueueLength 30 + +# Clamd uses FTP-like protocol to receive data from remote clients. +# If you are using clamav-milter to balance load between remote clamd daemons +# on firewall servers you may need to tune the options below. + +# Close the connection when the data size limit is exceeded. +# The value should match your MTA's limit for a maximal attachment size. +# Default: 10M +#StreamMaxLength 20M + +# Limit port range. +# Default: 1024 +#StreamMinPort 30000 +# Default: 2048 +#StreamMaxPort 32000 + +# Maximal number of threads running at the same time. +# Default: 10 +#MaxThreads 20 + +# Waiting for data from a client socket will timeout after this time (seconds). +# Value of 0 disables the timeout. +# Default: 120 +#ReadTimeout 300 + +# Waiting for a new job will timeout after this time (seconds). +# Default: 30 +#IdleTimeout 60 + +# Maximal depth directories are scanned at. +# Default: 15 +#MaxDirectoryRecursion 20 + +# Follow directory symlinks. +# Default: no +#FollowDirectorySymlinks yes + +# Follow regular file symlinks. +# Default: no +#FollowFileSymlinks yes + +# Perform internal sanity check (database integrity and freshness). +# Default: 1800 (30 min) +#SelfCheck 600 + +# Execute a command when virus is found. In the command string %v will +# be replaced by a virus name. +# Default: no +#VirusEvent /usr/local/bin/send_sms 123456789 "VIRUS ALERT: %v" + +# Run as a selected user (clamd must be started by root). +# Default: don't drop privileges +User clamav + +# Initialize supplementary group access (clamd must be started by root). +# Default: no +AllowSupplementaryGroups yes + +# Stop daemon when libclamav reports out of memory condition. +#ExitOnOOM yes + +# Don't fork into background. +# Default: no +#Foreground yes + +# Enable debug messages in libclamav. +# Default: no +#Debug yes + +# Do not remove temporary files (for debug purposes). +# Default: no +#LeaveTemporaryFiles yes + +## +## Executable files +## + +# PE stands for Portable Executable - it's an executable file format used +# in all 32-bit versions of Windows operating systems. This option allows +# ClamAV to perform a deeper analysis of executable files and it's also +# required for decompression of popular executable packers such as UPX, FSG, +# and Petite. +# Default: yes +#ScanPE yes + +# With this option clamav will try to detect broken executables and mark +# them as Broken.Executable +# Default: no +#DetectBrokenExecutables yes + + +## +## Documents +## + +# This option enables scanning of Microsoft Office document macros. +# Default: yes +#ScanOLE2 yes + +## +## Mail files +## + +# Enable internal e-mail scanner. +# Default: yes +#ScanMail yes + +# If an email contains URLs ClamAV can download and scan them. +# WARNING: This option may open your system to a DoS attack. +# Never use it on loaded servers. +# Default: no +#MailFollowURLs no + + +## +## HTML +## + +# Perform HTML normalisation and decryption of MS Script Encoder code. +# Default: yes +#ScanHTML yes + + +## +## Archives +## + +# ClamAV can scan within archives and compressed files. +# Default: yes +#ScanArchive yes + +# The options below protect your system against Denial of Service attacks +# using archive bombs. + +# Files in archives larger than this limit won't be scanned. +# Value of 0 disables the limit. +# Default: 10M +#ArchiveMaxFileSize 15M + +# Nested archives are scanned recursively, e.g. if a Zip archive contains a RAR +# file, all files within it will also be scanned. This options specifies how +# deep the process should be continued. +# Value of 0 disables the limit. +# Default: 8 +#ArchiveMaxRecursion 10 + +# Number of files to be scanned within an archive. +# Value of 0 disables the limit. +# Default: 1000 +#ArchiveMaxFiles 1500 + +# If a file in an archive is compressed more than ArchiveMaxCompressionRatio +# times it will be marked as a virus (Oversized.ArchiveType, e.g. Oversized.Zip) +# Value of 0 disables the limit. +# Default: 250 +#ArchiveMaxCompressionRatio 300 + +# Use slower but memory efficient decompression algorithm. +# only affects the bzip2 decompressor. +# Default: no +#ArchiveLimitMemoryUsage yes + +# Mark encrypted archives as viruses (Encrypted.Zip, Encrypted.RAR). +# Default: no +#ArchiveBlockEncrypted no + +# Mark archives as viruses (e.g. RAR.ExceededFileSize, Zip.ExceededFilesLimit) +# if ArchiveMaxFiles, ArchiveMaxFileSize, or ArchiveMaxRecursion limit is +# reached. +# Default: no +#ArchiveBlockMax no + + +## +## Clamuko settings +## WARNING: This is experimental software. It is very likely it will hang +## up your system!!! +## + +# Enable Clamuko. Dazuko (/dev/dazuko) must be configured and running. +# Default: no +#ClamukoScanOnAccess yes + +# Set access mask for Clamuko. +# Default: no +#ClamukoScanOnOpen yes +#ClamukoScanOnClose yes +#ClamukoScanOnExec yes + +# Set the include paths (all files in them will be scanned). You can have +# multiple ClamukoIncludePath directives but each directory must be added +# in a seperate line. +# Default: disabled +#ClamukoIncludePath /home +#ClamukoIncludePath /students + +# Set the exclude paths. All subdirectories are also excluded. +# Default: disabled +#ClamukoExcludePath /home/bofh + +# Don't scan files larger than ClamukoMaxFileSize +# Value of 0 disables the limit. +# Default: 5M +#ClamukoMaxFileSize 10M diff --git a/packages/dspam/pkg/default.prefs.sample b/packages/dspam/pkg/default.prefs.sample new file mode 100644 index 00000000..d9be27ed --- /dev/null +++ b/packages/dspam/pkg/default.prefs.sample @@ -0,0 +1,43 @@ +# $Id$ +# default.prefs v3.2 +# Default preferences for DSPAM + +# This file serves two purposes. First, it sets the default preferences each +# user will see when using the preferences section of the DSPAM Control +# Center. Second, it may be symbolically linked (or copied) into DSPAM_HOME to +# set the system-wide default preferences, overriding any commandline or +# dspam.conf parameters. If symlinked, an administrator can edit these options +# in the DSPAM Administrative Suite. + +# Training Mode: TEFT, TOE, TUM, NOTRAIN +trainingMode=TEFT + +# Spam Action: quarantine, tag +spamAction=quarantine + +# Spam Subject: the text to be prepended onto the subject line of tagged spams +spamSubject=[SPAM] + +# Bayesian Noise Reduction: on/off +enableBNR=on + +# Automatic Whitelisting: on/off +enableWhitelist=on + +# Statistical Sedation: 0-10 +statisticalSedation=5 + +# Signature Location: message, headers, attachment +signatureLocation=message + +# Whitelist Threshold: the minimum number of innocent hits from a recipient to +# be automatically whitelisted. Do not set this value too low! +whitelistThreshold=10 + +# showFactors: when set to on, the determining factors for each message will +# be added to a X-DSPAM-Factors message header. +showFactors=off + +# optIn/optOut: Depending on the opt mode set, you can also use one of these. +#optIn=on +#optOut=off diff --git a/packages/dspam/pkg/dspam.inc b/packages/dspam/pkg/dspam.inc new file mode 100644 index 00000000..e2cdad40 --- /dev/null +++ b/packages/dspam/pkg/dspam.inc @@ -0,0 +1,3916 @@ + '/var/db/dspam', + 'DSPAM_BIN' => '/usr/local/bin', + 'DSPAM' => '/usr/local/bin/dspam', + 'DSPAM_STATS' => '/usr/local/bin/dspam_stats', + 'DSPAM_WWW' => '/usr/local/pkg', + 'DSPAM_ARGS' => '--deliver=innocent --class=innocent ' . + '--source=error --user %CURRENT_USER% -d %u', + 'DSPAM_ADMIN_GROUP' => 'dspam_admins', + 'ALL_PROCS' => 'ps auxw', + 'MAIL_QUEUE' => 'mailq | grep \'^[0-9,A-F]\' | wc -l', + 'HISTORY_SIZE' => 799, + 'HISTORY_PER_PAGE' => 100, + 'QUARANTINE_PER_PAGE' => 100, + 'HISTORY_DUPLICATES' => 'yes', + 'MAX_COL_LEN' => 26, + 'QNAV_BUTTONS' => 20, + 'HNAV_BUTTONS' => 22, + 'SORT_DEFAULT' => 'Rating', + '3D_GRAPHS' => 1, + 'USE_MAILPARSE' => 1, + 'OPTMODE' => 'NONE', + 'LOCAL_DOMAIN' => 'localhost', + 'AUTODETECT' => 1, + 'OPENSOURCE' => 0, + /* 'DATE_FORMAT' => '%d.%m.%Y %H:%M' */ + 'DATE_FORMAT' => '%b %d %H:%M' + ); + +/* + * Determine which extensions are available + */ +if ($CONFIG['AUTODETECT'] == 1 || $CONFIG['AUTODETECT'] == "") { + $CONFIG['PREFERENCES_EXTENSION'] = 0; + $CONFIG['LARGE_SCALE'] = 0; + $CONFIG['DOMAIN_SCALE'] = 0; + + $buffer = ""; + $handle = popen ("/usr/local/bin/dspam --version", "r"); + + while (!feof($handle)) { + $buffer .= fgets($handle, 4096); + } + + pclose($handle); + + if (strpos($buffer, '--enable-preferences-extension') !== false) { + $CONFIG['PREFERENCES_EXTENSION'] = 1; + } + if (strpos($buffer, '--enable-large-scale') !== false) { + $CONFIG['LARGE_SCALE'] = 1; + } + if (strpos($buffer, '--enable-domain-scale') !== false) { + $CONFIG['DOMAIN_SCALE'] = 1; + } +} + +/* + * Determine admin status + */ + +$CONFIG['ADMIN'] = isDSPAMAdmin($HTTP_SERVER_VARS['AUTH_USER']); + +/* + * Determine which user should be used to display DSPAm related data + */ +$CURRENT_USER = $HTTP_SERVER_VARS['AUTH_USER']; + +if (empty($CONFIG['ADMIN']) && + strpos($_SERVER['SCRIPT_NAME'], "wizard.php") !== false) { + + $group = $config['system']['user'][$userindex[$HTTP_SERVER_VARS['AUTH_USER']]]['groupname']; + $home = "/" . getGroupHomePage($group); + if ($home == "/") { $home = "/index.php"; } + + if (! headers_sent()) { + pfSenseHeader($home); + exit; + } else { + $htmlstr = <<< EOD + + + Unauthorized Access + + + +

Unauthorized Access - You will be redirected shortly!

+ + +EOD; + print $htmlstr; + exit; + } +} + +/* + * only DSPAM admins can change the current user without logging out + * and logging in as another user again. + */ +if ($_POST) { + if (! empty($_POST['username']) && $CONFIG['ADMIN'] == 1) { + $CURRENT_USER = $_POST['username']; + } +} +if ($_GET) { + if (! empty($_GET['user']) && $CONFIG['ADMIN'] == 1) { + $CURRENT_USER = $_GET['user']; + } +} + +if ($CURRENT_USER == "") { + $input_errors[] = "System Error. I was unable to determine your identity."; +} + +preg_replace('/%CURRENT_USER%/', $CURRENT_USER, $CONFIG['DSPAM_ARGS']); + +/* current store */ +$PREF =& GetPrefs($CURRENT_USER); +$CURRENT_STORE = $PREF['localStore']; +if ($CURRENT_STORE == "") {$CURRENT_STORE = $CURRENT_USER; } + +$USER = GetPath($CURRENT_STORE); +$MAILBOX = $USER . ".mbox"; +$TMPFILE = $USER . ".tmp"; + +/* + * Set up initial display variables + */ +CheckQuarantine(); +$DATA['REMOTE_USER'] = $CURRENT_USER; + +/* + * Check whether DSPAM is already configured. + */ +$install_errors =& check_dspam_installation(); +$input_errors = array_merge($input_errors, $install_errors); + +/* + * Check whether we should generate notification messages + */ +if (isset($config['installedpackages']['dspam']['config'][0]['notification-email'])) { + $tmpmsg = createNotificationMessages(); + if (! empty($tmpmsg)) + $tmpmsg .= "\n" . createUserNotificationMessages(); + else + $tmpmsg = createUserNotificationMessages(); + + $savemsg =& $tmpmsg; +} + +/* + * Process Commands + */ +if (isset($pgtitle) && is_array($pgtitle)) { + /* Performance */ + if (basename($_SERVER['SCRIPT_NAME']) == "dspam-perf.php") { + if ($_GET) { + if ($GET['command'] == "resetStats") { + ResetStats(); + } else if ($GET['command'] == "tweak") { + Tweak(); + } + } + + $display_errors =& DisplayIndex(); + $input_errors = array_merge($input_errors, $display_errors); + } + + /* Preferences */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam-prefs.php") { + $savemsg = ""; + $prefs_errors =& DisplayPreferences(NULL, $savemsg); + $input_errors = array_merge($input_errors, $prefs_errors); + } + + /* Quarantine */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam-quarantine.php") { + if ($_GET) { + if ($_GET['command'] == "viewMessage") { + $showpart = 0; + $ctype = 0; + $sortby = "Rating"; + $currentPage = 1; + $qPerPage = 0; + + if (isset($_GET['showpart'])) { $showpart = $_GET['showpart']; } + if (isset($_GET['ctype'])) { $ctype = intval($_GET['ctype']); } + if (isset($_GET['sortby'])) { $sortby = $_GET['sortby']; } + if (isset($_GET['page'])) { $currentPage = $_GET['page']; } + if (isset($_GET['qperpage'])) { $qPerPage = $_GET['qperpage']; } + + $quarantine_errors =& QuarantineViewMessage($_GET['signatureID'], + $showpart, + $ctype, + $sortby, + $currentPage, + $qPerPage); + $input_errors = array_merge($input_errors, $quarantine_errors); + } else if (isset($_GET['sortby'])) { + $qperpage = $CONFIG['QUARANTINE_PER_PAGE']; + if (isset($_GET['qperpage'])) { $qperpage = $_GET['qperpage']; } + $page = 1; + if (isset($_GET['page'])) { $page = $_GET['page']; } + + $quarantine_errors =& DisplayQuarantine($_GET['sortby'], + intval($page), + intval($qperpage)); + $input_errors = array_merge($input_errors, $quarantine_errors); + } else if (isset($_GET['qperpage'])) { + if (isset($_GET['page'])) { + $quarantine_errors =& DisplayQuarantine($CONFIG['SORT_DEFAULT'], + intval($_GET['page']), + intval($_GET['qperpage'])); + $input_errors = array_merge($input_errors, $quarantine_errors); + } else { + $quarantine_errors =& DisplayQuarantine($CONFIG['SORT_DEFAULT'], + 1, + intval($_GET['qperpage'])); + $input_errors = array_merge($input_errors, $quarantine_errors); + } + } else { + $displayq_errors =& DisplayQuarantine($CONFIG['SORT_DEFAULT'], 1); + $input_errors = array_merge($input_errors, $displayq_errors); + } + } else if ($_POST) { + if ($_POST['command'] == "processQuarantine") { + $signatures = array(); + + while (list($key, $val) = each($_POST)) { + if (strpos($key, "chkmsg") !== false) { + $signatures[$key] = $val; + } + } + if ($_POST['processAction']) { + $processq_errors =& ProcessQuarantine($signatures, + $_POST['processAction'], + $_POST['sortby'], + intval($_POST['qpage']), + intval($_POST['qperpage'])); + $input_errors = array_merge($input_errors, $processq_errors); + } else { + $processq_errors =& ProcessQuarantine($signatures, + "None", + $_POST['sortby'], + intval($_POST['qpage']), + intval($_POST['qperpage'])); + $input_errors = array_merge($input_errors, $processq_errors); + } + } else if ($_POST['command'] == "processFalsePositive") { + $processfp_errors =& ProcessFalsePositive($_POST['signatureID'], + $_POST['sortby'], + intval($_POST['qpage']), + intval($_POST['qperpage'])); + $input_errors = array_merge($input_errors, $processfp_errors); + $displayq_errors =& DisplayQuarantine($_POST['sortby'], + intval($_POST['qpage']), + intval($_POST['qperpage'])); + $input_errors = array_merge($input_errors, $displayq_errors); + } + } else { + /* usually this particular line of code should not be hit because + * the user always triggers a GET or POST action. Unfortunatly at + * the time, the alerts page is implemented in a way that neither + * triggers a GET nor a POST action if initially accessed via the + * tab. Hence this final catch all else. + */ + $displayq_errors =& DisplayQuarantine($CONFIG['SORT_DEFAULT'], 1); + $input_errors = array_merge($input_errors, $displayq_errors); + } + } + + /* Analysis */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam-analysis.php") { + $displaya_errors =& DisplayAnalysis(); + $input_errors = array_merge($input_errors, $displaya_errors); + } + + /* History */ + else if (in_array(gettext("History"), $pgtitle)) { + if ($_POST) { + /* Form fields that may be submited via POST: + * - command + * - username + * - msgid$retrain_checked_msg_no (checkbox, multible times) + */ + $checked = array(); + + while (list($key, $val) = each($_POST)) { + if (strpos($key, "msgid") !== false) { + $checked[] = $val; + } + } + + $displayh_errors =& DisplayHistory($_POST['command'], + "", + $checked, + $_POST['username'], + "", + $_POST['hpage'], + $_POST['hperpage']); + $input_errors = array_merge($input_errors, $displayh_errors); + } else if ($_GET) { + /* Form fields that may be submited via GET: + * - history_page + * - command + * - signatureID + * - retrain + * - user + */ + $displayh_errors =& DisplayHistory($_GET['command'], + $_GET['signatureID'], + NULL, + $_GET['user'], + $_GET['retrain'], + isset($_GET['page']) ? intval($_GET['page']) : 1, + isset($_GET['hperpage']) ? $_GET['hperpage'] : $CONFIG['QUARANTINE_PER_PAGE']); + $input_errors = array_merge($input_errors, $displayh_errors); + } else { + $displayh_errors =& DisplayHistory("", // command + "", // signature ID + NULL, // signatures to be retrained + $CURRENT_USER); + $input_errors = array_merge($input_errors, $displayh_errors); + } + } else if (in_array(gettext("Fragment"), $pgtitle)) { + if ($_GET) { + $displayf_errors =& DisplayFragment($_GET['signatureID'], + $_GET['from'], + $_GET['subject'], + $_GET['info'], + $_GET['time']); + $input_errors = array_merge($input_errors, $displayf_errors); + } + } + + /* Info Page */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam.php") { + $info_errors =& DisplayInfos(); + $input_errors = array_merge($input_errors, $info_errors); + } + +/* ========================================================================== */ +/* = A D M I N R E L A T E D F U N C T I O N C A L L S = */ +/* ========================================================================== */ + + /* Status */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam-admin.php" && $CONFIG['ADMIN']) { + $displays_errors =& DisplayStatus(); + $input_errors = array_merge($input_errors, $displays_errors); + } + + /* User Statistics */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam-admin-stats.php" && $CONFIG['ADMIN']) { + $displayus_errors =& DisplayUserStatistics(); + $input_errors = array_merge($input_errors, $displayus_errors); + } + + /* Preferences */ + else if (basename($_SERVER['SCRIPT_NAME']) == "dspam-admin-prefs.php" && $CONFIG['ADMIN']) { + $savemsg = ""; + $displayap_errors =& DisplayAdminPreferences($savemsg); + $input_errors = array_merge($input_errors, $displayap_errors); + } +} else { + $input_errors[] = "The page you did request can't be processed by dspam.inc."; +} + +/* ========================================================================== */ +/* = A D M I N S T A T U S F U N C T I O N S = */ +/* ========================================================================== */ + +function DisplayAdminPreferences(&$statusmsg) { + return DisplayPreferences("admin", $statusmsg); +} + +function DisplayUserStatistics() { + global $CONFIG, $DATA; + $b = "rowEven"; + + $sl_total = 0; + $il_total = 0; + $sm_total = 0; + $fp_total = 0; + $sc_total = 0; + $ic_total = 0; + $mailbox_total = 0; + + $pd = popen("{$CONFIG['DSPAM_STATS']} 2>&1", "r"); + + while (!feof($pd)) { + $line = chop( fgets($pd, 4096) ); + + if ($b == "qrowEven") { + $b = "qrowOdd"; + } else { + $b = "qrowEven"; + } + + $line = preg_replace('/:/', ' ', $line); + + list($username, , $sl, , $il, , $fp, , $sm, , $sc, , $ic) + = (preg_split('/\s+/', $line)); + if ($username == "" && $sl == "") { + /* we do not want to display data that + * does not bleong to any user + */ + continue; + } else if ($sl == "") { + $line = fgets($pd, 4096); + $line = preg_replace('/:/', ' ', $line); + list(, , $sl, , $il, , $fp, , $sm, , $sc, , $ic) + = (preg_split('/\s+/', $line)); + } + + $PREFS =& GetPrefs($username, GetPath($username).".prefs"); + if ($PREFS['enableBNR'] == "on") { $PREFS['enableBNR'] = "OFF"; } + if ($PREFS['enableWhitelist'] == "on") { $PREFS['enableWhitelist'] = "OFF"; } + $PREFS['spamAction'] = ucfirst($PREFS['spamAction']); + $PREFS['enableBNR'] = strtoupper($PREFS['enableBNR']); + $PREFS['enableWhitelist'] = strtoupper($PREFS['enableWhitelist']); + + $mailbox = GetPath($username).".mbox"; + if ( file_exists($mailbox) ) { + $mailbox_size = filesize($mailbox); + $mailbox_display = sprintf("%2.1f KB", ($mailbox_size / 1024)); + $mailbox_total += $mailbox_size; + } + else { + $mailbox_display = "--"; + } + + $sl_total += $sl; + $il_total += $il; + $sm_total += $sm; + $fp_total += $fp; + $sc_total += $sc; + $ic_total += $ic; + + $DATA['TABLE'] .= "{$username}" . + " {$mailbox_display}" . + " {$sl}" . + " {$il}" . + " {$fp}" . + " {$sm}" . + " {$sc}" . + " {$ic}" . + " {$PREFS['trainingMode']}" . + " {$PREFS['spamAction']}" . + " {$PREFS['enableBNR']}" . + " {$PREFS['enableWhitelist']}" . + " {$PREFS['statisticalSedation']}" . + " {$PREFS['signatureLocation']}" . + "\n"; + } + pclose($pd); + + $mailbox_total_display = sprintf("%2.1f KB", ($mailbox_total / 1024)); + + $b = "listhdrr"; + $DATA['TABLE'] .= "Total". + " {$mailbox_total_display}". + " {$sl_total}". + " {$il_total}". + " {$sm_total}". + " {$fp_total}". + " {$sc_total}". + " {$ic_total}". + "  ". + "  ". + "  ". + "  ". + "  ". + "  ". + "\n"; +} + +function &DisplayStatus() { + global $CONFIG, $DATA; + + $LOG = "{$CONFIG['DSPAM_HOME']}/system.log"; + $spam_daily = array(); + $nonspam_daily = array(); + $period_daily = array(); + $fp_daily = array(); + $sm_daily = array(); + $inoc_daily = array(); + $whitelist_daily = array(); + $spam_weekly = array(); + $nonspam_weekly = array(); + $period_weekly = array(); + $fp_weekly = array(); + $sm_weekly = array(); + $inoc_weekly = array(); + $$whitelist_weekly = array(); + $msgpersecond = array(); + $classes = array(); + + list (, $min, $hour, $mday, $mon, $year, , ,) = (localtime(time())); + $hmstart = time() - 60; + $daystart = mktime(0, 0, 0, $mon, $mday, $year); + $periodstart = $daystart - (3600*24*24); /* 2 Weeks ago */ + $dailystart = time() - (3600*23); + $c_weekly = 0; /* Cursor to most recent time slot */ + $c_daily = 0; + + if (! file_exists($LOG)) { + return $input_errors[] = "No historical data is available (log file »{$LOG}« does not exist)."; + } + + /* Initialize each individual time period */ + + for ($i = 0; $i <= 23; $i++) { + $h = To12Hour($hour - (23-$i)); + $period_daily[$i] = $h; + $spam_daily[$i] = 0; + $nonspam_daily[$i] = 0; + $sm_daily[$i] = 0; + $fp_daily[$i] = 0; + $inoc_daily[$i] = 0; + } + + for ($i = 0; $i <= 23; $i++) { + $d = $daystart - (3600 * 24 * (24 - $i)); + list (, , , $lday, $lmon, $lyear, , ,) = (localtime($d)); + $lmon++; + $lyear += 1900; + $period_weekly[$i] = "{$lmon}/{$lday}/{$lyear}"; + $spam_weekly[$i] = 0; + $nonspam_weekly[$i] = 0; + $sm_weekly[$i] = 0; + $fp_weekly[$i] = 0; + $inoc_weekly[$i] = 0; + } + + if($fd = @fopen("{$LOG}", "r")) { + while (!feof($fd)) { + $line = fgets($fd, 4096); + list ($t_log, $c_log, , $signature, , $e_log) = preg_split('/\t/', $line); + if ($t_log > time()) { continue; } + + $last_message = $t_log; + + /* Only Parse Log Data in our Time Period */ + if ($t_log >= $periodstart) { + list (, $tmin, $thour, $tday, $tmon, $tyear) = (localtime($t_log)); + $tmon++; + $tyear += 1900; + + /* Weekly Graph */ + $c_weekly = 0; + while($period_weekly[$c_weekly] <> "{$tmon}/{$tday}/{$tyear}" && $c_weekly < 24) { + $c_weekly++; + } + + if ($c_log == "E") { + if ($classes[$signature] == "S") { + $spam_weekly[$c_weekly]--; + if ($spam_weekly[$c_weekly] < 0) { $spam_weekly[$c_weekly] = 0; } + } else if ($classes[$signature] == "I") { + $nonspam_weekly[$c_weekly]--; + if ($nonspam_weekly[$c_weekly] < 0) { $nonspam_weekly[$c_weekly] = 0; } + } else if ($classes[$signature] == "W") { + $whitelist_weekly[$c_weekly]--; + if ($whitelist_weekly[$c_weekly] < 0) { $whitelist_weekly[$c_weekly] = 0; } + } else if ($classes[$signature] == "F") { + $spam_weekly[$c_weekly]++; $fp_weekly[$c_weekly]--; + if ($fp_weekly[$c_weekly] < 0) { $fp_weekly[$c_weekly] = 0; } + } else if ($classes[$signature] == "M") { + $sm_weekly[$c_weekly]--; $nonspam_weekly[$c_weekly]++; + if ($sm_weekly[$c_weekly] < 0) { $sm_weekly[$c_weekly] = 0; } + } else if ($classes[$signature] == "N") { + $inoc_weekly[$c_weekly]--; + if ($inoc_weekly[$c_weekly] < 0) { $inoc_weekly[$c_weekly] = 0; } + } + } else { + $classes[$signature] = $c_log; + } + + if ($c_log == "S") { $spam_weekly[$c_weekly]++; } + if ($c_log == "I") { $nonspam_weekly[$c_weekly]++; } + if ($c_log == "W") { $whitelist_weekly[$c_weekly]++; } + if ($c_log == "F") + { $spam_weekly[$c_weekly]--; $fp_weekly[$c_weekly]++; + if ($spam_weekly[$c_weekly] < 0) { $spam_weekly[$c_weekly] = 0; } + } + if ($c_log == "M") + { $sm_weekly[$c_weekly]++; $nonspam_weekly[$c_weekly]--; + if ($nonspam_weekly[$c_weekly] < 0) { $nonspam_weekly[$c_weekly] = 0; } + } + if ($c_log == "N") { $inoc_weekly[$c_weekly]++; } + + + /* Daily Graph */ + if ($t_log >= $dailystart) { + while($period_daily[$c_daily] <> To12Hour($thour) && $c_daily < 24) { + $c_daily++; + } + + if ($c_log == "E") { + if ($classes[$signature] == "S") { + $spam_daily[$c_daily]--; + if ($spam_daily[$c_daily] < 0) { $spam_daily[$c_daily] = 0; } + } else if ($classes[$signature] == "I") { + $nonspam_daily[$c_daily]--; + if ($nonspam_daily[$c_daily] < 0) { $nonspam_daily[$c_daily] = 0; } + } else if ($classes[$signature] == "W") { + $whitelist_daily[$c_daily]--; + if ($whitelist_daily[$c_daily] < 0) { $whitelist_daily[$c_daily] = 0; } + } else if ($classes[$signature] == "F") { + $spam_daily[$c_daily]++; $fp_daily[$c_daily]--; + if ($fp_daily[$c_daily] < 0) { $fp_daily[$c_daily] = 0; } + } else if ($classes[$signature] == "M") { + $sm_daily[$c_daily]--; $nonspam_daily[$c_daily]++; + if ($sm_daily[$c_daily] < 0) { $sm_daily[$c_daily] = 0; } + } else if ($classes[$signature] == "N") { + $inoc_daily[$c_daily]--; + if ($inoc_daily[$c_daily] < 0) { $inoc_daily[$c_daily] = 0; } + } + } + + if ($c_log == "S") { $spam_daily[$c_daily]++; } + if ($c_log == "I") { $nonspam_daily[$c_daily]++; } + if ($c_log == "W") { $whitelist_daily[$c_daily]++; } + if ($c_log == "F") + { $spam_daily[$c_daily]--; $fp_daily[$c_daily]++; + if ($spam_daily[$c_daily] < 0) { $spam_daily[$c_daily] = 0; } + } + if ($c_log == "M") + { $sm_daily[$c_daily]++; $nonspam_daily[$c_daily]--; + if ($nonspam_daily[$c_daily] < 0) { $nonspam_daily[$c_daily] = 0; } + } + if ($c_log == "N") { $inoc_daily[$c_daily]++; } + } + + /* Last Half-Minute */ + if ($t_log >= $hmstart) { + $msgpersecond[$t_log]++; + $DATA['AVG_PROCESSING_TIME'] += $e_log; + $keycount_exectime++; + } + } + } // end while + + fclose($fd); + } else { + return $input_errors[] = "Unable to open logfile: {$LOG}."; + } // end if + + /* Calculate Avg. Messages Per Second */ + foreach(array_values($msgpersecond) as $el) { + $DATA['AVG_MSG_PER_SECOND'] += $el; + } + $DATA['AVG_MSG_PER_SECOND'] /= 60; + $DATA['AVG_MSG_PER_SECOND'] = sprintf("%2.2f", $DATA['AVG_MSG_PER_SECOND']); + + /* Calculate Avg. Processing Time */ + if ($keycount_exectime == 0) { + $DATA['AVG_PROCESSING_TIME'] = 0; + } else { + $DATA['AVG_PROCESSING_TIME'] /= $keycount_exectime; + } + $DATA['AVG_PROCESSING_TIME'] = sprintf("%01.6f", $DATA['AVG_PROCESSING_TIME']); + + /* Calculate Number of processes, Uptime and Mail Queue length */ + $pd = popen("{$CONFIG['ALL_PROCS']} | grep dspam | grep -v grep | grep -v cgi | grep -v sock | wc -l", "r"); + $DATA['DSPAM_PROCESSES'] = fgets($pd, 4096); + pclose($pd); + + $pd = popen("uptime", "r"); + $DATA['UPTIME'] = fgets($pd, 4096); + pclose($pd); + + $pd = popen("{$CONFIG['MAIL_QUEUE']}", "r"); + $DATA['MAIL_QUEUE'] = fgets($pd, 4096); + pclose($pd); + + /* Calculate Graphs */ + $DATA['SPAM_TODAY'] = $spam_weekly[24]; + $DATA['NONSPAM_TODAY'] = $nonspam_weekly[24]; + $DATA['SM_TODAY'] = $sm_weekly[24]; + $DATA['FP_TODAY'] = $fp_weekly[24]; + $DATA['INOC_TODAY'] = $inoc_weekly[24]; + $DATA['TOTAL_TODAY'] = $DATA['SPAM_TODAY'] + $DATA['NONSPAM_TODAY'] + $DATA['SM_TODAY'] + + $DATA['FP_TODAY'] + $DATA['INOC_TODAY']; + + $DATA['SPAM_THIS_HOUR'] = $spam_daily[23]; + $DATA['NONSPAM_THIS_HOUR'] = $nonspam_daily[23]; + $DATA['SM_THIS_HOUR'] = $sm_daily[23]; + $DATA['FP_THIS_HOUR'] = $fp_daily[23]; + $DATA['INOC_THIS_HOUR'] = $inoc_daily[23]; + $DATA['TOTAL_THIS_HOUR'] = $DATA['SPAM_THIS_HOUR'] + + + $DATA['NONSPAM_THIS_HOUR'] + + $DATA['SM_THIS_HOUR'] + + $DATA['FP_THIS_HOUR'] + + $DATA['INOC_THIS_HOUR']; + + if (is_array($spam_daily) && + is_array($nonspam_daily) && + is_array($sm_daily) && + is_array($fp_daily) && + is_array($inoc_daily) && + is_array($whitelist_daily) && + is_array($period_daily)) { + $DATA['DATA_DAILY'] = join(",", $spam_daily) + . "_" + . join(",", $nonspam_daily) + . "_" + . join(",", $sm_daily) + . "_" + . join(",", $fp_daily) + . "_" + . join(",", $inoc_daily) + . "_" + . join(",", $whitelist_daily) + . "_" + . join(",", $period_daily); + + foreach($spam_daily as $el){ $DATA['TS_DAILY'] += $el; }; + foreach($nonspam_daily as $el){ $DATA['TI_DAILY'] += $el; } + foreach($sm_daily as $el){ $DATA['SM_DAILY'] += $el; } + foreach($fp_daily as $el){ $DATA['FP_DAILY'] += $el; } + foreach($inoc_daily as $el){ $DATA['INOC_DAILY'] += $el; } + foreach($whitelist_daily as $el){ $DATA['TI_DAILY'] += $el; } + } + + if (is_array($spam_weekly) && + is_array($nonspam_weekly) && + is_array($sm_weekly) && + is_array($fp_weekly) && + is_array($inoc_weekly) && + is_array($whitelist_weekly) && + is_array($period_weekly)) { + $DATA['DATA_WEEKLY'] = join(",", $spam_weekly) + . "_" + . join(",", $nonspam_weekly) + . "_" + . join(",", $sm_weekly) + . "_" + . join(",", $fp_weekly) + . "_" + . join(",", $inoc_weekly) + . "_" + . join(",", $whitelist_weekly) + . "_" + . join(",", $period_weekly); + + foreach($spam_weekly as $el){ $DATA['TS_WEEKLY'] += $el; } + foreach($nonspam_weekly as $el){ $DATA['TI_WEEKLY'] += $el; } + foreach($sm_weekly as $el){ $DATA['SM_WEEKLY'] += $el; } + foreach($fp_weekly as $el){ $DATA['FP_WEEKLY'] += $el; } + foreach($inoc_weekly as $el){ $DATA['INOC_WEEKLY'] += $el; } + foreach($whitelist_weekly as $el){ $DATA['TI_WEEKLY'] += $el; } + } +} + +function &DisplayInfos() { + global $CONFIG, $DATA, $g; + $validity = "valide"; + + $pd = @popen("{$CONFIG['DSPAM']} --version", "r"); + fgets($pd, 4096); // ignore 1st line + $DATA['DSPAM_VERSION'] = fgets($pd, 4096); + fgets($pd, 4096); // ignore next line + $DATA['DSPAM_COPYRIGHT'] = fgets($pd, 4096); + $DATA['DSPAM_WEBSITE'] = fgets($pd, 4096); + fgets($pd, 4096); // ignore next line + $DATA['DSPAM_COPYRIGHT_TEXT'] = fgets($pd, 4096); + $DATA['DSPAM_COPYRIGHT_TEXT'] .= " " . fgets($pd, 4096); + fgets($pd, 4096); // ignore next line + $DATA['DSPAM_CONFIGURE_ARGS'] = str_replace("Configuration parameters: ", "", fgets($pd, 4096)); + + pclose($pd); + + if (file_exists("{$g['conf_path']}/nione.lic") && + file_exists("{$g['conf_path']}/nione.lic.sha1")) { + if ($fd = @fopen("{$g['conf_path']}/nione.lic", "r")) { + $owneru = str_replace("Licensed User: ", "", fgets($fd, 4096)); + if ($owneru == "") { $validity = "invalide (owner data not found)"; } + $ownerc = str_replace("Company: ", "", fgets($fd, 4096)); + if ($ownerc == "") { $validity = "invalide (company not found)"; } + $lkey = str_replace("License Key: ", "", fgets($fd, 4096)); + if ($lkey == "") { $validity = "invalide (license key not found)"; } + $pdate = strtotime( str_replace("Purchase Date: ", "", fgets($fd, 4096)) ); + if ($pdate == "") { $validity = "invalide (purchase date not found)"; } + + fclose($fd); + } else { + $validity = "invalide (license files not found)"; + } + + require_once ("knione"); + $gen_lkey = getNIONEKey(trim($owneru), trim($ownerc)); + if (trim($lkey) <> $gen_lkey) { $validity = "invalide (wrong license key)"; } + + $cdate = mktime(0, 0, 0, date("m"), + date("d"), + date("Y")); + + $edate = mktime(0, 0, 0, date("m", $pdate), + date("d", $pdate), + date("Y", $pdate)+1); + + if ($edate < $cdate || + $pdate > $cdate) { + $validity = "invalide (license expired)"; + } + + if ($fd = @fopen("{$g['conf_path']}/nione.lic.sha1", "r")) { + $chksum = str_replace("SHA1 (nione.lic) = ", "", fgets($fd, 4096)); + $chksum_new = sha1_file("{$g['conf_path']}/nione.lic"); + + if (trim($chksum) !== trim($chksum_new)) { + $validity = "invalide (wrong license file checksum)"; + } + + fclose($fd); + } else { + $validity = "invalide (license files not found)"; + } + } else { + $validity = "invalide (license files not found)"; + } + + $DATA['OWNER'] = $owneru; + $DATA['COMPANY'] = $ownerc; + $DATA['LICENSE_KEY'] = $lkey; + $DATA['LICENSE_VALIDITY'] = $validity; + $DATA['PURCHASE_DATE'] = date("F j, Y", $pdate); + $DATA['EXPIRY_DATE'] = date("F j, Y", $edate); +} + +/* ========================================================================== */ +/* = H I S T O R Y F U N C T I O N S = */ +/* ========================================================================== */ + +function &DisplayFragment($sigID = "", + $from = "", + $subject = "", + $info = "", + $time = "") { + global $DATA, $USER; + + $sigID = preg_replace('/\/', '///', $sigID); + + $DATA['FROM'] = $from; + $DATA['SUBJECT'] = $subject; + $DATA['INFO'] = $info; + $DATA['TIME'] = $time; + + if($fd = @fopen("{$USER}.frag/{$sigID}.frag", "r")) { + while (!feof($fd)) { + /* sanitize HTML markup */ + $line = preg_replace("//e", "'>'", $line); + $DATA['MESSAGE'] .= $line; + } + fclose($fd); + } else { + return $input_errors[] = "Unable to open file {$USER}.frag/{$sigID}.frag."; + } +} + +function &DisplayHistory($command = "", + $sigID= "", + $retrainChecked = array(), + $username = "", + $retrainParam = "", + $currentPage = 1, + $hPerPage = 0) { + global $CONFIG, $USER, $CURRENT_USER, $DATA; + + $buffer = array(); + $history = array(); + $rec = array(); + $rowclass = "rowEven"; + + if ($command == "retrainChecked" && count ($retrainChecked) > 0) { + foreach($retrainChecked as $el) { + list ($retrain, $signature) = split(":", $el); + if ($retrain == "innocent") { + ProcessFalsePositive(quotemeta($signature)); + } else if ($retrain == "innocent" || $retrain == "spam") { + system("{$CONFIG['DSPAM']} --source=error --class=" . quotemeta($retrain) . + " --signature=" . quotemeta($signature) . + " --user " . quotemeta($CURRENT_USER)); + } + } + // TODO: Do we need the other params which were submited during the current + // POS/GET request? + pfSenseHeader("/dspam-history.php?user={$username}&page={$currentPage}&hperpage={$hPerPage}"); + } else { + if ($retrainParam <> "") { + if ($retrainParam == "innocent") { + ProcessFalsePositive(); + } else { + system("{$CONFIG['DSPAM']} --source=error --class=" . quotemeta($retrainParam) . + " --signature=" . quotemeta($sigID) . + " --user " . quotemeta($CURRENT_USER)); + } + // TODO: Do we need the other params which were submited during the current + // POS/GET request? + pfSenseHeader("/dspam-history.php?user={$username}&page={$currentPage}&hperpage={$hPerPage}"); + } + } + + $LOG = "{$USER}.log"; + if (! file_exists($LOG)) { + return $input_errors[] = "No historical data is available (log file »{$USER}.log« does not exist)."; + } + + /* Preseed retraining information and delivery errors */ + + $fd = fopen($LOG, "r"); + while (!feof($fd)) { + /* TODO: If the subject line contains a , the below array would + * contain more then seven elements and thus would be invalide. + * + * The below code is some kind of a bug fix. + */ + $cline = fgets($fd, 4096); + $log_columns = preg_split("/\t/", $cline); + list($time, $class, $from, $signature, $subject, $info, $messageid) = $log_columns; + if (count ($log_columns) > 7) { + /* get values from the array beginning */ + $time = array_shift($log_columns); + $class = array_shift($log_columns); + $from = array_shift($log_columns); + $signature = array_shift($log_columns); + /* get msgid and info from the array end */ + $messageid = array_pop($log_columns); + $info = array_pop($log_columns); + /* the remaining parts are belonging to the subject */ + $subject = implode(" ", $log_columns); + } + + if ($signature == "") { continue; } + if ($class == "M" || $class == "F" || $class == "E") { + if ($class == "E") { + $rec[$signature]['info'] = $info; + } else if ($class == "F" || $class == "M") { + $rec[$signature]['class'] = $class; + $rec[$signature]['count']++; + if ($rec[$signature]['info'] == "") + { $rec[$signature]['info'] = $info; } + } + /* filter out resents if there are any. Since it's the same + * message we only allow retraining on the 1st occurence of it. + */ + } else if ($messageid == "" || + $rec[$signature]['messageid'] != $messageid || + $CONFIG['HISTORY_DUPLICATES'] <> "no") { + $rec[$signature]['time'] = $time; + $rec[$signature]['class'] = $class; + $rec[$signature]['from'] = $from; + $rec[$signature]['signature'] = $signature; + $rec[$signature]['subject'] = $subject; + $rec[$signature]['info'] = $info; + $rec[$signature]['messageid'] = $messageid; + + array_unshift($buffer, $rec[$signature]); + } + } // end while + fclose($fd); + + /* if the page size wasn't specified, set a default one */ + if ($CONFIG['HISTORY_PER_PAGE'] == 0) { + $CONFIG['HISTORY_PER_PAGE'] = 50; + } + + if (isset($hPerPage) && $hPerPage > 0) { + $CONFIG['HISTORY_PER_PAGE'] = $hPerPage; + } + + if (isset($currentPage) && isset($CONFIG['HISTORY_PER_PAGE'])) { + $pages = ceil( (count ($buffer) / $CONFIG['HISTORY_PER_PAGE']) ); + $begin = (($currentPage - 1) * $CONFIG['HISTORY_PER_PAGE']); + $ranges = ceil ($pages / $CONFIG['HNAV_BUTTONS']); + + /* Now lets just keep the information that we really need. */ + $buffer = array_splice($buffer, $begin, $CONFIG['HISTORY_PER_PAGE']); + } + + $retrain_checked_msg_no = 0; + while ($rec = array_pop($buffer)) { + $time = $rec['time']; + $class = $rec['class']; + $from = $rec['from']; + $signature = $rec['signature']; + $subject = $rec['subject']; + $info = $rec['info']; + $messageid = $rec['messageid']; + + if ($signature == "") { continue; } + if ($rec[$signature]['displayed'] <> "") { continue; } + if ($class == "E") { continue; } + $rec[$signature]['displayed'] = 1; + + /* Resends of retrained messages will need the original from/subject line */ + if ($messageid <> "") { + if ($from == "") { $from = $rec[$messageid]['from']; } + if ($subject == "") { $subject = $rec[$messageid]['subject']; } + + + if ($rec[$messageid]['from'] == "") { $rec[$messageid]['from'] = $from; } + if ($rec[$messageid]['subject'] == "") { $rec[$messageid]['subject'] = $subject; } + } + + if ($from == "") { $from = ""; } + if ($subject == "") { $subject = ""; } + + $ctime = ""; + if(isset($CONFIG["DATE_FORMAT"])) { + $ctime = strftime($CONFIG["DATE_FORMAT"], localtime($time)); + } else { + /* date format was taken from ctime.pl */ + $ctime = date ("D M d H:i:s TY",$time); + $ttmp = preg_split("/\s+/", $ctime); + $t = preg_split("/\:/", $ttmp[3]); + $xtmp = preg_split("/\s+/", $ctime); + $x = $xtmp[0]; + $m = "a"; + if ($t[0] > 12) { $t[0] -= 12; $m = "p"; } + if ($t[0] == 0) { $t[0] = 12; } + $ctime = "{$x} {$t[0]}:{$t[1]}{$m}"; + } + + /* Set the appropriate type and label for this message */ + + $cl = ""; + $cllabel = ""; + if ($rec[$signature]['class'] <> "") { $class = $rec[$signature]['class']; } + if ($class == "S") { $cl = "spam"; $cllabel="SPAM"; } + else if ($class == "I") { $cl = "innocent"; $cllabel="Good"; } + else if ($class == "F") { + if (fmod($rec[$signature]['count'], 2) != 0) { + $cl = "false"; $cllabel="Miss"; + } else { + $cl = "innocent"; $cllabel="Good"; + } + } + else if ($class == "M") { + if (fmod($rec[$signature]['count'], 2) != 0) { + $cl = "missed"; $cllabel="Miss"; + } else { + $cl = "spam"; $cllabel="SPAM"; + } + } + else if ($class == "N") { $cl = "inoculation"; $cllabel="Spam"; } + else if ($class == "C") { $cl = "blacklisted"; $cllabel="RBL"; } + else if ($class == "W") { $cl = "whitelisted"; $cllabel="Whitelist"; } + if ($messageid <> "") { + if ($rec[$messageid]['resend'] <> "") { + $cl = "relay"; + $cllabel = "Resend"; + } + $rec[$messageid]['resend'] = $signature; + } + + if ($rec[$signature]['info'] <> "") { $info = $rec[$signature]['info']; } + + /* sanitize HTML markup */ + $from = preg_replace("//e", "'>'", $from); + $subject = preg_replace('//e', "'>'", $subject); + + if (strlen($from) > $CONFIG['MAX_COL_LEN']) { $from = substr($from, 0, $CONFIG['MAX_COL_LEN']) . "..."; } + if (strlen($subject) > $CONFIG['MAX_COL_LEN']) { $subject = substr($subject, 0, $CONFIG['MAX_COL_LEN']) . "..."; } + + $rclass = ""; + if ($class == "I" || $class == "W" || $class == "F") { $rclass = "spam"; } + if ($class == "S" || $class == "M") { $rclass = "innocent"; } + + $retrain = ""; + if (preg_match('/^(M|F)$/', $rec[$signature]['class']) > 0 && + fmod($rec[$signature]['count'], 2) != 0) { + $retrain = "Retrained"; + } + + if ($retrain == "") { + $retrain = "As " . ucfirst($rclass) . ""; + } else { + $retrain .= "(Undo)"; + } + + $path = "{$USER}.frag/{$signature}.frag"; + if (file_exists($path)) { + $pairs = array(); + $pairs['template'] = "fragment"; + $pairs['signatureID'] = $signature; + $sub = $subject; + $sub = preg_replace('/#/e', '//', $sub); + $sub = preg_replace("/(['])/e", '/\\$1/', $sub); + $pairs['subject'] = $sub; + $pairs['from'] = $from; + $pairs['info'] = $info; + $pairs['time'] = $ctime; + $pairs['user'] = $username; + $pairs['page'] = $currentPage; + $pairs['hperpage'] = $hPerPage; + $url = SafeVars($pairs); + $from = "{$from}"; + } + + $entry = << + {$cllabel} + + + + + + + {$ctime} + {$from} + {$subject} + {$info} + + +EOD; + + $retrain_checked_msg_no++; + array_push($history, $entry); + + if ($rowclass == "qrowEven") { + $rowclass = "qrowOdd"; + } else { + $rowclass = "qrowEven"; + } + $hurtz++; + } // end while + + $entry = << + +EOD; + array_push($history, $entry); + + while($line = array_pop($history)) { $DATA['HISTORY'] .= $line; } + + if ($CONFIG['HISTORY_PER_PAGE'] > 0) { + /* prepare quarantine navbar */ + if (($currentPage - 1) >= 1) { $previousPage = $currentPage - 1; } + else { $previousPage = 1; } + + if (($currentPage + 1) <= $pages) { $nextPage = $currentPage + 1; } + else { $nextPage = $pages; } + + $historyFooterBegin = << + + |<  + <  + +EOD; + + $historyFooterEnd = <<>  + >| + + + +EOD; + + $ranges_array = array(); + $rpages = $pages; + for ($i = 0; $i < $ranges; $i++) { + $range = array(); + $range['start'] = (($i + 1)* $CONFIG['HNAV_BUTTONS']) - ($CONFIG['HNAV_BUTTONS'] - 1); + + if (($i + 1) == $ranges) { + $range['end'] = ($range['start'] + $rpages) - 1; + } else { + $range['end'] = (($i + 1)* $CONFIG['HNAV_BUTTONS']); + $rpages -= $CONFIG['HNAV_BUTTONS']; + } + + $ranges_array[$i] = $range; + } + + /* generate nav buttons */ + foreach($ranges_array as $range){ + if ($currentPage >= $range['start'] && $currentPage <= $range['end']) { + for ($i = $range['start']; ; $i++) { + if ($i > $range['end']) { + break; + } else { + if ($i == $currentPage) { + $historyFooter .= "{$i} \n"; + } else { + $historyFooter .= "{$i} \n"; + } + } + } + } + } + + $DATA['HISTORY_FOOTER'] = $historyFooterBegin . $historyFooter .$historyFooterEnd; + $DATA['HPAGES'] = $pages; + $DATA['HPAGE'] = $currentPage; + +/* + $DATA['HISTORY'] .= "
["; + if (($history_pages > 1) && ($history_page > 1)) { + $i = $history_page - 1; + $DATA['HISTORY'] .= " < "; + } + for($i = 1; $i <= $history_pages; $i++) { + if ($i == $history_page) { + $DATA['HISTORY'] .= " $i "; + } else { + $DATA['HISTORY'] .= " {$i} "; + } + } + if (($history_pages > 1) && ($history_page < $history_pages)) { + $i = $history_page + 1; + $DATA['HISTORY'] .= " > "; + } + $DATA['HISTORY'] .= "]
"; +*/ + } // end if +} + +/* ========================================================================== */ +/* = A N A L Y S I S F U N C T I O N S = */ +/* ========================================================================== */ + +function &DisplayAnalysis() { + global $USER, $CURRENT_USER, $CONFIG, $DATA; + $LOG = "{$USER}.log"; + + $Stats = array( + "daily" => array(), + "weekly" => array() + ); + + list(, $min, $hour, $mday, $mon, $year, , ,) = (localtime(time())); + $daystart = mktime(0, 0, 0, $mon, $mday, $year); + $periodstart = $daystart - (3600 * 24 * 13); /* 2 Weeks ago */ + $dailystart = time() - (3600 * 23); + + /* TODO: There's an issue that the Perl timelocal returns + * different values compared to PHP's mktime. There's a + * difference of 2678400, which will be added manually below. + */ + $daystart += 2678400; + $periodstart += 2678400; + + if (file_exists($LOG)) { + if ($fd = @fopen($LOG, "r")) { + $scount = 0; + $icount = 0; + $wcount = 0; + $fcount = 0; + $mcount = 0; + + while(!feof($fd)) { + $buffer = fgets($fd, 4096); + /* drop blank lines */ + if (strlen($buffer) == 0) { continue; } + list($t_log, $c_log) = preg_split("/\t/", $buffer); + + /* Only Parse Log Data in our Time Period */ + /* TODO: The below if should evaluate to true at least for some data */ + if ($t_log >= $periodstart) { + list(, $tmin, $thour, $tday, $tmon, , , ,) = (localtime($t_log)); + $tmon++; + + foreach (array('weekly', 'daily') as $period) { + $idx = 0; + if ($period == "weekly") { + $idx= "{$tmon}/{$tday}"; + } else { + if ($t_log <= $dailystart) { continue; } + $idx = To12Hour($thour); + } + if (is_array($Stats[$period]) && ! array_key_exists ($idx, $Stats[$period])) { + $Stats[$period][$idx] = array( + 'nonspam' => 0, + 'spam' => 0, + 'title' => $idx, + 'idx' => $t_log); + } + /* TODO: Is passing by reference here correct? */ + $hr =& $Stats[$period][$idx]; + /* S => spam */ + if ($c_log== "S") { + $hr['spam']++; + $scount++; + } + /* I => innocent W => whitelisted */ + if ($c_log == "I" || $c_log == "W") { + $hr['nonspam']++; + if ($c_log == "I") { $icount++; } + else { $wcount++; } + } + /* F => false positive */ + if ($c_log == "F") { + $hr['spam']--; + if ($hr['spam'] < 0) { $hr['spam'] = 0; } + $hr['nonspam']++; + $fcount++; + } + /* M => spam miss */ + if ($c_log == "M") { + $hr['nonspam']--; + if ($hr['nonspam'] < 0) { $hr['nonspam'] = 0; } + $hr['spam']++; + $mcount++; + } + } + } + } + + fclose($fd); + } else { + return $input_errors[] = "Unable to open log file: {$LOG}."; + } + + usort ((array_values ($Stats[$period])), "cmpArrayValues"); + + foreach (array('weekly', 'daily') as $period) { + $uc_period = strtoupper($period); + $hk = "DATA_{$uc_period}"; + $lst = array(); + + foreach (array_values($Stats[$period]) as $hr) { + foreach (array('spam', 'nonspam', 'title') as $type ) { + + if (empty($lst[$type])) { + $lst[$type] = array(); + } + + /* populate (newly) created array */ + $lst[$type][] = $hr[$type]; + + $totk=""; + + if ($type == "spam") { $totk="S"; } + else if ($type == "nonspam") { $totk="I"; } + + if ($totk == "") { continue; } + + $sk="T{$totk}_{$uc_period}"; + if (empty($DATA[$sk])) { $DATA[$sk] = 0; } + + $DATA[$sk] += $hr[$type]; + } + } // end foreach + $DATA[$hk] = + @join(",",$lst['spam']) . "_" . + @join(",",$lst['nonspam']) . "_" . + @join(",",$lst['title']); + } // end foreach + } else { + return $input_errors[] = "No historical data is available (log file »{$LOG}« does not exist)."; + } // end if +} + +function cmpArrayValues($a, $b) { + if ($a['idx'] == $b['idx']) + return 0; + + return ($a['idx'] < $b['idx']) ? -1 : 1; +} + +/* ========================================================================== */ +/* = P E R E F E R E N C E S F U N C T I O N S = */ +/* ========================================================================== */ + +function &DisplayPreferences($mode = "", &$statusmsg){ + global $USER, $CURRENT_USER, $CONFIG, $DATA; + $FILE = "{$USER}.prefs"; + $username = $CURRENT_USER; + + if ($_POST) { + $pconfig = $_POST; + + if ($pconfig['chk_feature_nr'] <> "on") { + $pconfig['chk_feature_nr'] = "off"; + } + + if ($pconfig['chk_feature_optin'] <> "on") { + $pconfig['chk_feature_optin'] = "off"; + } + + if ($pconfig['chk_feature_optout'] <> "on") { + $pconfig['chk_feature_optout'] = "off"; + } + + if ($pconfig['chk_feature_at'] <> "on") { + $pconfig['chk_feature_at'] = "off"; + } + + if ($pconfig['chk_feature_aw'] <> "on") { + $pconfig['chk_feature_aw'] = "off"; + } + + if ($CONFIG['PREFERENCES_EXTENSION'] == 1) { + if ($pconfig['msgtag'] == "") { + $pconfig['msgtag'] = "''"; + } else { + $pconfig['msgtag'] = quotemeta($pconfig['msgtag']); + } + + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " trainingMode " . quotemeta($pconfig['rad_train']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " spamAction " . quotemeta($pconfig['rad_train_action']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " signatureLocation " . quotemeta($pconfig['signatureLocation']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " spamSubject " . quotemeta($pconfig['msgtag']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " statisticalSedation " . quotemeta($pconfig['rad_filter_sens']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " enableBNR " . quotemeta($pconfig['chk_feature_nr']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " optOut " . quotemeta($pconfig['chk_feature_optout']) . " >/dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " optIn " . quotemeta($pconfig['chk_feature_optin']) . " >/dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " showFactors " . quotemeta($pconfig['chk_feature_at']) . " > /dev/null"); + exec("{$CONFIG['DSPAM_BIN']}/dspam_admin ch pref " . quotemeta($username) . + " enableWhitelist " . quotemeta($pconfig['chk_feature_aw']) . " > /dev/null"); + } else { + $prefsstr = << 0) { + if ($mode == 0) { $mode = 1; } + else { continue; } + } + + $buff = array_shift($buffer); + if (preg_match('/^From /', $buff) == 0) { + array_push($temp, $buff); + } + + continue; + } + + foreach($temp as $tempel) { + if ($tempel == "") { break; } + list($key, $val) = preg_split('/\: ?/', $tempel, 2); + $head[$key] = $val; + } + if ($head['X-DSPAM-Signature'] == $sigID) { + $found = 1; + $old_erep = error_reporting(E_ALL); + if ($pd = @popen("|{$CONFIG['DSPAM']} {$CONFIG['DSPAM_ARGS']} >{$TMPFILE} 2>&1", "w")) { + $pdresult = fread($handle, 2096); + + foreach($temp as $tempel) { + fwrite($pd, "{$tempel}\n"); + } + + pclose($pd); + error_reporting($old_erep); + } else { + $error = true; + $input_errors[] = "Unable to ope process pipe in function ProcessFalsePositive."; + } + } + } + + /* Couldn't find the message, so just retrain on signature */ + if (!$found) { + system("$CONFIG{'DSPAM'} --source=error --class=innocent --signature=" . quotemeta($sigID) . + " --user " . quotemeta($CURRENT_USER)); + } + + if ($error) { + $log = array(); + $fd = fopen("{$TMPFILE}", "r"); + while (!feof($handle)) { + $log .= fgets($fd, 4096); + } + fclose($fd); + unlink("{$TMPFILE}"); + return $input_errors[] = $log; + } + + unlink("{$TMPFILE}"); + $signatures[$sigID] = "on"; + return QuarantineDeleteSpam("", $signatures, $sortBy, $currentPage, $qPerPage); +} + +function &QuarantineManyNotSpam($signatures = array(), $sortBy = "Rating", $currentPage = 1, $qPerPage = 0){ + global $MAILBOX, $USER; + $buffer = array(); + $errors = array(); + + /* read the user's mailbox line by line into a buffer */ + $fd = fopen("{$MAILBOX}", "r"); + while (!feof($fd)) { + $line = chop(fgets($fd, 4096)); + array_push($buffer, $line); + } + fclose ($fd); + + if ($fd_FILE = @fopen("{$MAILBOX}", "w")) { + $fd_RETRAIN = fopen("{$USER}.retrain.log", "a"); + + /* iterate over the mailbox buffer */ + reset($buffer); + $i = 0; + while ($i < count($buffer)) { + $temp = array(); + $head = array(); + $mode = 0; + $buff = ""; + + /* this while tries to iterate over one single mesage including + * the message header and the message body. + */ + while((preg_match('/^From /', $buff) == 0) && ($i < count($buffer))) { + $buff = $buffer[0]; + + /* switch mode if we are hitting DSPAMs + * pseudo From QUARANTINE line (without a + * colon after the From). + */ + if (preg_match('/^From /', $buff) > 0) { + if ($mode == 0) { + $mode = 1; + $buff = array_shift($buffer); + array_push($temp, $buff); + $buff = ""; + continue; + } else { + continue; + } + } + + $buff = array_shift($buffer); + array_push($temp, $buff); + + continue; + } + + /* populate the header array with header fields */ + foreach($temp as $tempel) { + if ($tempel == "") { break; } + list($key, $val) = preg_split('/\: ?/', $tempel, 2); + $head[$key] = $val; + } + + $delivered = 0; + if ($signatures["chkmsg-{$head['X-DSPAM-Signature']}"] <> "") { + $err = Deliver($temp); + if ($err == "") { + $delivered = 1; + } else { + array_push($errors, $err); + } + } + if (!$delivered) { + foreach($temp as $tempel) { + fwrite($fd_FILE, "{$tempel}\n"); + } + } else { + fwrite($fd_RETRAIN, strval(time()) . "\t{$head['X-DSPAM-Signature']}\tinnocent\n"); + } + + $i++; + } // end while + + fclose($fd_FILE); + fclose($fd_RETRAIN); + } else { + return $input_errors[] = "Unable to open mailbox file: {$MAILBOX}."; + } + + if (count($errors) > 0) { + return $errors; + } + + return DisplayQuarantine($sortBy, $currentPage, $qPerPage); +} + +function Deliver($temp = array()) { + global $CONFIG; + + if (! file_exists("/tmp/dspam-error-output.txt")) { + touch("/tmp/dspam-error-output.txt"); + } + $descriptorspec = array( + 0 => array("pipe", "r"), // stdin is a pipe that the child will read from + 1 => array("pipe", "w"), // stdout is a pipe that the child will write to + 2 => array("file", "/tmp/dspam-error-output.txt", "a") // stderr is a file to write to + ); + + list($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizeb, + $atime,$mtimeb,$ctime,$blksize,$blocks) + = stat("/tmp/dspam-error-output.txt"); + clearstatcache(); + + $cwd = '/tmp'; + $process = @proc_open("{$CONFIG['DSPAM']} {$CONFIG['DSPAM_ARGS']}", + $descriptorspec, + $pipes); + + if (is_resource($process)) { + foreach($temp as $tempel) { + if (! @fwrite($pipes[0], "{$tempel}\n")) { + return "error while writting to pipe."; + } + } + + fclose($pipes[0]); + fclose($pipes[1]); + $return_value = proc_close($process); + + /* this isn't an elegant solution to determine whether + * DSPAM did report some errors, but it works for now + */ + list($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizea, + $atime,$mtimea,$ctime,$blksize,$blocks) + = stat("/tmp/dspam-error-output.txt"); + + if ($mtimeb <> $mtimea) { return "DSPAM did report some errors to /tmp/dspam-error-output.txt.\n" . + "Please check this particular file."; } + } else { + return "process is not a resource type."; + } + + return ""; +} + +function getLayoutedMessage($msgbuffer = "", $sigID = "", $showpart = 0, $ctype = 0){ + + if ($msgbuffer == "") { + return 'An error occured while parsing the message (no message).'; + } + if ($sigID == "") { + return 'An error occured while parsing the message (no signature).'; + } + + if( extension_loaded( 'mailparse' ) ) { + $msgdate = "N/A"; + $msgfrom = "N/A"; + $msgsub = "N/A"; + $msgto = "N/A"; + + $mime = mailparse_msg_create(); + mailparse_msg_parse($mime, $msgbuffer); + /* return an array of message parts - this contsists of the + * names of the parts only. + */ + $struct = mailparse_msg_get_structure($mime); + $htmlstr = << + Message Infos + + + Date: + %MSGDATE% + + + From: + %MSGFROM% + + + Subject: + %MSGSUB% + + + To: + %MSGTO% + + +   + + + Message Part + Part Type + Part Encoding + + + +EOD; + + /* print a choice of sections */ + foreach($struct as $st) { + + /* get a handle on the message resource for a subsection */ + $section = mailparse_msg_get_part($mime, $st); + /* get content-type, encoding and header information for that section */ + $info = mailparse_msg_get_part_data($section); + + /* replace placeholder with real data */ + if ($info['headers']['date'] <> "") { + $htmlstr = str_replace("%MSGDATE%", $info['headers']['date'], $htmlstr); + } + if ($info['headers']['from'] <> "") { + $htmlstr = str_replace("%MSGFROM%", $info['headers']['from'], $htmlstr); + } + if ($info['headers']['subject'] <> "") { + $htmlstr = str_replace("%MSGSUB%", $info['headers']['subject'], $htmlstr); + } + if ($info['headers']['to'] <> "") { + $htmlstr = str_replace("%MSGTO%", $info['headers']['to'], $htmlstr); + } + + $fontStyle = ""; + if ($showpart && $showpart == $st) { $fontStyle = " style=\"font-weight: bolder;\""; } + + if ($info["content-type"] == "text/html") { + $htmlstr .= "" . + "{$st}" . + "\n"; + } else { + $htmlstr .= "" . + "{$st}" . + "\n"; + } + + $htmlstr .= <<{$info["content-type"]} + {$info["charset"]} + + +EOD; + } // end foreach + + /* if we were called to display a part, do so now */ + if ($showpart) { + /* get a handle on the message resource for the desired part */ + $sec = mailparse_msg_get_part($mime, $showpart); + + $htmlstr .= << +   + + + Section {$showpart} + + + +EOD; + + ob_start(); + mailparse_msg_extract_part($sec, $msgbuffer); + $contents = ob_get_contents(); + ob_end_clean(); + $contents = wordwrap( str_replace(">", ">\n", $contents), 100, "\n" ); + /* quote the message for safe display in a browser */ + if ($ctype = 1) { + /* a html email message */ + $htmlstr .= "
" . $contents . "
\n\n"; + } else { + /* an ASCII (text) email message */ + $htmlstr .= htmlentities($contents) . "\n\n"; + } + } + + return $htmlstr; + } else { + return 'Could not load mailparse extension.'; + } +} + +function &QuarantineViewMessage($sigID = "", + $showpart = 0, + $ctype = 0, + $sortBy = "Rating", + $currentPage = 1, + $qPerPage = 0) { + global $MAILBOX, $DATA; + $buffer = array(); // mailbox buffer + + if ($sigID == "") { + return $input_errors[] = "No Message ID Specified."; + } + + /* save data to be displayed as HTML form data */ + $DATA['MESSAGE_ID'] = $sigID; + $DATA['SHOWPART'] = $showpart; + $DATA['CONTENT_TYPE'] = $ctype; + $DATA['QPAGE'] = $currentPage; + $DATA['SORTBY'] = $sortBy; + + if ($qPerPage > 0) { $CONFIG['QUARANTINE_PER_PAGE'] = $qPerPage; } + + /* read the user's mailbox line by line into a buffer */ + $fd = fopen("{$MAILBOX}", "r"); + while (!feof($fd)) { + $line = chop(fgets($fd, 4096)); + array_push($buffer, $line); + } + fclose ($fd); + + /* iterate over the mailbox buffer */ + reset($buffer); + $i = 0; + while ($i < count($buffer)) { + $temp = array(); + $head = array(); + $mode = 0; + $buff = ""; + + /* this while tries to iterate over one single mesage including + * the message header and the message body. + */ + while((preg_match('/^From /', $buff) == 0) && ($i < count($buffer))) { + $buff = $buffer[0]; + + /* switch mode if we are hitting DSPAMs + * pseudo From QUARANTINE line (without a + * colon after the From). + */ + if (preg_match('/^From /', $buff) > 0) { + if ($mode == 0) { $mode = 1; } + else { continue; } + } + + $buff = array_shift($buffer); + if (preg_match('/^From /', $buff) == 0) { + array_push($temp, $buff); + } + + continue; + } + + /* populate the header array with header fields */ + foreach($temp as $tempel) { + if ($tempel == "") { break; } + list($key, $val) = preg_split('/\: ?/', $tempel, 2); + $head[$key] = $val; + } + if ($head['X-DSPAM-Signature'] == $sigID) { + foreach($temp as $tempel) { + $tempel = preg_replace("//e", "'>'", $tempel); + $DATA['MESSAGE'] .= "{$tempel}\n"; + } + } + + $i ++; + } // end while +} + +function QuarantineDeleteSpam($deleteAll = "", $signatures = array(), $sortBy = "Rating", $currentPage = 1, $qPerPage = 0){ + global $USER, $MAILBOX; + $buffer = array(); + + /* this is the most easiest operation: If the user wants + * to completly delete any quarantined message, simply + * open his mailbox in write mode, which empties the + * user's mailbox file. + */ + if ($deleteAll <> "") { + + list($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) = stat("{$USER}.mbox"); + + $fd = fopen("{$USER}.mbox.size", "r"); + $sz = chop(fgets($fd, 4096)); + fclose($fd); + + if ($sz == $size) { + $fd = fopen("{$MAILBOX}", "w"); + fclose($fd); + unlink("{$USER}.mbox.size"); + unlink("{$USER}.mboxwarn"); + } else { + return DisplayQuarantine($sortBy, $currentPage, $qPerPage); + } + + //$FORM{'template'} = "performance"; + CheckQuarantine(); + return DisplayIndex(); + } + + /* iterate over the user's mailbox and store its contents in a buffer */ + $fd = fopen("{$MAILBOX}", "r"); + while (!feof($fd)) { + $line = chop(fgets($fd, 4096)); + array_push($buffer, $line); + } + fclose($fd); + + /* open the user's mailbox in write mode. This empties the mailbox! */ + fopen("{$MAILBOX}", "w"); + + /* iterate over the mailbox buffer */ + reset($buffer); + $i = 0; + while ($i < count($buffer)) { + $temp = array(); + $head = array(); + $mode = 0; + + /* this while tries to iterate over one single mesage including + * the message header and the message body. + */ + while((preg_match('/^From /', $buff) == 0) && ($i < count($buffer))) { + $buff = $buffer[0]; + + /* switch mode if we are hitting DSPAMs + * pseude From QUARANTINE line (without a + * colon after the From). + */ + if (preg_match('/^From /', $buff) > 0) { + if ($mode == 0) { + $mode = 1; + $buff = array_shift($buffer); + array_push($temp, $buff); + $buff = ""; + continue; + } else { + continue; + } + } + $buff = array_shift($buffer); + array_push($temp, $buff); + + continue; + } + + /* populate the header array with header fields */ + foreach($temp as $tempel) { + if ($tempel == "") { break; } + list($key, $val) = preg_split('/\: ?/', $tempel, 2); + $head[$key] = $val; + } + + /* if the current DSPAM signature wasn't selected by the + * user to be deleted, write it back to the user's mailbox. + */ + if ($signatures["chkmsg-{$head['X-DSPAM-Signature']}"] == "") { + foreach($temp as $tempel) { + fwrite($fd, "{$tempel}\n"); + } + } + + $i++; + } // end while + fclose($fd); + + return; +} + +function sortBySubject($a, $b){ + $lca = strtolower ($a['Subject']); + $lcb = strtolower ($b['Subject']); + + return strcmp($lca, $lcb); +} + +function sortByFrom($a, $b){ + $lca = strtolower ($a['From']); + $lcb = strtolower ($b['From']); + + return strcmp($lca, $lcb); +} + +function &DisplayQuarantine($sortBy = "Rating", $currentPage = 1, $qPerPage = 0) { + global $USER, $CURRENT_USER, $CONFIG, $DATA, $MAILBOX; + $alertcfg = &$config['installedpackages']['dspamalerts']['config']; + $alerts = array(); + + if (file_exists("{$USER}.mbox")) { + list($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) = stat("{$USER}.mbox"); + + $fd = fopen("{$USER}.mbox.size", "w"); + fwrite($fd, "{$size}"); + fclose($fd); + + $fd = fopen("{$MAILBOX}.stamp", "a+"); + fclose($fd); + chmod("{$MAILBOX}.stamp", 0660); + + /* process alert names */ + if (is_array($alertcfg)) { + $alert_counter = 0; + + foreach ($alertcfg as $alert) { + $alerts[$alert_counter] = $alert['alertname']; + $alert_counter++; + } + } + + $mode = ""; + $buffer = array(); + $headings = array(); + $rowclass = "qrowEven"; + $fd = fopen("{$MAILBOX}", "r"); + + while (!feof($fd)) { + $mbxline = chop(fgets($fd, 4096)); + + if ($mbxline <> "") { + if (($mode == "")) { + if (preg_match('/^From /', $mbxline) > 0) { + $mode = 1; + } else { + continue; + } + } + + array_push($buffer, $mbxline); + continue; + } + + if ($mode == "") { continue; } + + $alert = 0; + $new = array(); + + foreach($buffer as $buf_element){ + foreach($alerts as $al){ + if (preg_match("/{$al}/i", $buf_element) > 0) { + $alert = 1; + } + } + + if (preg_match('/^From /', $buf_element) > 0) { + $a = split(' ', $buf_element); + $x = 2; + + for ($i = 0; $i < count ($a); $i++) { + if ((preg_match('/\@|>/', $a[$i]) > 0) && $i > $x) { + $x = $i + 1; + } + } + + for ($i = 1; $i < $x; $i++) { array_shift($a); } + $start = join(" ", $a); + } else { + list($key, $val) = preg_split('/\: ?/', $buf_element, 2); + $new[$key] = $val; + } + } + + if ($rowclass == "qrowEven") { + $rowclass = "qrowOdd"; + } else { + $rowclass = "qrowEven"; + } + + $new['alert'] = $alert; + + if ($alert) { $rowclass="qrowAlert"; } + + $new['Sub2'] = $new['X-DSPAM-Signature']; + if (strlen($new['Subject']) > $CONFIG['MAX_COL_LEN']) { + $new['Subject'] = substr($new['Subject'], 0, $CONFIG['MAX_COL_LEN']) . "..."; + } + + if (strlen($new['From']) > $CONFIG['MAX_COL_LEN']) { + $new['From'] = substr($new['From'], 0, $CONFIG['MAX_COL_LEN']) . "..."; + } + + if ($new['Subject'] == "") { + $new['Subject'] = ""; + } + + //$new->{'rating'} = $new->{'X-DSPAM-Probability'} * $new->{'X-DSPAM-Confidence'}; + $new['rating'] = $new['X-DSPAM-Confidence']; + + foreach(array_keys($new) as $key) { + if ($key == "X-DSPAM-Signature") { continue; } + preg_replace('//', '/\>\;/', $new[$key]); + } + + array_push($headings, $new); + + $buffer = array(); + $mode = ""; + continue; + } // end while (!feof($fd)) + + if (! isset($sortBy) || $sortBy == "") { + $sortBy = $CONFIG['SORT_DEFAULT']; + } + if ($sortBy == "Rating") { + usort($headings, "sortByRating"); + } + if ($sortBy == "Subject") { + usort($headings, "sortBySubject"); + } + if ($sortBy == "From") { + usort($headings, "sortByFrom"); + } + if ($sortBy == "Date") { + array_reverse ($headings); + } + + /* + + +   + Rating + Date + From + Subject + + + */ + + $DATA['SORTBY'] = $sortBy; + $DATA['SORT_SELECTOR'] .= << +   + +EOD; + + if ($sortBy == "Rating") { + $DATA{'SORT_SELECTOR'} .= "Rating  ◊"; + } else { + $DATA{'SORT_SELECTOR'} .= "Rating"; + } + if ($sortBy == "Date") { + $DATA{'SORT_SELECTOR'} .= "Date  ◊"; + } else { + $DATA{'SORT_SELECTOR'} .= "Date"; + } + if ($sortBy == "Subject") { + $DATA{'SORT_SELECTOR'} .= "Subject  ◊"; + } else { + $DATA{'SORT_SELECTOR'} .= "Subject"; + } + if ($sortBy == "From") { + $DATA{'SORT_SELECTOR'} .= "From  ◊"; + } else { + $DATA{'SORT_SELECTOR'} .= "From"; + } + + $DATA{'SORT_SELECTOR'} .= "\n "; + + if (isset($qPerPage) && $qPerPage > 0) { + $CONFIG['QUARANTINE_PER_PAGE'] = $qPerPage; + } + + if (isset($currentPage) && isset($CONFIG['QUARANTINE_PER_PAGE'])) { + $pages = ceil( (count ($headings) / $CONFIG['QUARANTINE_PER_PAGE']) ); + $begin = (($currentPage - 1) * $CONFIG['QUARANTINE_PER_PAGE']); + $ranges = ceil ($pages / $CONFIG['QNAV_BUTTONS']); + + /* Now lets just keep the information that we really need. */ + $headings = array_splice ($headings, $begin, $CONFIG['QUARANTINE_PER_PAGE']); + } + + $rowclass = "qrowEven"; + foreach ($headings as $row) { + $rating = sprintf("%3.0f%%", $row['rating'] * 100.0); + if ($row['rating'] > 0.8) { + $markclass = "high"; + } else { + if ($row['rating'] < 0.7) { + $markclass = "low"; + } else { + $markclass = "medium"; + } + } + + $PAIRS = array(); + + $PAIRS['signatureID'] = $row['X-DSPAM-Signature']; + $PAIRS['command'] = "viewMessage"; + $PAIRS['user'] = $CURRENT_USER; + $PAIRS['page'] = $currentPage; + $PAIRS['sortby'] = $sortBy; + $PAIRS['qperpage'] = $CONFIG['QUARANTINE_PER_PAGE']; + // $PAIRS['template'] = "quarantine"; + + $url = SafeVars($PAIRS); + $sender = htmlentities ($row['From']); + $rsubject = htmlentities ($row['Subject']); + + if ($row['alert']) { + $outclass = "qrowAlert"; + } else { + $outclass = $rowclass; + } + + $ptfields = preg_split('/\s+/', $row['X-DSPAM-Processed']); + $times = preg_split('/\:/', $ptfields[3]); + $ptime = ""; + if($CONFIG["DATE_FORMAT"]) { + $month = array(); + $month['Jan'] = 0; + $month['Feb'] = 1; + $month['Mar'] = 2; + $month['Apr'] = 3; + $month['May'] = 4; + $month['Jun'] = 5; + $month['Jul'] = 6; + $month['Aug'] = 7; + $month['Sep'] = 8; + $month['Oct'] = 9; + $month['Nov'] = 10; + $month['Dec'] = 11; + $ptime = strftime($CONFIG["DATE_FORMAT"], + mktime($times[2], + $times[1], + $times[0], + $ptfields[2], + $month[$ptfields[1]], + $ptfields[4] - 1900)); + } else { + $mer = "a"; + if ($times[0] > 12) { $times[0] -= 12; $mer = "p"; } + if ($times[0] == 0) { $times[0] = "12"; } + $ptime = "{$ptfields[1]} {$ptfields[2]} {$times[0]}:{$times[1]}{$mer}"; + } + + /* + + + + + + + 50% + + Apr 1 05:59a + Mar 30 11:08a + + Last chance to register for Frankfurt, 4 April BEA... + + + + + + + + + {$rating} + + {$ptime} + {$row['From']} + + {$row['Subject']} + + + */ + + $DATA['QUARANTINE'] .= << + + + + + {$rating} + + {$ptime} + {$sender} + + {$rsubject} + + + +EOD; + + if ($rowclass == "qrowEven") { + $rowclass = "qrowOdd"; + } else { + $rowclass = "qrowEven"; + } + } // end foreach ($headings as $row) + + /* prepare quarantine navbar */ + if (($currentPage - 1) >= 1) { $previousPage = $currentPage - 1; } + else { $previousPage = 1; } + + if (($currentPage + 1) <= $pages) { $nextPage = $currentPage + 1; } + else { $nextPage = $pages; } + + $quarantineFooterBegin = << + + + + + + |<  + <  + +EOD; + + $quarantineFooterEnd = <<>  + >| + + + +EOD; + + $ranges_array = array(); + $rpages = $pages; + for ($i = 0; $i < $ranges; $i++) { + $range = array(); + $range['start'] = (($i + 1)* $CONFIG['QNAV_BUTTONS']) - ($CONFIG['QNAV_BUTTONS'] - 1); + + if (($i + 1) == $ranges) { + $range['end'] = ($range['start'] + $rpages) - 1; + } else { + $range['end'] = (($i + 1)* $CONFIG['QNAV_BUTTONS']); + $rpages -= $CONFIG['QNAV_BUTTONS']; + } + + $ranges_array[$i] = $range; + } + + /* generate nav buttons */ + foreach($ranges_array as $range){ + if ($currentPage >= $range['start'] && $currentPage <= $range['end']) { + for ($i = $range['start']; ; $i++) { + if ($i > $range['end']) { + break; + } else { + if ($i == $currentPage) { + $quarantineFooter .= "{$i} \n"; + } else { + $quarantineFooter .= "{$i} \n"; + } + } + } + } + } + + $DATA['QUARANTINE_FOOTER'] = $quarantineFooterBegin . $quarantineFooter .$quarantineFooterEnd; + $DATA['QPAGES'] = $pages; + $DATA['QPAGE'] = $currentPage; + } else { + $input_errors[] = "Unable to open DSPAM quarantine mailbox at »{$USER}.mbox«. " . + "If you are a DSPAM admin user you can savely " . + "ignore this error because such users usually do not " . + "have a DSPAM mailbox/quarantine."; + } + + return $input_errors; +} + +/* ========================================================================== */ +/* = P E R F O R M A N C E F U N C T I O N S = */ +/* ========================================================================== */ + +function ResetStats() { + global $USER; + + $fd = fopen("{$USER}.stats", "r"); + $ts = chop(fgets($fd, 4096)); + $group = chop(fgets($fd, 4096)); + fclose($fd); + list($ts, $ti, $tm, $fp, $sc, $ic) = split(",", $ts); + + if ($group <> "") { + $GROUP = GetPath($group) . ".stats"; + $fd = fopen("{$GROUP}", "r"); + $gts = chop(fgets($fd, 4096)); + fclose($fd); + list ($gts, $gti, $gtm, $gfp, $gsc, $gic) = split(",", $gts); + $ts -= $gts; + $ti -= $gti; + $tm -= $gtm; + $fp -= $gfp; + $sc -= $gsc; + $ic -= $gic; + } + + $fd = fopen("{$USER}.rstats", "w"); + fputs($fd, "{$ts}" . "," . "{$ti}" . "," . "{$tm}" . "," . + "{$fp}" . "," . "{$sc}" . "," . "{$ic}\n"); + fclose($fd); +} + +function Tweak() { + global $USER; + + $fd = fopen("{$USER}.rstats", "r"); + $ts = chop(fgets($fd, 4096)); + $group = chop($fgets($fd, 4096)); + fclose($fd); + list($ts, $ti, $tm, $fp, $sc, $ic) = split(",", $ts); + $tm++; + + $fd = fopen("{$USER}.rstats", "w"); + fputs($fd, "{$ts},{$ti},{$tm},{$fp},{$sc},{$ic}\n"); + fclose($fd); +} + +function &DisplayIndex() { + global $USER, $CONFIG, $DATA, $CURRENT_STORE, $CURRENT_USER; + + if (strpos ($CURRENT_USER, "@") === false) { + if (GetDomain($CURRENT_STORE) <> "") + $domain = GetDomain($CURRENT_STORE); + else + $domain = $config['system']['domain']; + + $spamalias = "spam-{$CURRENT_USER}@{$domain}"; + } else { + $spamalias = "spam-{$CURRENT_USER}"; + } + + if ($handle = @fopen ("{$USER}.stats", "r")) { + $spam .= chop(fgets($handle, 4096)); + $group .= chop(fgets($handle, 4096)); + fclose($handle); + list($spam, $innocent, $misses, $fp, $sc, $ic) = split(",", $spam); + + if ($group <> "") { + $GROUP = GetPath($group) . ".stats"; + $fd = fopen("{$GROUP}", "r"); + $gspam = chop(fgets($fd, 4096)); + fclose($fd); + + list($gspam, $ginnocent, $gfp, $gmisses, $gsc, $gic) = preg_split('/\,/', $gspam); + $spam -= $gspam; + $innocent -= $ginnocent; + $misses -= $gmisses; + $fp -= $gfp; + $sc -= $gsc; + $ic -= $gic; + } + + if ($spam + $innocent > 0) { + $ratio = sprintf("%2.3f", + (($spam+$misses)/($spam+$misses+$fp+$innocent)*100)); + } else { + $ratio = 0; + } + + if (file_exists("{$USER}.rstats")) { + $handle = fopen ("{$USER}.rstats", "r"); + $buffer = chop(fgets($handle, 4096)); + + fclose ($handle); + + list($rts, $rti, $rtm, $rfp) = split(",", $buffer); + + $real_missed = $misses - $rtm; + $real_caught = $spam - $rts; + $real_fp = $fp - $rfp; + + if ($real_fp < 0) { $real_fp = 0; } + + $real_innocent = $innocent - $rti; + + if (($spam - $rts > 0) && ($spam - $rts + $misses - $rtm != 0) && + ($real_caught + $real_missed > 0) && ($real_fp + $real_innocent > 0)) { + $monthly = sprintf("%2.3f", + (100.0-(($real_missed)/($real_caught+$real_missed))*100.0)); + $overall = sprintf("%2.3f", + (100-((($real_missed+$real_fp) / + ($real_fp+$real_innocent+$real_caught+$real_missed))*100))); + } else { + if ($real_caught == 0 && $real_missed > 0) { + $monthly = 0; + $overall = 0; + } else { + $monthly = 100; + $overall = 100; + } + } + + if ($real_fp + $real_innocent > 0) { + $fpratio = sprintf("%2.3f", ($real_fp/($real_fp+$real_innocent)*100)); + } else { + $fpratio = 0; + } + + } else { + $rts = $spam + $misses; + $rti = $innocent; + $rtm = $misses; + $rfp = $fp; + + $handle = fopen ("{$USER}.rstats", "w"); + fwrite("{$rts},{$rti},{$rtm},{$rfp}\n"); + fclose($handle); + + $monthly = "N/A"; + $fpratio = "N/A"; + $overall = "N/A"; + } + + $DATA['TIME'] = $time; + $DATA['TOTAL_SPAM_SCANNED'] = $spam; + $DATA['TOTAL_SPAM_LEARNED'] = $misses; + $DATA['TOTAL_NONSPAM_SCANNED'] = $innocent; + $DATA['TOTAL_NONSPAM_LEARNED'] = $fp; + $DATA['SPAM_RATIO'] = $ratio; + $DATA['SPAM_ACCURACY'] = $monthly; + $DATA['NONSPAM_ERROR_RATE'] = $fpratio; + $DATA['OVERALL_ACCURACY'] = $overall; + $DATA['TOTAL_SPAM_CORPUSFED'] = $sc; + $DATA['TOTAL_NONSPAM_CORPUSFED'] = $ic; + $DATA['TOTAL_SPAM_MISSED'] = $real_missed; + $DATA['TOTAL_SPAM_CAUGHT'] = $real_caught; + $DATA['TOTAL_NONSPAM_MISSED'] = $real_fp; + $DATA['TOTAL_NONSPAM_CAUGHT'] = $real_innocent; + $DATA['SPAM_ALIAS'] = $spamalias; + + $DATA['LOCAL_DOMAIN'] = $CONFIG['LOCAL_DOMAIN']; + } else { + $DATA['SPAM_ACCURACY'] = "N/A"; + $DATA['NONSPAM_ERROR_RATE'] = "N/A"; + $DATA['OVERALL_ACCURACY'] = "N/A"; + $DATA['SPAM_RATIO'] = "N/A"; + $DATA['TOTAL_SPAM_MISSED'] = 0; + $DATA['TOTAL_SPAM_CAUGHT'] = 0; + $DATA['SPAM_RATIO'] = "N/A"; + $DATA['TOTAL_NONSPAM_MISSED'] = 0; + $DATA['TOTAL_NONSPAM_CAUGHT'] = 0; + $DATA['NONSPAM_ERROR_RATE'] = "N/A"; + $DATA['TOTAL_SPAM_LEARNED'] = 0; + $DATA['TOTAL_SPAM_SCANNED'] = 0; + $DATA['TOTAL_NONSPAM_LEARNED'] = 0; + $DATA['TOTAL_NONSPAM_SCANNED'] = 0; + $DATA['TOTAL_SPAM_CORPUSFED'] = 0; + $DATA['TOTAL_NONSPAM_CORPUSFED'] = 0; + $DATA['SPAM_ALIAS'] = $spamalias; + + $input_errors[] = "Unable to open DSPAM stats at »{$USER}.stats«. " . + "If you are a DSPAM admin user you can savely " . + "ignore this error because such users usually do not " . + "have a DSPAM mailbox/quarantine."; + } + + return $input_errors; +} + +/* ========================================================================== */ +/* = G L O B A L F U N C T I O N S = */ +/* ========================================================================== */ + +function &GetPrefs($user) { + global $CONFIG, $USER; + $prefs = array(); + $FILE = "{$USER}.prefs"; + + if ($CONFIG['PREFERENCES_EXTENSION'] == 1) { + $handle = popen ("{$CONFIG['DSPAM_BIN']}/dspam_admin agg pref " . quotemeta($user)); + + while (!feof($handle)) { + $buffer = chop(fgets($handle, 4096)); + list($key, $value) = split("=", $buffer); + $prefs[$key] = $value; + } + + pclose($handle); + + } + + if (count(array_keys($prefs)) == 0 || $CONFIG['PREFERENCES_EXTENSION'] != 1) { + + /* This step is only required if the user + * wants to use the legacy DSPAm CGI app. + */ + if (! file_exists("{$CONFIG['DSPAM_WWW']}/default.prefs")) { + /* try to copy the sample file */ + if (file_exists("{$CONFIG['DSPAM_WWW']}/default.prefs.sample")) { + copy("{$CONFIG['DSPAM_WWW']}/default.prefs.sample", + "{$CONFIG['DSPAM_WWW']}/default.prefs"); + } + } + $handle = fopen ("{$CONFIG['DSPAM_WWW']}/default.prefs", "r"); + + while (!feof($handle)) { + $buffer = chop(fgets($handle, 4096)); + list($key, $value) = split("=", $buffer); + $prefs[$key] = $value; + } + + fclose($handle); + + if(file_exists($FILE)) { + $handle = fopen ($FILE, "r"); + + while (!feof($handle)) { + $buffer = chop(fgets($handle, 4096)); + list($key, $value) = split("=", $buffer); + $prefs[$key] = $value; + } + } + } + return $prefs; +} + +function CheckQuarantine() { + global $MAILBOX, $DATA; + $f = 0; + + if (file_exists($MAILBOX)) { + $handle = fopen($MAILBOX, "r"); + + while (!feof($handle)) { + $buffer = fgets($handle, 4096); + if (preg_match('/^From /', $buffer) <= 0) {continue;} + $f++; + } + + fclose ($handle); + } + + if ($f == 0) { + $f = "Empty"; + } + + $DATA['TOTAL_QUARANTINED_MESSAGES'] = $f; +} + +function http_parse_query( $array = NULL, $convention = '%s' ) { + if( count( $array ) == 0 ) { + return ''; + } else { + if( function_exists( 'http_build_query' ) ){ + $query = http_build_query( $array ); + } else { + $query = ''; + + foreach( $array as $key => $value ) { + if( is_array( $value ) ){ + $new_convention = sprintf( $convention, $key ) . '[%s]'; + $query .= http_parse_query( $value, $new_convention ); + } else { + $key = urlencode( $key ); + $value = urlencode( $value ); + $query .= sprintf( $convention, $key ) . "=$value&"; + } + } + } + + return $query; + } +} + +/* just a wrapper function */ +function SafeVars($PAIRS) { + $url = http_parse_query($PAIRS); + return $url; +} + +function To12Hour($h) { + if ($h < 0) { $h += 24; } + if ($h > 11) { if ($h > 12) { $h -= 12; } $h .= "p"; } + else { if ($h == 0) { $h = "12"; } $h .= "a"; } + return $h; +} + +function GetPath($store) { + global $CONFIG, $USER; + $PATH = ""; + + /* Domain-scalen */ + if ($CONFIG['DOMAIN_SCALE'] == 1) { + $splittmp = (split('@', $store)); + $VPOPUSERNAME = $splittmp[0]; + $VPOPDOMAIN = $splittmp[1]; + if ($VPOPDOMAIN == "") {$VPOPDOMAIN = "local";} + + $PATH = "{$CONFIG['DSPAM_HOME']}/data/{$VPOPDOMAIN}/{$VPOPUSERNAME}/" . + "{$VPOPUSERNAME}"; + return $PATH; + + /* Normal scale */ + } else if ($CONFIG['LARGE_SCALE'] == 0) { + $PATH = "{$CONFIG['DSPAM_HOME']}/data/{$USER}/{$USER}"; + return $PATH; + + /* Large-scale */ + } else { + if (strlen($USER) > 1) { + $PATH = "{$CONFIG['DSPAM_HOME']}/data/" . substr($USER, 0, 1) . + "/". substr($USER, 1, 1) . "/{$USER}/{$USER}"; + } else { + $PATH = "{$CONFIG['DSPAM_HOME']}/data/{$USER}/{$USER}"; + } + return $PATH; + } +} + +function GetUserDir($store) { + global $CONFIG, $USER; + $PATH = ""; + + /* Domain-scalen */ + if ($CONFIG['DOMAIN_SCALE'] == 1) { + $splittmp = (split('@', $store)); + $VPOPUSERNAME = $splittmp[0]; + $VPOPDOMAIN = $splittmp[1]; + if ($VPOPDOMAIN == "") {$VPOPDOMAIN = "local";} + + $PATH = "{$CONFIG['DSPAM_HOME']}/data/{$VPOPDOMAIN}/{$VPOPUSERNAME}"; + return $PATH; + + /* Normal scale */ + } else if ($CONFIG['LARGE_SCALE'] == 0) { + $PATH = "{$CONFIG['DSPAM_HOME']}/data/{$USER}/"; + return $PATH; + + /* Large-scale */ + } else { + if (strlen($USER) > 1) { + $PATH = "{$CONFIG['DSPAM_HOME']}/data/" . substr($USER, 0, 1) . + "/". substr($USER, 1, 1) . "/{$USER}/{$USER}"; + } else { + $PATH = "{$CONFIG['DSPAM_HOME']}/data/{$USER}"; + } + return $PATH; + } +} + +function GetDomain($store) { + global $CONFIG, $USER; + $PATH = ""; + + /* Domain-scalen */ + if ($CONFIG['DOMAIN_SCALE'] == 1) { + $splittmp = (split('@', $store)); + $VPOPUSERNAME = $splittmp[0]; + $VPOPDOMAIN = $splittmp[1]; + if ($VPOPDOMAIN == "") {$VPOPDOMAIN = "local";} + + return $VPOPDOMAIN; + } +} + +function isDSPAMAdmin($username = "") { + global $config, $CONFIG; + + $groupindex = index_groups(); + $userindex = index_users(); + + if ($username == "") { return 0; } + + $gname = $config['system']['group'][$groupindex[$config['system']['user'][$userindex[$username]]['groupname']]]['name']; + + if (isset($gname)) { + return ($gname === $CONFIG['DSPAM_ADMIN_GROUP']); + } + + return 0; +} + +function createUserNotificationMessages() { + global $config, $CONFIG, $USER, $CURRENT_USER, $CURRENT_STORE; + + $firstrun = "{$USER}.firstrun"; + $firstspam = "{$USER}.firstspam"; + $quarantinefull = "{$USER}.quarantinefull"; + $savemsg = ""; + + if (isset($config['installedpackages']['dspam']['config'][0]['dspam-domain'])) + $domain = $config['installedpackages']['dspam']['config'][0]['dspam-domain']; + else + $domain = $config['system']['domain']; + + if (GetDomain($CURRENT_STORE) <> "") + $user_domain = GetDomain($CURRENT_STORE); + else + $user_domain = $config['system']['domain']; + + $userdir = GetUserDir($CURRENT_STORE); + $hostname = $config['system']['hostname']; + $support_user = $config['installedpackages']['dspam']['config'][0]['dspam-contact']; + + /* return if there are no sample files */ + if (! file_exists("{$CONFIG['DSPAM_HOME']}/firstrun.txt.sample") || + ! file_exists("{$CONFIG['DSPAM_HOME']}/firstspam.txt.sample") || + ! file_exists("{$CONFIG['DSPAM_HOME']}/quarantinefull.txt.sample") || + ! file_exists($userdir)) { + return; + } + + /* create firstrun.txt */ + if (! file_exists("{$firstrun}")) { + $sample_msg = file_get_contents("{$CONFIG['DSPAM_HOME']}/firstrun.txt.sample"); + + $sample_msg = str_replace("support", $support_user, $sample_msg); + $sample_msg = str_replace("configureme.com", $user_domain, $sample_msg); + $sample_msg = str_replace("http://www.yourdomain.com/dspam/", + "http://{$hostname}.{$domain}/dspam.php", + $sample_msg); + + @file_put_contents("{$firstrun}", $sample_msg); + $savemsg .= " »{$firstrun}«, "; + } + + /* create firstspam.txt */ + if (! file_exists("{$firstspam}")) { + $sample_msg = file_get_contents("{$CONFIG['DSPAM_HOME']}/firstspam.txt.sample"); + + $sample_msg = str_replace("support", $support_user, $sample_msg); + $sample_msg = str_replace("configureme.com", $user_domain, $sample_msg); + $sample_msg = str_replace("http://www.yourdomain.com/dspam/", + "http://{$hostname}.{$domain}/dspam.php", + $sample_msg); + + @file_put_contents("{$firstspam}", $sample_msg); + $savemsg .= " »{$firstspam}«, "; + } + + /* create quarantinefull.txt */ + if (! file_exists("{$quarantinefull}")) { + $sample_msg = file_get_contents("{$CONFIG['DSPAM_HOME']}/quarantinefull.txt.sample"); + + $sample_msg = str_replace("support", $support_user, $sample_msg); + $sample_msg = str_replace("configureme.com", $user_domain, $sample_msg); + $sample_msg = str_replace("http://www.yourdomain.com/dspam/", + "http://{$hostname}.{$domain}/dspam.php", + $sample_msg); + + @file_put_contents("{$quarantinefull}", $sample_msg); + $savemsg .= " »{$quarantinefull}«."; + } + + if ($savemsg <> "") { + $savemsg = gettext("The following files were created: ") . $savemsg; + return $savemsg; + } + + return; +} + +function createNotificationMessages() { + global $config, $CONFIG, $USER, $CURRENT_USER; + + $firstrun = "{$CONFIG['DSPAM_HOME']}/firstrun.txt"; + $firstspam = "{$CONFIG['DSPAM_HOME']}/firstspam.txt"; + $quarantinefull = "{$CONFIG['DSPAM_HOME']}/quarantinefull.txt"; + $savemsg = ""; + + if (isset($config['installedpackages']['dspam']['config'][0]['dspam-domain'])) + $domain = $config['installedpackages']['dspam']['config'][0]['dspam-domain']; + else + $domain = $config['system']['domain']; + + $hostname = $config['system']['hostname']; + $support_user = $config['installedpackages']['dspam']['config'][0]['dspam-contact']; + + /* return if there are no sample files */ + if (! file_exists("{$CONFIG['DSPAM_HOME']}/firstrun.txt.sample") || + ! file_exists("{$CONFIG['DSPAM_HOME']}/firstspam.txt.sample") || + ! file_exists("{$CONFIG['DSPAM_HOME']}/quarantinefull.txt.sample")) { + return; + } + + /* create firstrun.txt */ + if (! file_exists("{$CONFIG['DSPAM_HOME']}/firstrun.txt")) { + $sample_msg = file_get_contents("{$CONFIG['DSPAM_HOME']}/firstrun.txt.sample"); + + $sample_msg = str_replace("support", $support_user, $sample_msg); + $sample_msg = str_replace("configureme.com", $domain, $sample_msg); + $sample_msg = str_replace("http://www.yourdomain.com/dspam/", + "http://{$hostname}.{$domain}/dspam.php", + $sample_msg); + + @file_put_contents("{$firstrun}", $sample_msg); + $savemsg .= " »{$firstrun}«, "; + } + + /* create firstspam.txt */ + if (! file_exists("{$CONFIG['DSPAM_HOME']}/firstspam.txt")) { + $sample_msg = file_get_contents("{$CONFIG['DSPAM_HOME']}/firstspam.txt.sample"); + + $sample_msg = str_replace("support", $support_user, $sample_msg); + $sample_msg = str_replace("configureme.com", $domain, $sample_msg); + $sample_msg = str_replace("http://www.yourdomain.com/dspam/", + "http://{$hostname}.{$domain}/dspam.php", + $sample_msg); + + @file_put_contents("{$firstspam}", $sample_msg); + $savemsg .= " »{$firstspam}«, "; + } + + /* create quarantinefull.txt */ + if (! file_exists("{$CONFIG['DSPAM_HOME']}/quarantinefull.txt")) { + $sample_msg = file_get_contents("{$CONFIG['DSPAM_HOME']}/quarantinefull.txt.sample"); + + $sample_msg = str_replace("support", $support_user, $sample_msg); + $sample_msg = str_replace("configureme.com", $domain, $sample_msg); + $sample_msg = str_replace("http://www.yourdomain.com/dspam/", + "http://{$hostname}.{$domain}/dspam.php", + $sample_msg); + + @file_put_contents("{$quarantinefull}", $sample_msg); + $savemsg .= " »{$quarantinefull}«."; + } + + if ($savemsg <> "") { + $savemsg = gettext("The following files were created: ") . $savemsg; + return $savemsg; + } + + return; +} + +function &check_dspam_installation() { + global $config; + + /* create RC files if necessary */ + if (! file_exists("/usr/local/etc/rc.d")) { + @mkdir("/usr/local/etc/rc.d"); + } + if (! file_exists("/usr/local/etc/rc.d/000.mysql.sh")) { + @copy("/usr/local/pkg/000.mysql.sh", "/usr/local/etc/rc.d/000.mysql.sh"); + @chmod("/usr/local/etc/rc.d/000.mysql.sh", 0755); + } + if (! file_exists("/usr/local/etc/rc.d/010.clamav-clamd.sh")) { + @copy("/usr/local/pkg/010.clamav-clamd.sh", + "/usr/local/etc/rc.d/010.clamav-clamd.sh"); + @chmod("/usr/local/etc/rc.d/010.clamav-clamd.sh", 0755); + } + if (! file_exists("/usr/local/etc/rc.d/020.clamav-freshclam.sh")) { + @copy("/usr/local/pkg/020.clamav-freshclam.sh", + "/usr/local/etc/rc.d/020.clamav-freshclam.sh"); + @chmod("/usr/local/etc/rc.d/020.clamav-freshclam.sh", 0755); + } + if (! file_exists("/usr/local/etc/rc.d/030.p3scan.sh")) { + @copy("/usr/local/pkg/030.p3scan.sh", + "/usr/local/etc/rc.d/030.p3scan.sh"); + @chmod("/usr/local/etc/rc.d/030.p3scan.sh", 0755); + } + + /* create conf files for those packages DSPAM depends on */ + if (! file_exists("/usr/local/etc/clamd.conf")) { + @copy("/usr/local/pkg/clamd.conf", + "/usr/local/etc/clamd.conf"); + } + if (! file_exists("/usr/local/etc/freshclam.conf")) { + @copy("/usr/local/pkg/freshclam.conf", + "/usr/local/etc/freshclam.conf"); + } + + if (! is_service_running("dspam")) { + $input_errors[] = "The DSPAM daemon process is not running. " . + "If you are certain that you did configure DSPAM " . + "appropriatly, you can start the corresponding process " . + "using the service control panel which is part of the " . + "»Status« menu item."; + } + if (! is_service_running("p3scan")) { + $input_errors[] = "The POP3 proxy process is not running. " . + "If you are certain that you did configure the POP3 proxy " . + "appropriatly, you can start the corresponding process " . + "using the service control panel which is part of the " . + "»Status« menu item."; + } + if (! is_service_running("clamd")) { + $input_errors[] = "The ClamAV daemon process is not running. " . + "If you are certain that you did configure DSPAM " . + "appropriatly, you can start the corresponding process " . + "using the service control panel which is part of the " . + "»Status« menu item (ClamAV does not need any configuration)."; + } + if (! is_service_running("freshclam")) { + $input_errors[] = "The freshclam daemon process is not running. " . + "If you are certain that you did configure DSPAM " . + "appropriatly, you can start the corresponding process " . + "using the service control panel which is part of the " . + "»Status« menu item (freshclam does not need any configuration)."; + } + if (! is_service_running("mysql")) { + $input_errors[] = "The MySQL daemon process is not running. " . + "If you are certain that you did configure DSPAM " . + "appropriatly, you can start the corresponding process " . + "using the service control panel which is part of the " . + "»Status« menu item (MySQL does not need any configuration)."; + } + + if (empty($config['installedpackages']['dspam']['config']) || + empty($config['installedpackages']['dspam']['config'][0]['storage-driver']) || + (file_exists('/usr/local/etc/dspam.conf') == false)) { + /* create default config files etc. */ + sync_package_dspam(); + + $input_errors[] = "It seems that you are using DSPAM for the very first time. " . + "Please run the DSPAM wizard from the »Services« menu " . + "if you would like to configure DSPAM right now. " . + "If you are not eligible to administer DSPAM you may contact " . + "your local DSPAM admin personal to solve this issue."; + } + + return $input_errors; +} + +function getJScriptFunction($whichOne = 0) { + $changeuser_msg = gettext("Do you realy want to change the current user?") . "\\n" . + gettext("This requires a logout followed by a login."); + + switch ($whichOne) { + case 0: + $scriptstr = ' + + /* applicable for almost any dspam related page */ + function changeuser() { + check = confirm("' . $changeuser_msg . '"); + + if (check == true) + window.location.href = "/index.php?logout=true"; + } + '; + + break; + case 1: + $scriptstr = ' + + /* applicable for dspam-quarantine.php */ + function checkallmsgs(enable) { + var endis = (document.iform.checkall.checked || enable); + var elem = document.iform.elements.length; + + for (i = 0; i < elem; i++) { + if (document.iform.elements[i].name.indexOf("chkmsg") >= 0) { + document.iform.elements[i].checked = endis; + } + } + } + '; + + break; + case 2: + $scriptstr = ' + + /* applicable for dspam-quarantine.php */ + function sortmsg(criterion) { + var baseURL = "/dspam-quarantine.php?page=" + document.iform.qpage.value; + var qperpage = document.getElementsByName("qperpage")[0].value; + + window.location.href = baseURL + "&qperpage=" + qperpage + "&sortby=" + criterion; + } + '; + + break; + case 3: + $scriptstr = ' + + /* applicable for dspam-quarantine.php */ + function processmsg(what) { + var elem = document.iform.elements.length; + var checked = false; + + switch (what) { + case 0: + for (i = 0; i < elem; i++) { + if (document.iform.elements[i].name.indexOf("chkmsg") >= 0 && + document.iform.elements[i].checked == true) { + checked = true; + break; + } + } + + if (checked) { + document.iform.processAction.value = "manyNotSpam"; + } else { + alert("You did not select any message that should be processed as not beeing Spam."); + return false; + } + break; + case 1: + for (i = 0; i < elem; i++) { + if (document.iform.elements[i].name.indexOf("chkmsg") >= 0 && + document.iform.elements[i].checked == true) { + checked = true; + break; + } + } + + if (checked) { + if (confirm("Are you sure you want to delete SELECTED messages in quarantine?") == false) { + return false; + } else { + document.iform.processAction.value = "manySpam"; + } + } else { + alert("You did not select any message that should be processed as beeing Spam."); + return false; + } + break; + case 2: + if (confirm("Are you sure you want to delete ALL messages in quarantine?") == false) { + return false; + } else { + document.iform.processAction.value = "deleteAll"; + } + break; + } + + document.iform.submit(); + } + '; + + break; + case 4: + $scriptstr = ' + + /* applicable for dspam-quarantine.php nad dspam-history.php */ + function changeQPerPage(originator) { + var elementName = ""; + var baseURL = ""; + + if (originator.name == "qperpage") { + baseURL = "/dspam-quarantine.php?page=" + document.iform.qpage.value; + elementName = "qperpage"; + } else { + baseURL = "/dspam-history.php?page=" + document.iform.hpage.value; + elementName = "hperpage"; + } + + for (var i = 0; i < 2; i++) { + document.getElementsByName(elementName)[i].value = originator.value; + } + + if (originator.name == "qperpage") + window.location.href = baseURL + "&qperpage=" + originator.value; + else + window.location.href = baseURL + "&hperpage=" + originator.value; + } + '; + + break; + case 5: + $scriptstr = ' + + /* applicable for dspam-settings.php */ + + function fadeTableRow(rowid, fadeType, opts){ + if(!opts){ + opts = {}; + } + + var row = $(rowid); + var cells= row.childNodes; + for(i=0;i "dspam.sh", + "start" => $start, + "stop" => $stop + ) + ); + conf_mount_ro(); + config_unlock(); + + if (! file_exists("/usr/local/etc/dspam.conf")) { + mwexec("ln -s /etc/dspam.conf /usr/local/etc/dspam.conf"); + } + + mwexec("/usr/local/etc/rc.d/dspam.sh stop"); + mwexec("/usr/local/etc/rc.d/dspam.sh start"); + + return 0; +} + +function dspam_configure() { + global $config, $g; + + $dspamcfg = $config['installedpackages']['dspam']['config'][0]; + + if ($g['booting']) + echo "Starting DSPAM service... "; + else + sleep(1); + + /* write dhcpd.conf */ + $fd = fopen("/usr/local/etc/dspam.conf", "w"); + if (!$fd) { + printf("Error: cannot open dhcpd.conf in services_dhcpd_configure().\n"); + return 1; + } + + $dspamconf = << 0) { + $dspamconf .= "Algorithm\t\t"; + + foreach ($t_algos as $algo) { + $dspamconf .= "{$algo['name']} "; + } + + $dspamconf .= "\n"; + } + + $dspamconf .= "PValue\t\t\t{$dspamcfg['pvalue']}\n"; + isset($dspamcfg['improbability-drive']) ? $dspamconf .= "ImprobabilityDrive\ton\n" : $dspamconf .= "ImprobabilityDrive\toff\n"; + + $t_prefs = &$dspamcfg['preference']; + + foreach ($t_prefs as $pref) { + $dspamconf .= "Preference\t\t{$pref['value']}\n"; + } + + $t_overr = &$dspamcfg['override']; + + foreach ($t_overr as $over) { + $dspamconf .= "AllowOverride\t\t{$over['value']}\n"; + } + + if (isset($dspamcfg['ldap-enable'])) { + $dspamconf .= << "") { + $dspamconf .= << "") { + $dspamconf .= "ClientPort\t\t{$dspamcfg['dspam-client-port']}\n"; + } + } + + $dspamconf .= "## EOF\n"; + + fwrite($fd, $dspamconf); + fclose($fd); + + /* fire up dspam --daemon */ + mwexec("/usr/local/etc/rc.d/dspam.sh stop"); + mwexec("/usr/local/etc/rc.d/dspam.sh start"); + + if ($g['booting']) { + print "done.\n"; + } + + return 0; +} + +function custom_php_install_command() { + global $config, $g; + /* create a default config */ + sync_package_dspam(); +} + +function custom_php_deinstall_command() { + global $config, $g; + conf_mount_rw(); + unlink_if_exists("/usr/local/etc/rc.d/dspam.sh"); + unlink_if_exists("/usr/local/etc/dspam.conf"); + unlink_if_exists("/usr/local/bin/dspam_spamfeed"); + unlink_if_exists("/usr/local/bin/dspam_innocentfeed"); + conf_mount_ro(); +} +?> \ No newline at end of file diff --git a/packages/dspam/pkg/dspam.xml b/packages/dspam/pkg/dspam.xml new file mode 100644 index 00000000..14b8751e --- /dev/null +++ b/packages/dspam/pkg/dspam.xml @@ -0,0 +1,146 @@ + + + dspam + 1.0 + Services: DSPAM: Main + /usr/local/pkg/dspam.inc + + + dspam +
Services
+ dspam.xml + /dspam-perf.php +
+ + DSPAM Legacy WebGUI + Original Perl-based GUI +
Services
+ /vhosts/dspam/dspam.cgi +
+ + dspam + /usr/local/etc/rc.d/dspam.sh + + + + Overview + /dspam.php + + + + Performance + /dspam-perf.php + + + Preferences + /dspam-prefs.php + + + Alerts + /pkg.php?xml=dspam_alerts.xml + + + Quarantine + /dspam-quarantine.php + + + Analysis + /dspam-analysis.php + + + History + /dspam-history.php + + + + ['installedpackages']['dspam']['config'] + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-perf.php + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-admin.php + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-admin-prefs.php + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-admin-stats.php + + + /usr/local/pkg/ + 0755 + http://www.abyssworld.de/packages/config/dspam_settings.xml + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-settings.php + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/verdana.ttf + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-prefs.php + + + /usr/local/pkg/ + 0755 + http://www.abyssworld.de/packages/config/dspam_alerts.xml + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-quarantine.php + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-analysis.php + + + /usr/local/www/ + 0755 + http://www.abyssworld.de/packages/config/dspam-history.php + + + /usr/local/pkg/ + 0755 + http://www.abyssworld.de/packages/config/dspam.inc + + + /usr/local/www/wizards/ + 0755 + http://www.abyssworld.de/packages/config/dspam_wizard.xml + + + + + sync_package_dspam(); + + + custom_php_install_command(); + + + custom_php_deinstall_command(); + +
diff --git a/packages/dspam/pkg/dspam_alerts.xml b/packages/dspam/pkg/dspam_alerts.xml new file mode 100644 index 00000000..182780cf --- /dev/null +++ b/packages/dspam/pkg/dspam_alerts.xml @@ -0,0 +1,102 @@ + + + + dspamalerts + 1.0 + Services: DSPAM: Alerts + /usr/local/pkg/dspam.inc + + + + Performance + /dspam-perf.php + + + Preferences + /dspam-prefs.php + + + Alerts + /pkg.php?xml=dspam_alerts.xml + + + + Quarantine + /dspam-quarantine.php + + + Analysis + /dspam-analysis.php + + + History + /dspam-history.php + + + Train Filter + /dspam-train.php + + + Admin Suite + /dspam-admin.php + + + + ['installedpackages']['dspam']['config']['alerts'] + + + Alert Name + alertname + + + Description + description + + + + + + Alert Name + alertname + Name of an alert that should be raised + input + 30 + + + + Description + description + You may enter a description here for your reference (not parsed). + input + 30 + + + + + dspam_configure(); + + + dspam_configure(); + + \ No newline at end of file diff --git a/packages/dspam/pkg/freshclam.conf b/packages/dspam/pkg/freshclam.conf new file mode 100644 index 00000000..173d97bf --- /dev/null +++ b/packages/dspam/pkg/freshclam.conf @@ -0,0 +1,110 @@ +## +## Example config file for freshclam +## Please read the freshclam.conf(5) manual before editing this file. +## This file may be optionally merged with clamd.conf. +## + + +# Comment or remove the line below. +#Example + +# Path to the database directory. +# WARNING: It must match clamd.conf's directive! +# Default: hardcoded (depends on installation options) +#DatabaseDirectory /var/lib/clamav +DatabaseDirectory /var/db/clamav + +# Path to the log file (make sure it has proper permissions) +# Default: disabled +#UpdateLogFile /var/log/freshclam.log +UpdateLogFile /var/log/clamav/freshclam.log + +# Enable verbose logging. +# Default: no +#LogVerbose yes + +# Use system logger (can work together with UpdateLogFile). +# Default: no +#LogSyslog yes + +# Specify the type of syslog messages - please refer to 'man syslog' +# for facility names. +# Default: LOG_LOCAL6 +#LogFacility LOG_MAIL + +# This option allows you to save the process identifier of the daemyes +# Default: disabled +#PidFile /var/run/freshclam.pid +PidFile /var/run/clamav/freshclam.pid + +# By default when started freshclam drops privileges and switches to the +# "clamav" user. This directive allows you to change the database owner. +# Default: clamav (may depend on installation options) +DatabaseOwner clamav + +# Initialize supplementary group access (freshclam must be started by root). +# Default: no +AllowSupplementaryGroups yes + +# Use DNS to verify virus database version. Freshclam uses DNS TXT records +# to verify database and software versions. With this directive you can change +# the database verification domain. +# WARNING: Do not touch it unless you're configuring freshclam to use your +# own database verification domain. +# Default: current.cvd.clamav.net +#DNSDatabaseInfo current.cvd.clamav.net + +# Uncomment the following line and replace XY with your country +# code. See http://www.iana.org/cctld/cctld-whois.htm for the full list. +#DatabaseMirror db.XY.clamav.net + +# database.clamav.net is a round-robin record which points to our most +# reliable mirrors. It's used as a fall back in case db.XY.clamav.net is +# not working. DO NOT TOUCH the following line unless you know what you +# are doing. +DatabaseMirror database.clamav.net + +# How many attempts to make before giving up. +# Default: 3 (per mirror) +#MaxAttempts 5 + +# Number of database checks per day. +# Default: 12 (every two hours) +#Checks 24 + +# Proxy settings +# Default: disabled +#HTTPProxyServer myproxy.com +#HTTPProxyPort 1234 +#HTTPProxyUsername myusername +#HTTPProxyPassword mypass + +# Use aaa.bbb.ccc.ddd as client address for downloading databases. Useful for +# multi-homed systems. +# Default: Use OS'es default outgoing IP address. +#LocalIPAddress aaa.bbb.ccc.ddd + +# Send the RELOAD command to clamd. +# Default: no +NotifyClamd /usr/local/etc/clamd.conf + +# Run command after successful database update. +# Default: disabled +#OnUpdateExecute command + +# Run command when database update process fails. +# Default: disabled +#OnErrorExecute command + +# Run command when freshclam reports outdated version. +# In the command string %v will be replaced by the new version number. +# Default: disabled +#OnOutdatedExecute command + +# Don't fork into background. +# Default: no +#Foreground yes + +# Enable debug messages in libclamav. +# Default: no +#Debug yes diff --git a/packages/dspam/pkg/p3scan-pf-emer.xml b/packages/dspam/pkg/p3scan-pf-emer.xml new file mode 100644 index 00000000..1f367409 --- /dev/null +++ b/packages/dspam/pkg/p3scan-pf-emer.xml @@ -0,0 +1,82 @@ + + + + p3scanpfemer + 1.0 + Services: POP3 Proxy: Emergency Contact + /usr/local/pkg/p3scan.inc + + + Daemon Settings + /pkg_edit.php?xml=p3scan-pf.xml&id=0 + + + Message Processing + /pkg_edit.php?xml=p3scan-pf-msg.xml&id=0 + + + Emergency Contact + /pkg.php?xml=p3scan-pf-emer.xml + + + + Virus Scanner Settings + /pkg_edit.php?xml=p3scan-pf-vir.xml&id=0 + + + SPAM Settings + /pkg_edit.php?xml=p3scan-pf-spam.xml&id=0 + + + + ['installedpackages']['p3scanpf']['config']['contacts'] + + + + Email Address + emailaddress + + + Description + description + + + + + + Email Address + emailaddress + + In the event p3scan encounters a catastrophic problem and has to terminate, + it will send an email to these email addresses just before setting up to + close down on the next iteration of a child process. + + input + + + Description + description + Description. + input + + + + + sync_package_p3scan(); + + + sync_package_p3scan(); + + diff --git a/packages/dspam/pkg/p3scan-pf-msg.xml b/packages/dspam/pkg/p3scan-pf-msg.xml new file mode 100644 index 00000000..fe8af442 --- /dev/null +++ b/packages/dspam/pkg/p3scan-pf-msg.xml @@ -0,0 +1,153 @@ + + + + p3scanpfmsg + 1.0 + Services: POP3 Proxy: Message Processing + + This <acronym title="Hypertext Markup Language">HTML</acronym> page uses default values, hence even if each field is + set, you are still required to save this page if you are editing this page + for the very first time! + + /usr/local/pkg/p3scan.inc + pkg_edit.php?xml=p3scan-pf-msg.xml&id=0 + + + Daemon Settings + /pkg_edit.php?xml=p3scan-pf.xml&id=0 + + + Message Processing + /pkg_edit.php?xml=p3scan-pf-msg.xml&id=0 + + + + Emergency Contact + /pkg.php?xml=p3scan-pf-emer.xml + + + Virus Scanner Settings + /pkg_edit.php?xml=p3scan-pf-vir.xml&id=0 + + + SPAM Settings + /pkg_edit.php?xml=p3scan-pf-spam.xml&id=0 + + + + ['installedpackages']['p3scanpf']['config']['messaging'] + + + + Just Delete + justdelete + + Instead of keeping an infected message in the Virus Directory, delete it + after reporting it to the user. + + checkbox + true + + + Bytes Free + bytesfree + The number of KB's there must be free before processing any mail. + input + 10000 + + + + Broken Email Clients + brokenec + + Some email clients may require special processing. + + checkbox + true + + + ISP Spam + ispspam + + This option allows you to set the string your <acronym title="Internet Service Provider">ISP</acronym> uses if it processes + your email for SPAM. Leave this field blank if you are not going to use + this option. + + input + -- Spam -- + + + Subject + subject + + This option can be used to change the default subject line when + reporting a virus infected message. + + input + 60 + Subject: "[Virus] found in a mail to you:" <virus name> + + + + Notify + notify + + This option can be used to change the default file deleted notification + that is displayed in the virus notification message when the + "justdelete" option is used. + + input + 60 + Per instruction, the message has been deleted. + + + + SMTP Reject + smtpreject + + This option can be used to change the default lt;acronym title="Simple Mail Transfer Protocol">SMTP</acronym> Reject message that + is sent to the client in the event a message is rejected due to a virus. + The error message will have a prefix of "554". + + input + 60 + Virus detected! P3scan rejected message! + + + + Check SMTP size + checksize + + This option can be used to set the maximum message size (in KBytes) + that p3scan will use to determine if it should scan an smtp submission. + Leave this field blank if you are not going to use this option. + + input + 1024 + + + Footer + footer + + This option is used to add the virus definition info from your scanner + to an SMTP message. Leave this field blank if you are not going to use + this option. + + input + 40 + /usr/local/bin/clamdscan -V + + + + + sync_package_p3scan(); + + diff --git a/packages/dspam/pkg/p3scan-pf-spam.xml b/packages/dspam/pkg/p3scan-pf-spam.xml new file mode 100644 index 00000000..f6d77256 --- /dev/null +++ b/packages/dspam/pkg/p3scan-pf-spam.xml @@ -0,0 +1,74 @@ + + + + p3scanpfspam + 1.0 + Services: POP3 Proxy: SPAM Settings + + This <acronym title="Hypertext Markup Language">HTML</acronym> page uses default values, hence even if each field is + set, you are still required to save this page if you are editing this page + for the very first time! + + /usr/local/pkg/p3scan.inc + pkg_edit.php?xml=p3scan-pf-spam.xml&id=0 + + + Daemon Settings + /pkg_edit.php?xml=p3scan-pf.xml&id=0 + + + Message Processing + pkg_edit.php?xml=p3scan-pf-msg.xml&id=0 + + + Emergency Contact + /pkg.php?xml=p3scan-pf-emer.xml + + + Virus Scanner Settings + /pkg_edit.php?xml=p3scan-pf-vir.xml&id=0 + + + SPAM Settings + /pkg_edit.php?xml=p3scan-pf-spam.xml&id=0 + + + + + ['installedpackages']['p3scanpf']['config']['spam'] + + + + Enable Spam Checking + checkspam + + If set, will scan for Spam before scanning for a virus. + + checkbox + true + spamcheck + + + SPAM Executable Command + spamcheck + The command (plus arguments) that should be invoked to check for SPAM messages. + input + 70 + + /usr/local/bin/dspam --user dspamuser --mode=teft --stdout --deliver=innocent,spam --feature=ch,no,wh + + + + + + sync_package_p3scan(); + + diff --git a/packages/dspam/pkg/p3scan-pf-vir.xml b/packages/dspam/pkg/p3scan-pf-vir.xml new file mode 100644 index 00000000..ecaae872 --- /dev/null +++ b/packages/dspam/pkg/p3scan-pf-vir.xml @@ -0,0 +1,117 @@ + + + + p3scanpfvir + 1.0 + Services: POP3 Proxy: Virus Scanner Settings + + This <acronym title="Hypertext Markup Language">HTML</acronym> page uses default values, hence even if each field is + set, you are still required to save this page if you are editing this page + for the very first time! + + /usr/local/pkg/p3scan.inc + pkg_edit.php?xml=p3scan-pf-vir.xml&id=0 + + + Daemon Settings + /pkg_edit.php?xml=p3scan-pf.xml&id=0 + + + Message Processing + /pkg_edit.php?xml=p3scan-pf-msg.xml&id=0 + + + Emergency Contact + /pkg.php?xml=p3scan-pf-emer.xml + + + Virus Scanner Settings + /pkg_edit.php?xml=p3scan-pf-vir.xml&id=0 + + + + SPAM Settings + /pkg_edit.php?xml=p3scan-pf-spam.xml&id=0 + + + + ['installedpackages']['p3scanpf']['config']['virus'] + + + + Scanner Type + scannertype + Select here which type of scanner you want to use. + select + clamd + 1 + + + + + + + + + + + Virusscanner + scanner + Depends on scannertype. + input + 127.0.0.1:3310 + + + + Scanner Returncode + viruscode + + Specify the returncode(s) which the scanner returns when + the mail is infected. + + input + 1 + + + Good Scanner return codes + goodcode + + Some scanners can report more than good or infected. Place valid return + codes here that will enable the message to be delivered without a warning. + + input + + + Regular Expression for Virusname + virusregexp + + Specify here a regular expression which describes where the name of + the virus can be found. + + input + .*: (.*) FOUND + + + deMIME Setting + demime + + Tick this if we should parse all lt;acronym title="Multipurpose Internet Mail Extensions">MIME</acronym>-sections instead of passing the + message as-is to the scanner. + + checkbox + true + + + + + sync_package_p3scan(); + + diff --git a/packages/dspam/pkg/p3scan-pf.xml b/packages/dspam/pkg/p3scan-pf.xml new file mode 100644 index 00000000..9b99668a --- /dev/null +++ b/packages/dspam/pkg/p3scan-pf.xml @@ -0,0 +1,166 @@ + + + p3scanpf + 1.0 + Services: POP3 Proxy: Main + + This <acronym title="Hypertext Markup Language">HTML</acronym> page uses default values, hence even if each field is + set, you are still required to save this page if you are editing this page + for the very first time! + + /usr/local/pkg/p3scan.inc + pkg_edit.php?xml=p3scan-pf.xml&id=0 + + + p3scan +
Services
+ p3scan.xml + A transparent POP3-Proxy with virus-scanning capabilities +
+ + p3scan-pf + /usr/local/etc/rc.d/030.p3scan.sh + + + + Daemon Settings + /pkg_edit.php?xml=p3scan-pf.xml&id=0 + + + + Message Processing + /pkg_edit.php?xml=p3scan-pf-msg.xml&id=0 + + + Emergency Contact + /pkg.php?xml=p3scan-pf-emer.xml + + + Virus Scanner Settings + /pkg_edit.php?xml=p3scan-pf-vir.xml&id=0 + + + SPAM Settings + /pkg_edit.php?xml=p3scan-pf-spam.xml&id=0 + + + + ['installedpackages']['p3scanpf']['config'] + + /usr/local/pkg/ + 0755 + http://www.pfsense.com/packages/config/p3scan-pf-msg.xml + + + /usr/local/pkg/ + 0755 + http://www.pfsense.com/packages/config/p3scan-pf-emer.xml + + + /usr/local/pkg/ + 0755 + http://www.pfsense.com/packages/config/p3scan-pf-vir.xml + + + /usr/local/pkg/ + 0755 + http://www.pfsense.com/packages/config/p3scan-pf-spam.xml + + + /usr/local/www/ + 0755 + http://www.pfsense.com/packages/config/p3scan_rules.php + + + /usr/local/pkg/ + 0755 + http://www.pfsense.com/packages/config/p3scan.inc + + + + + Max Child's + maxchilds + The maximum number of connections we will handle at once. + input + 10 + + + IP Address + ipaddr + The <acronym title="Internet Protocol">IP</acronym> Address we listen on. + input + 0.0.0.0 + + + + Port + port + The <acronym title="Transmission Control Protocol">TCP</acronym> port on we should listen. + input + 8110 + + + + SSL Port + sslport + The TCP <acronym title="Secure Sockets Layer">SSL</acronym> port on we should listen. + input + 995 + + + + Target IP + targetip + Target IP is the IP to connect (0.0.0.0 enables transparent mode). + input + 0.0.0.0 + + + + Target Port + targetport + Target Port is the port to connect. + 8110 + input + + + + Email Port + emailport + The port we should listen on to scan outgoing email messages. + input + 25 + + + + Daemon User + daemonuser + The username the daemon should run as. + input + root + + + + + + sync_package_p3scan(); + + + sync_package_p3scan(); + + + custom_php_install_command(); + + + custom_php_deinstall_command(); + +
diff --git a/packages/dspam/pkg/p3scan.inc b/packages/dspam/pkg/p3scan.inc new file mode 100644 index 00000000..7d675050 --- /dev/null +++ b/packages/dspam/pkg/p3scan.inc @@ -0,0 +1,277 @@ + "") + fwrite($fd, "maxchilds = {$cfg['maxchilds']}\n"); + else + fwrite($fd, "maxchilds = 10\n"); + if (isset($cfg['ipaddr']) && $cfg['ipaddr'] <> "") + fwrite($fd, "ip = {$cfg['ipaddr']}\n"); + else + fwrite($fd, "ip = 0.0.0.0\n"); + /* TODO: Even if the port is configurable, it is + hardcoded in p3scan.c. This needs to be + changed for the sake of flexebility. + */ + if (isset($cfg['port']) && $cfg['port'] <> "") + fwrite($fd, "port = {$cfg['port']}\n"); + else + fwrite($fd, "port = 8110\n"); + if (isset($cfg['sslport']) && $cfg['sslport'] <> "") + fwrite($fd, "sslport = {$cfg['sslport']}\n"); + else + fwrite($fd, "sslport = 995\n"); + if (isset($cfg['targetip']) && $cfg['targetip'] <> "") + fwrite($fd, "targetip = {$cfg['targetip']}\n"); + else + fwrite($fd, "targetip = 0.0.0.0\n"); + if (isset($cfg['targetport']) && $cfg['targetport'] <> "") + fwrite($fd, "targetport = {$cfg['targetport']}\n"); + else + fwrite($fd, "targetport = 8110\n"); + if (isset($cfg['emailport']) && $cfg['emailport'] <> "") + fwrite($fd, "emailport = {$cfg['emailport']}\n"); + else + fwrite($fd, "emailport = 25\n"); + if (isset($cfg['daemonuser']) && $cfg['daemonuser'] <> "") + fwrite($fd, "user = {$cfg['daemonuser']}\n"); + else + fwrite($fd, "user = root\n"); + fwrite($fd, "notifydir = /var/spool/p3scan/notify\n"); + fwrite($fd, "virusdir = /var/spool/p3scan\n"); + fwrite($fd, "template = /usr/local/etc/p3scan/p3scan.mail\n"); + + /* ================================================================ */ + /* == Tab: Message Processing == */ + /* ================================================================ */ + fwrite($fd, "## Message Processing Settings.\n"); + if (isset($cfgmsg['justdelete']) && $cfgmsg['justdelete'] <> "") + fwrite($fd, "justdelete\n"); + if (isset($cfgmsg['bytesfree']) && $cfgmsg['bytesfree'] <> "") + fwrite($fd, "bytesfree = {$cfgmsg['bytesfree']}\n"); + else + fwrite($fd, "bytesfree = 10000\n"); + if (isset($cfgmsg['broken']) && $cfgmsg['broken'] <> "") + fwrite($fd, "broken\n"); + if (isset($cfgmsg['timeout']) && $cfgmsg['timeout'] <> "") + fwrite($fd, "timeout = {$cfgmsg['timeout']}\n"); + else + fwrite($fd, "timeout = 30\n"); + if (isset($cfgmsg['ispspam']) && $cfgmsg['ispspam'] <> "") + fwrite($fd, "ispspam = {$cfg['ispspam']}\n"); + if (file_exists("/usr/local/bin/renattach")) + fwrite($fd, "renattach = /usr/local/bin/renattach\n"); + if (isset($cfgmsg['subject']) && $cfgmsg['subject'] <> "") + fwrite($fd, "subject = {$cfgmsg['subject']}\n"); + else + fwrite($fd, "subject = Subject: \"[Virus] found in a mail to you:\" \n"); + if (isset($cfgmsg['notify']) && $cfgmsg['notify'] <> "") + fwrite($fd, "notify = {$cfgmsg['notify']}\n"); + else + fwrite($fd, "notify = Per instruction, the message has been deleted.\n"); + if (isset($cfgmsg['smtpreject']) && $cfgmsg['smtpreject'] <> "") + fwrite($fd, "smtprset = {$cfgmsg['smtpreject']}\n"); + else + fwrite($fd, "smtprset = Virus detected! P3scan rejected message!\n"); + if (isset($cfgmsg['checksize']) && $cfgmsg['checksize'] <> "") + fwrite($fd, "checksize = {$cfgmsg['checksize']}\n"); + if (isset($cfgmsg['footer']) && $cfgmsg['footer'] <> "") + fwrite($fd, "footer = {$cfgmsg['footer']}\n"); + + /* ================================================================ */ + /* == Tab: Emergency Contact == */ + /* ================================================================ */ + fwrite($fd, "## Emergency Contacts.\n"); + if (is_array($cfgemer)) { + foreach ($cfgemer as $addr) { + $contact .= "{$addr['emailaddress']} "; + } + if (isset($contact) && $contact <> "") + fwrite($fd, "emergcon = {$contact}\n"); + } + + /* ================================================================ */ + /* == Tab: Virus Scanner Settings == */ + /* ================================================================ */ + fwrite($fd, "## Virus Scanner Settings.\n"); + if (isset($cfgvir['scannertype']) && $cfgvir['scannertype'] <> "") + fwrite($fd, "scannertype = {$cfgvir['scannertype']}\n"); + else + fwrite($fd, "scannertype = clamd\n"); + if (isset($cfgvir['scanner']) && $cfgvir['scanner'] <> "") + fwrite($fd, "scanner = {$cfgvir['scanner']}\n"); + else + fwrite($fd, "scanner = 127.0.0.1:3310\n"); + if (isset($cfgvir['viruscode']) && $cfgvir['viruscode'] <> "") + fwrite($fd, "viruscode = {$cfgvir['viruscode']}\n"); + else + fwrite($fd, "viruscode = 1\n"); + if (isset($cfgvir['goodcode']) && $cfgvir['goodcode'] <> "") + fwrite($fd, "goodcode = {$cfgvir['goodcode']}\n"); + if (isset($cfgvir['virusregexp']) && $cfgvir['virusregexp'] <> "") + fwrite($fd, "virusregexp = {$cfgvir['virusregexp']}\n"); + if (isset($cfgvir['demime']) && $cfgvir['demime'] <> "") + fwrite($fd, "demime\n"); + + /* ================================================================ */ + /* == Tab: SPAM Settings == */ + /* ================================================================ */ + if (isset($cfgspam['checkspam']) && $cfgpam['checkspam'] <> "") { + fwrite($fd, "## SPAM Settings.\n"); + fwrite($fd, "checkspam\n"); + if (isset($cfgvir['spamcheck']) && $cfgvir['spamcheck'] <> "") + fwrite($fd, "spamcheck = {$cfgspam['spamcheck']}\n"); + else + fwrite($fd, "spamcheck = /usr/local/bin/dspam --user dspamuser --mode=teft --stdout --deliver=innocent,spam --feature=ch,no,wh\n"); + } + + fclose($fd); + + /* NOTE: The following code requires the p3scan.inc file to be saved with + UNIX Linefeeds. LF that is and NOT CR LF. + */ + $start = << "030.p3scan.sh", + "start" => $start, + "stop" => $stop + ) + ); + + conf_mount_ro(); + config_unlock(); + + if (! file_exists("/usr/local/etc/p3scan")) { + mkdir("/usr/local/etc/p3scan"); + } + if (! file_exists("/usr/local/etc/p3scan/p3scan.conf")) { + mwexec("ln -s /etc/p3scan.conf /usr/local/etc/p3scan/p3scan.conf"); + } + if (! file_exists("/usr/local/etc/p3scan/p3scan.mail")) { + $fd = fopen("/usr/local/etc/p3scan/p3scan.mail","w"); + + $p3scanmail = << + +EOD; + + fwrite($fd, $p3scanmail); + fclose($fd); + } + + mwexec("/usr/local/etc/rc.d/030.p3scan.sh stop"); + mwexec("/usr/local/etc/rc.d/030.p3scan.sh start"); + + return 0; +} + +function custom_php_install_command() { + global $config, $g; + sync_package_p3scan(); +} + +function custom_php_deinstall_command() { + global $config, $g; + conf_mount_rw(); + unlink_if_exists("/usr/local/pkg/pf/p3scan_rules.php"); + unlink_if_exists("/usr/local/www/p3scan_rules.php"); + unlink_if_exists("/usr/local/etc/p3scan/p3scan.conf"); + unlink_if_exists("/usr/local/etc/p3scan/p3scan.mail"); + unlink_if_exists("/usr/local/etc/rc.d/030.p3scan.sh"); + rmdir("/usr/local/etc/p3scan"); + conf_mount_ro(); +} +?> \ No newline at end of file diff --git a/packages/dspam/pkg/verdana.ttf b/packages/dspam/pkg/verdana.ttf new file mode 100644 index 00000000..754a9b7b Binary files /dev/null and b/packages/dspam/pkg/verdana.ttf differ diff --git a/packages/dspam/www/dspam-admin-graph.php b/packages/dspam/www/dspam-admin-graph.php new file mode 100644 index 00000000..508824e2 --- /dev/null +++ b/packages/dspam/www/dspam-admin-graph.php @@ -0,0 +1,201 @@ + 725, + 'height' => 450, + 'antialias' => 'native')); + +// create the graph +$Graph =& Image_Graph::factory('graph', $Canvas); +// add a TrueType font +$Font =& $Graph->addNew('font', 'Verdana'); +// set the font size to 8 pixels +$Font->setSize(8); + +$Graph->setFont($Font); + +// setup the plotarea, legend and their layout +$Graph->add( + Image_Graph::vertical( + Image_Graph::factory('title', array('', 12)), + Image_Graph::horizontal( + $Plotarea = Image_Graph::factory('plotarea'), + $Legend = Image_Graph::factory('legend'), + 80 + ), + 0 + ) +); + +// add grids +$Grid =& $Plotarea->addNew('line_grid', IMAGE_GRAPH_AXIS_Y); +$Grid->setLineColor('silver'); + +// link the legend with the plotares +$Legend->setPlotarea($Plotarea); + +// create the two datasets +$i = 0; +$spamds =& Image_Graph::factory('dataset'); +foreach($spam as $el){ + $spamds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +$i = 0; +$hamds =& Image_Graph::factory('dataset'); +foreach($nonspam as $el){ + $hamds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +$i = 0; +$smds =& Image_Graph::factory('dataset'); +foreach($sm as $el){ + $smds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +$i = 0; +$fpds =& Image_Graph::factory('dataset'); +foreach($fp as $el){ + $fpds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +$i = 0; +$inocds =& Image_Graph::factory('dataset'); +foreach($inoc as $el){ + $inocds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +$i = 0; +$whds =& Image_Graph::factory('dataset'); +foreach($wh as $el){ + $whds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +// set the name/title of each dataset +$spamds->setName('SPAM'); +$hamds->setName('Nonspam'); +$smds->setName('Spam Misses'); +$fpds->setName('False Positives'); +$inocds->setName('Inoculations'); +$whds->setName('Auto-Whitelisted'); + +// put each dataset in a singel ds array +$Datasets = array($inocds, $whds, $spamds, $hamds, $smds, $fpds); + +// create the plot as line chart using the dataset +$Plot =& $Plotarea->addNew('Image_Graph_Plot_Bar', array($Datasets,'stacked')); + +// set a fill color +$FillArray =& Image_Graph::factory('Image_Graph_Fill_Array'); +$FillArray->addColor('#000000'); +$FillArray->addColor('#BF00BF'); +$FillArray->addColor('#BF0000'); +$FillArray->addColor('#00BF00'); +$FillArray->addColor('#BFBF00'); +$FillArray->addColor('#FF7F00'); + +// set a standard fill style +$Plot->setFillStyle($FillArray); + +/* set axis labels */ +$XAxis =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X); +$XAxis->setTitle("{$FORM['x_label']}", array('size' => 8, 'angle' => 0)); +$XAxis->setFontAngle(60); +$XAxis->setLabelOptions(array('offset' => intval($FORM['offset']), + 'showtext' => true, + 'position' => 'outside'), 1); + + +$YAxis =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); +$YAxis->setTitle('Number of Messages', array('size' => 8, 'angle' => 90)); + +// create a Y data value marker +$Marker =& $Plot->addNew('Image_Graph_Marker_Value', IMAGE_GRAPH_VALUE_Y); +$Marker->setFontSize(6); + +// and use the marker on the 1st plot +$Plot->setMarker($Marker); +$Plot->setDataSelector(Image_Graph::factory('Image_Graph_DataSelector_NoZeros')); + +// output the Graph +$Graph->done(); + +function &ReadParse($URI = "") { + if ($URI == "") { + return NULL; + } + + $pairs = preg_split('/&/', $URI); + $FORM = array(); + + foreach($pairs as $pair){ + list($name, $value) = preg_split('/\=/', $pair); + $pattern = '/%([a-fA-F0-9][a-fA-F0-9])/'; + + $name = preg_replace('/\+/', ' ', $name); + $name = preg_replace_callback( + $pattern, + create_function( + '$matches', + 'return pack("C", hexdec($matches[1]));' + ), + $name + ); + + $value = preg_replace('/\+/', ' ', $value); + $value = preg_replace_callback( + $pattern, + create_function( + '$matches', + 'return pack("C", hexdec($matches[1]));' + ), + $value + ); + + $FORM[$name] = $value; + } // end foreach + + return $FORM; +} +?> diff --git a/packages/dspam/www/dspam-admin-prefs.php b/packages/dspam/www/dspam-admin-prefs.php new file mode 100644 index 00000000..324d961f --- /dev/null +++ b/packages/dspam/www/dspam-admin-prefs.php @@ -0,0 +1,249 @@ + + + +EOD; + + $pfSenseHead->addScript($jscriptstr); + echo $pfSenseHead->getHTML(); + +?> + + + +
+ + +

+ + This page lets you configure how the filter will handle your messages. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ Training – Configure how the filter learns as it processes messages +
+

DSPAM should train:

+ value="TEFT" type="radio" class="formfld" title="On every new message scanned by the filter" alt="On every new message scanned by the filter" name="rad_train" id="rad_train_one" /> + +
+ value="TOE" type="radio" class="formfld" title="Only when the filter makes a mistake" alt="Only when the filter makes a mistake" name="rad_train" id="rad_train_two" /> + +
+ value="TUM" type="radio" class="formfld" title=";Only with new data or if the filter makes a mistake" alt=";Only with new data or if the filter makes a mistake" name="rad_train" id="rad_train_three" /> + +
+

When I train DSPAM, I prefer:

+ value="message" type="radio" class="formfld" title="To forward my spams (signature appears in message body)" alt="To forward my spams (signature appears in message body)" name="rad_train_action" id="rad_train_action_one" /> + +
+ value="headers" type="radio" class="formfld" title="To bounce my spams (signature appears in message headers)" alt="To bounce my spams (signature appears in message headers)" name="rad_train_action" id="rad_train_action_two" /> + +
+

+ Filter sensitivity during the training period: +

+

+ + + Catch SPAM (More in Quarantine)  + /> + /> + /> + /> + /> + » + /> + « + /> + /> + /> + /> + /> +  Assume Good (Fewer in Quarantine) + + +

+
 
+ Message Handling – Configure how SPAM is handled +
+

When a SPAM message is identified:

+

+ type="radio" class="formfld" title="Quarantine the message" alt="Quarantine the message" name="rad_ident_action" id="rad_ident_action_one" /> + +
+ type="radio" class="formfld" title="Tag the Subject header with" alt="Tag the Subject header with" name="rad_ident_action" id="rad_ident_action_two" /> + + " name="msgtag" /> +
+ type="radio" class="formfld" title="Deliver the message normally with a X-DSPAM-Result header" alt="Deliver the message normally with a X-DSPAM-Result header" name="rad_ident_action" id="rad_ident_action_three" /> + +

+
 
+ Features – Tuning SPAM filtering +
+

+ type="checkbox" class="formbtn" title="Enable noise reduction, which usually improves filtering accuracy" alt="Enable noise reduction, which usually improves filtering accuracy" name="chk_feature_nr" id="chk_feature_nr" /> + +
+ type="checkbox" class="formbtn" title="Enable automatic whitelisting to record frequent correspondence" alt="Enable automatic whitelisting to record frequent correspondence" name="chk_feature_aw" id="chk_feature_aw" /> + +
+ type="checkbox" class="formbtn" title="Add the factoring tokens in each email into the message's full headers" alt="Add the factoring tokens in each email into the message's full headers" name="chk_feature_at" id="chk_feature_at" /> + + +

+
 
  + " /> +
+
+
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-admin-stats.php b/packages/dspam/www/dspam-admin-stats.php new file mode 100644 index 00000000..82b91831 --- /dev/null +++ b/packages/dspam/www/dspam-admin-stats.php @@ -0,0 +1,123 @@ +getHTML(); + +?> + + + +
+ + +

+ + The following table shows the number of messages processed for each user + along with their current preference settings. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + +
 
NameQ.SizeTPTNFPFNSCICModeOn SpamBNRWhitelistSedSig Loc
+
+
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-admin.php b/packages/dspam/www/dspam-admin.php new file mode 100644 index 00000000..45b33b55 --- /dev/null +++ b/packages/dspam/www/dspam-admin.php @@ -0,0 +1,207 @@ +getHTML(); + +?> + + + +
+ + +

+ + The following graphs and tables summarize the processing done by the filter. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + +
 
+ Overview +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MessagesTodayThis Hour StatusCurrent Value
Spam Average message processing time sec.
Good Average throughput messages/sec.
Spam Misses DSPAM instances process(es)
False Positives System uptime
Inoculations Mail queue length messages
Total   
+
 
+ 24 Hour Activity – 125 SPAM, 601 Good, 2 Spam Misses, 0 False Positives, 2 Inoculations +
+ + 24 Hour Activity + + &offset=20" alt="24 Hour Activity" border="0" /> + +
 
+ Daily Activity – 2457 SPAM, 10772 Good, 35 Spam Misses, 0 False Positives, 33 Inoculations +
+ + + + + +
+
+
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-analysis-graph.php b/packages/dspam/www/dspam-analysis-graph.php new file mode 100644 index 00000000..67262564 --- /dev/null +++ b/packages/dspam/www/dspam-analysis-graph.php @@ -0,0 +1,137 @@ +addNew('font', 'Verdana'); +// set the font size to 11 pixels +$Font->setSize(8); + +$Graph->setFont($Font); + +// setup the plotarea, legend and their layout +$Graph->add( + Image_Graph::vertical( + Image_Graph::factory('title', array('', 12)), + Image_Graph::vertical( + $Plotarea = Image_Graph::factory('plotarea'), + $Legend = Image_Graph::factory('legend'), + 88 + ), + 5 + ) +); + +// link the legend with the plotares +$Legend->setPlotarea($Plotarea); + +// create the two datasets +$i = 0; +$spamds =& Image_Graph::factory('dataset'); +foreach($spam_day as $el){ + $spamds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +$i = 0; +$hamds =& Image_Graph::factory('dataset'); +foreach($nonspam_day as $el){ + $hamds->addPoint(strval($period[$i]), intval($el)); + $i++; +} + +// set the name/title of each dataset +$spamds->setName('SPAM'); +$hamds->setName('Good'); + +// put each dataset in a singel ds array +$Datasets = array($spamds, $hamds); + +// create the plot as line chart using the dataset +$Plot =& $Plotarea->addNew('Image_Graph_Plot_Line', array($Datasets,'normal')); + +// set a line color +$LineArray =& Image_Graph::factory('Image_Graph_Line_Array'); +$LineArray->addColor('red'); +$LineArray->addColor('green'); + +// set a standard line style +$Plot->setLineStyle($LineArray); + +/* set axis labels */ +$XAxis =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_X); +$XAxis->setTitle("{$FORM['x_label']}"); +$YAxis =& $Plotarea->getAxis(IMAGE_GRAPH_AXIS_Y); +$YAxis->setTitle('Number of Messages', 'vertical'); + +// output the Graph +$Graph->done(); + +function &ReadParse($URI = "") { + if ($URI == "") { + return NULL; + } + + $pairs = preg_split('/&/', $URI); + $FORM = array(); + + foreach($pairs as $pair){ + list($name, $value) = preg_split('/\=/', $pair); + $pattern = '/%([a-fA-F0-9][a-fA-F0-9])/'; + + $name = preg_replace('/\+/', ' ', $name); + $name = preg_replace_callback( + $pattern, + create_function( + '$matches', + 'return pack("C", hexdec($matches[1]));' + ), + $name + ); + + $value = preg_replace('/\+/', ' ', $value); + $value = preg_replace_callback( + $pattern, + create_function( + '$matches', + 'return pack("C", hexdec($matches[1]));' + ), + $value + ); + + $FORM[$name] = $value; + } // end foreach + + return $FORM; +} +?> diff --git a/packages/dspam/www/dspam-analysis.php b/packages/dspam/www/dspam-analysis.php new file mode 100644 index 00000000..89b48df2 --- /dev/null +++ b/packages/dspam/www/dspam-analysis.php @@ -0,0 +1,147 @@ + + + +EOD; + + $pfSenseHead->addScript($jscriptstr); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + +

+ + Graphs showing the number of messages that have been processed are shown below. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ 24 Hour Activity SPAM, Good +
+ + 24 Hour Activity + + " alt="24 Hour Activity" border="0" /> + +
 
+ 14 Day Activity SPAM, Good +
+ + 24 Hour Activity + + 24 Hour Activity + +
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-hfragment.php b/packages/dspam/www/dspam-hfragment.php new file mode 100644 index 00000000..36152a00 --- /dev/null +++ b/packages/dspam/www/dspam-hfragment.php @@ -0,0 +1,90 @@ +getHTML(); + +?> + + + + + + + + + + + + +
+ +
+
+ + + + + + + + + + +
+
+
+
+ ()

+
+
 
+
+            
+            
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-history.php b/packages/dspam/www/dspam-history.php new file mode 100644 index 00000000..e9b77cf2 --- /dev/null +++ b/packages/dspam/www/dspam-history.php @@ -0,0 +1,172 @@ + + + +EOD; + +$pfSenseHead->addScript($jscriptstr); +$pfSenseHead->addLink("\n"); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + + + +

+ + The messages that have been processed by the filter are shown below. The + most recent messages are shown first. Use the retrain options to correct + errors and deliver any false positives that are still in your quarantine. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ + + + + +
 
TypeActionDay/TimeFromSubjectAdditional Info
 
+ + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-perf.php b/packages/dspam/www/dspam-perf.php new file mode 100644 index 00000000..bead8709 --- /dev/null +++ b/packages/dspam/www/dspam-perf.php @@ -0,0 +1,222 @@ + + + +EOD; + +$pfSenseHead->addScript($jscriptstr); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + +

+ + If you receive a message in your e-mail application that was not caught by + the filter, please forward it to + so that it can be analyzed and learned as SPAM. + This will improve the filter's accuracy in the future. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ Performance Statistics +
+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
MetricCalculated as
+ Overall accuracy (since last reset) + + % + (SPAM messages caught + Good messages delivered) / Total number of messages 
+ Spam identification (since last reset) + + % + (Spam catch rate only) 
+ Spam ratio (of total processed) + + % + Total SPAM messages (both caught & missed) / Total number of messages 
+
  + + + + + + + + + + + + + + + + + + + + + +
 SPAM messagesGood messages
Since last reset + missed
+ caught
+ % caught
+
+ missed
+ delivered
+ % missed
+
Total processed by filter + missed
+ caught
+
+ missed
+ delivered
+
From corpus + feed
+
+ feed
+
+
+
+

+ Reset | Tweak -1 +

+
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-prefs.php b/packages/dspam/www/dspam-prefs.php new file mode 100644 index 00000000..668cface --- /dev/null +++ b/packages/dspam/www/dspam-prefs.php @@ -0,0 +1,234 @@ + + + +EOD; + +$pfSenseHead->addScript($jscriptstr); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + +

+ + This page lets you configure how the filter will handle your messages. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ Training – Configure how the filter learns as it processes messages +
+

DSPAM should train:

+ value="TEFT" type="radio" class="formfld" title="On every new message scanned by the filter" alt="On every new message scanned by the filter" name="rad_train" id="rad_train_one" /> + +
+ value="TOE" type="radio" class="formfld" title="Only when the filter makes a mistake" alt="Only when the filter makes a mistake" name="rad_train" id="rad_train_two" /> + +
+ value="TUM" type="radio" class="formfld" title=";Only with new data or if the filter makes a mistake" alt=";Only with new data or if the filter makes a mistake" name="rad_train" id="rad_train_three" /> + +
+

When I train DSPAM, I prefer:

+ value="message" type="radio" class="formfld" title="To forward my spams (signature appears in message body)" alt="To forward my spams (signature appears in message body)" name="rad_train_action" id="rad_train_action_one" /> + +
+ value="headers" type="radio" class="formfld" title="To bounce my spams (signature appears in message headers)" alt="To bounce my spams (signature appears in message headers)" name="rad_train_action" id="rad_train_action_two" /> + +
+

+ Filter sensitivity during the training period: +

+

+ + + Catch SPAM (More in Quarantine)  + /> + /> + /> + /> + /> + » + /> + « + /> + /> + /> + /> + /> +  Assume Good (Fewer in Quarantine) + + +

+
 
+ Message Handling – Configure how SPAM is handled +
+

When a SPAM message is identified:

+

+ type="radio" class="formfld" title="Quarantine the message" alt="Quarantine the message" name="rad_ident_action" id="rad_ident_action_one" /> + +
+ type="radio" class="formfld" title="Tag the Subject header with" alt="Tag the Subject header with" name="rad_ident_action" id="rad_ident_action_two" /> + + " name="msgtag" /> +
+ type="radio" class="formfld" title="Deliver the message normally with a X-DSPAM-Result header" alt="Deliver the message normally with a X-DSPAM-Result header" name="rad_ident_action" id="rad_ident_action_three" /> + +

+
 
+ Features – Tuning SPAM filtering +
+

+ type="checkbox" class="formbtn" title="Enable noise reduction, which usually improves filtering accuracy" alt="Enable noise reduction, which usually improves filtering accuracy" name="chk_feature_nr" id="chk_feature_nr" /> + +
+ type="checkbox" class="formbtn" title="Enable automatic whitelisting to record frequent correspondence" alt="Enable automatic whitelisting to record frequent correspondence" name="chk_feature_aw" id="chk_feature_aw" /> + +
+ type="checkbox" class="formbtn" title="Add the factoring tokens in each email into the message's full headers" alt="Add the factoring tokens in each email into the message's full headers" name="chk_feature_at" id="chk_feature_at" /> + + +

+
 
  + " /> +
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-quarantine.php b/packages/dspam/www/dspam-quarantine.php new file mode 100644 index 00000000..19d8b755 --- /dev/null +++ b/packages/dspam/www/dspam-quarantine.php @@ -0,0 +1,178 @@ + + + +EOD; + +$pfSenseHead->addScript($jscriptstr); +$pfSenseHead->addLink("\n"); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + + + + + +

+ + The messages below have not been delivered to your normal e-mail application + because they are believed to be spam. Click on the Subject line to view the + message or choose a sort option to change how messages are sorted. Use the + checkboxes and Deliver Checked to deliver messages you want + to read, or use Delete All to empty the quarantine. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ +   +   + + + + + +
 
 
+ +   +   + + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-settings-algo.php b/packages/dspam/www/dspam-settings-algo.php new file mode 100644 index 00000000..58ffb247 --- /dev/null +++ b/packages/dspam/www/dspam-settings-algo.php @@ -0,0 +1,204 @@ + + foo + foo desc + + + bar + bar desc + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['algorithm'])) { + $config['installedpackages']['dspam']['config'][0]['algorithm'] = array(); +} + +$t_algos = &$config['installedpackages']['dspam']['config'][0]['algorithm']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_algos[$id]) { + $pconfig['name'] = $t_algos[$id]['name']; + $pconfig['descr'] = $t_algos[$id]['descr']; +} else { + $pconfig['name'] = $_GET['aname']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "aname"); + $reqdfieldsn = explode(",", "DSPAM Algorithm Name"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_algos as $algo) { + if (isset($id) && ($t_algos[$id]) && ($t_algos[$id] === $algo)) { + continue; + } + if ($algo['name'] == $_POST['aname']) { + $input_errors[] = gettext("This algorithm name already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $algo = array(); + $algo['name'] = $_POST['aname']; + $algo['descr'] = $_POST['descr']; + + if (isset($id) && $t_algos[$id]) + $t_algos[$id] = $algo; + else + $t_algos[] = $algo; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ + +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-bmta.php b/packages/dspam/www/dspam-settings-bmta.php new file mode 100644 index 00000000..c670085d --- /dev/null +++ b/packages/dspam/www/dspam-settings-bmta.php @@ -0,0 +1,202 @@ + + foo + foo desc + + + bar + bar desc + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['bmta'])) { + $config['installedpackages']['dspam']['config'][0]['bmta'] = array(); +} + +$t_bmtas = &$config['installedpackages']['dspam']['config'][0]['bmta']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_bmtas[$id]) { + $pconfig['name'] = $t_bmtas[$id]['name']; + $pconfig['descr'] = $t_bmtas[$id]['descr']; +} else { + $pconfig['name'] = $_GET['oname']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "oname"); + $reqdfieldsn = explode(",", "Broken MTA Option Name"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_bmtas as $bmta) { + if (isset($id) && ($t_bmtas[$id]) && ($t_bmtas[$id] === $bmta)) { + continue; + } + if ($bmta['name'] == $_POST['oname']) { + $input_errors[] = gettext("This option name already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $bmta = array(); + $bmta['name'] = $_POST['oname']; + $bmta['descr'] = $_POST['descr']; + + if (isset($id) && $t_bmtas[$id]) + $t_bmtas[$id] = $bmta; + else + $t_bmtas[] = $bmta; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ + +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-feat.php b/packages/dspam/www/dspam-settings-feat.php new file mode 100644 index 00000000..7805fa43 --- /dev/null +++ b/packages/dspam/www/dspam-settings-feat.php @@ -0,0 +1,203 @@ + + foo + foo desc + + + bar + bar desc + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['feature'])) { + $config['installedpackages']['dspam']['config'][0]['feature'] = array(); +} + +$t_features = &$config['installedpackages']['dspam']['config'][0]['feature']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_features[$id]) { + $pconfig['name'] = $t_features[$id]['name']; + $pconfig['descr'] = $t_features[$id]['descr']; +} else { + $pconfig['name'] = $_GET['fname']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "fname"); + $reqdfieldsn = explode(",", "DSPAM Feature Name"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_features as $feature) { + if (isset($id) && ($t_features[$id]) && ($t_features[$id] === $feature)) { + continue; + } + if ($feature['name'] == $_POST['fname']) { + $input_errors[] = gettext("This feature name already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $feature = array(); + $feature['name'] = $_POST['fname']; + $feature['descr'] = $_POST['descr']; + + if (isset($id) && $t_features[$id]) + $t_features[$id] = $feature; + else + $t_features[] = $feature; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ + +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-header.php b/packages/dspam/www/dspam-settings-header.php new file mode 100644 index 00000000..d0a5dd9c --- /dev/null +++ b/packages/dspam/www/dspam-settings-header.php @@ -0,0 +1,197 @@ + + foo + foo desc + +
+ bar + foo desc +
+*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['header'])) { + $config['installedpackages']['dspam']['config'][0]['header'] = array(); +} + +$t_headers = &$config['installedpackages']['dspam']['config'][0]['header']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_headers[$id]) { + $pconfig['name'] = $t_headers[$id]['name']; + $pconfig['descr'] = $t_headers[$id]['descr']; +} else { + $pconfig['name'] = $_GET['hname']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "hname"); + $reqdfieldsn = explode(",", "Header Name"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_headers as $header) { + if (isset($id) && ($t_headers[$id]) && ($t_headers[$id] === $header)) { + continue; + } + if ($header['name'] == $_POST['hname']) { + $input_errors[] = gettext("This header name already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $header = array(); + $header['name'] = $_POST['hname']; + $header['descr'] = $_POST['descr']; + + if (isset($id) && $t_headers[$id]) + $t_headers[$id] = $header; + else + $t_headers[] = $header; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-overr.php b/packages/dspam/www/dspam-settings-overr.php new file mode 100644 index 00000000..d938b313 --- /dev/null +++ b/packages/dspam/www/dspam-settings-overr.php @@ -0,0 +1,197 @@ + + foo + foo desc + + + bar + bar desc + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['override'])) { + $config['installedpackages']['dspam']['config'][0]['override'] = array(); +} + +$t_overr = &$config['installedpackages']['dspam']['config'][0]['override']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_overr[$id]) { + $pconfig['value'] = $t_overr[$id]['value']; + $pconfig['descr'] = $t_overr[$id]['descr']; +} else { + $pconfig['value'] = $_GET['ovalue']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "ovalue"); + $reqdfieldsn = explode(",", "DSPAM Override Value"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_overr as $over) { + if (isset($id) && ($t_overr[$id]) && ($t_overr[$id] === $over)) { + continue; + } + if ($over['value'] == $_POST['ovalue']) { + $input_errors[] = gettext("This override value exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $over = array(); + $over['value'] = $_POST['ovalue']; + $over['descr'] = $_POST['descr']; + + if (isset($id) && $t_overr[$id]) + $t_overr[$id] = $over; + else + $t_overr[] = $over; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-prefs.php b/packages/dspam/www/dspam-settings-prefs.php new file mode 100644 index 00000000..c30cb7bd --- /dev/null +++ b/packages/dspam/www/dspam-settings-prefs.php @@ -0,0 +1,197 @@ + + foo + foo desc + + + bar + bar desc + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['preference'])) { + $config['installedpackages']['dspam']['config'][0]['preference'] = array(); +} + +$t_prefs = &$config['installedpackages']['dspam']['config'][0]['preference']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_prefs[$id]) { + $pconfig['value'] = $t_prefs[$id]['value']; + $pconfig['descr'] = $t_prefs[$id]['descr']; +} else { + $pconfig['value'] = $_GET['pvalue']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "pvalue"); + $reqdfieldsn = explode(",", "DSPAM Algorithm Name"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_prefs as $pref) { + if (isset($id) && ($t_prefs[$id]) && ($t_prefs[$id] === $pref)) { + continue; + } + if ($pref['value'] == $_POST['pvalue']) { + $input_errors[] = gettext("This preference value already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $pref = array(); + $pref['value'] = $_POST['pvalue']; + $pref['descr'] = $_POST['descr']; + + if (isset($id) && $t_prefs[$id]) + $t_prefs[$id] = $pref; + else + $t_prefs[] = $pref; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-spwd.php b/packages/dspam/www/dspam-settings-spwd.php new file mode 100644 index 00000000..7912b0f6 --- /dev/null +++ b/packages/dspam/www/dspam-settings-spwd.php @@ -0,0 +1,197 @@ + + foo + foo desc + + + bar + bar desc + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['server-pwd'])) { + $config['installedpackages']['dspam']['config'][0]['server-pwd'] = array(); +} + +$t_spwds = &$config['installedpackages']['dspam']['config'][0]['server-pwd']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_spwds[$id]) { + $pconfig['value'] = $t_spwds[$id]['value']; + $pconfig['descr'] = $t_spwds[$id]['descr']; +} else { + $pconfig['value'] = $_GET['pwdvalue']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "pwdvalue"); + $reqdfieldsn = explode(",", "Server Password Value"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_spwds as $spwd) { + if (isset($id) && ($t_spwds[$id]) && ($t_spwds[$id] === $spwd)) { + continue; + } + if ($spwd['value'] == $_POST['pwdvalue']) { + $input_errors[] = gettext("This password value already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $pwd = array(); + $pwd['value'] = $_POST['pwdvalue']; + $pwd['descr'] = $_POST['descr']; + + if (isset($id) && $t_spwds[$id]) + $t_spwds[$id] = $pwd; + else + $t_spwds[] = $pwd; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings-tuser.php b/packages/dspam/www/dspam-settings-tuser.php new file mode 100644 index 00000000..57e9ec71 --- /dev/null +++ b/packages/dspam/www/dspam-settings-tuser.php @@ -0,0 +1,195 @@ + + foo + + + bar + +*/ + +if (!is_array($config['installedpackages']['dspam']['config'][0]['tuser'])) { + $config['installedpackages']['dspam']['config'][0]['tuser'] = array(); +} + +$t_users = &$config['installedpackages']['dspam']['config'][0]['tuser']; + +/* ID is only set if the user wants to edit an existing entry */ +$id = $_GET['id']; +$sectionid = $_GET['sectionid']; +if (isset($_POST['id'])) + $id = $_POST['id']; +if (isset($_POST['sectionid'])) + $sectionid = $_POST['sectionid']; + +if (isset($id) && $t_users[$id]) { + $pconfig['name'] = $t_users[$id]['name']; + $pconfig['descr'] = $t_users[$id]['descr']; +} else { + $pconfig['name'] = $_GET['uuname']; + $pconfig['descr'] = $_GET['descr']; +} + +if ($_POST) { + + unset($input_errors); + $pconfig = $_POST; + + /* input validation */ + $reqdfields = explode(" ", "uuname"); + $reqdfieldsn = explode(",", "Unix username"); + + do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors); + + /* check for overlaps */ + foreach ($t_users as $user) { + if (isset($id) && ($t_users[$id]) && ($t_users[$id] === $user)) { + continue; + } + if ($user['name'] == $_POST['uuname']) { + $input_errors[] = gettext("This username already exists."); + break; + } + } + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $user = array(); + $user['name'] = $_POST['uuname']; + $user['descr'] = $_POST['descr']; + + if (isset($id) && $t_users[$id]) + $t_users[$id] = $user; + else + $t_users[] = $user; + + write_config(); + + $retval = 0; + config_lock(); + $retval = dspam_configure(); + config_unlock(); + + $savemsg = get_std_save_message($retval); + + isset($sectionid) ? $header = "dspam-settings.php?sectionid={$sectionid}" : $header = "dspam-settings.php"; + pfSenseHeader($header); + exit; + } +} + +/* if ajax is calling, give them an update message */ +if(isAjax()) + print_info_box_np($savemsg); + +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +echo $pfSenseHead->getHTML(); + +?> + + + + +
+
+ + + + + + + + + + + + + +
+ +
+ +
  + "> " onclick="history.back()"> + + + + + + +
+
+ +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + diff --git a/packages/dspam/www/dspam-settings.php b/packages/dspam/www/dspam-settings.php new file mode 100644 index 00000000..db7a4914 --- /dev/null +++ b/packages/dspam/www/dspam-settings.php @@ -0,0 +1,2941 @@ + "") { + $error_bucket[] = array("error" => "You must specify a valid MySQL server name value.", + "field" => "msqlserver"); + } else { + if (strpos($_POST['msqlserver'], '/') === false) { + foreach (explode(' ', $_POST['msqlserver']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A MySQL server name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "msqlserver"); + break; + } + } + } + } + /* if we are going to use a TCP/IP base MySQL connection, a port value is required */ + if (! is_port($_POST['msqlport']) && strpos($_POST['msqlserver'], '/') === false) { + $error_bucket[] = array("error" => "You must specify a valid MySQL port value.", + "field" => "msqlport"); + } + if (! $_POST['msqluser'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid MySQL username value.", + "field" => "msqluser"); + } + if (! $_POST['msqlpwd'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid MySQL password value.", + "field" => "msqlpwd"); + } + if (! $_POST['msqldb'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid MySQL database value.", + "field" => "msqldb"); + } + if ($_POST['msqlccache'] && !is_numericint($_POST['msqlccache'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a connection cache value.", + "field" => "msqlccache"); + } + } else if($_POST['sdriver'] == "sqlite") { + /* NOP */ + } else if($_POST['sdriver'] == "bdb") { + /* NOP */ + } else if($_POST['sdriver'] == "pgsql") { + if (! $_POST['pgserver'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid PostgreSQL server name value.", + "field" => "pgserver"); + } else { + foreach (explode(' ', $_POST['pgserver']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A PostgreSQL server name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "pgserver"); + break; + } + } + } + if (! is_port($_POST['pgport'])) { + $error_bucket[] = array("error" => "You must specify a valid PostgreSQL port value.", + "field" => "pgport"); + } + if (! $_POST['pguser'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid PostgreSQL username value.", + "field" => "pguser"); + } + if (! $_POST['pgpwd'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid PostgreSQL password value.", + "field" => "pgpwd"); + } + if (! $_POST['pgdb'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid PostgreSQL database value.", + "field" => "pgdb"); + } + if ($_POST['pgccache'] && !is_numericint($_POST['pgccache'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a connection cache value.", + "field" => "pgccache"); + } + } else if($_POST['sdriver'] == "oracle") { + if (! $_POST['oraserver'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid Oracle server connection string.", + "field" => "oraserver"); + } + if (! $_POST['orauser'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid Oracle username value.", + "field" => "orauser"); + } + if (! $_POST['orapwd'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid Oracle password value.", + "field" => "orapwd"); + } + if (! $_POST['orasch'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid Oracle schema value.", + "field" => "orasch"); + } + } else if($_POST['sdriver'] == "hash") { + if ($_POST['hsrmax'] && !is_numericint($_POST['hsrmax'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a number for the initial records to be created.", + "field" => "hsrmax"); + } + if ($_POST['hsmxex'] && !is_numericint($_POST['hsmxex'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a number for the maximum extends.", + "field" => "hsmxex"); + } + if ($_POST['hsexsz'] && !is_numericint($_POST['hsexsz'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a number for the record size.", + "field" => "hsexsz"); + } + if ($_POST['hsmxse'] && !is_numericint($_POST['hsmxse'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a number for the maximum number of records to seek.", + "field" => "hsmxse"); + } + if ($_POST['hscoca'] && !is_numericint($_POST['hscoca'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a number for hash connection cache.", + "field" => "hscoca"); + } + } + + if ($_POST['tcpipdel'] == "yes") { + if (! $_POST['dhost'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid server name value for the DSPAM deliver host.", + "field" => "dhost"); + } else { + foreach (explode(' ', $_POST['dhost']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A DSPAM delivery host name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "dhost"); + break; + } + } + } + if (! is_port($_POST['dport'])) { + $error_bucket[] = array("error" => "You must specify a valid port value for the DSPAM delivery host.", + "field" => "dport"); + } + if (! $_POST['dident'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid identification string for the DSPAM delivery host.", + "field" => "dident"); + } + } + + if ($_POST['enabledbg'] == "yes") { + if (! $_POST['debug'] <> "") { + $error_bucket[] = array("error" => "You must specify a non-zero value for the debug parameter.", + "field" => "debug"); + } + if (! $_POST['dopt'] <> "") { + $error_bucket[] = array("error" => "You must specify a non-zero value for the debug options.", + "field" => "dopt"); + } + } + + if ($_POST['enableldap'] == "yes") { + if (! $_POST['ldaphost'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid server name value for the LDAP host.", + "field" => "ldaphost"); + } else { + foreach (explode(' ', $_POST['ldaphost']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A LDAP host name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "ldaphost"); + break; + } + } + } + if (! $_POST['ldapfilter'] <> "") { + $error_bucket[] = array("error" => "You must specify a non-zero value for the LDAP filter option or you may not be able to get any query result.", + "field" => "ldapfilter"); + } + if (! $_POST['ldapbase'] <> "") { + $error_bucket[] = array("error" => "You must specify a non-zero value for the LDAP base option or you may not be able to get any query result.", + "field" => "ldapbase"); + } + } + + /* misc settings */ + if ($_POST['foatt'] && !is_numericint($_POST['foatt'])) { + $error_bucket[] = array("error" => "You must specify a integer based value for the number of failover attempts.", + "field" => "foatt"); + } + if ($_POST['enablesbl'] == "yes") { + if (! $_POST['sblhost'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid server name value for the SBL host.", + "field" => "sblhost"); + } else { + foreach (explode(' ', $_POST['sblhost']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A SBL host name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "sblhost"); + break; + } + } + } + } + if(isset($_POST['enablenoti'])) { + if($_POST['dspamcontact'] == "") { + $error_bucket[] = array("error" => "It is necessary to provide a support contact, if you want DSPAM to send notification messages.", + "field" => "dspamcontact"); + } + if(empty($_POST['whichdomain'])) { + if ($_POST['dspamdomain'] == "") { + $error_bucket[] = array("error" => "You must specify a valid domain name that should be used while sending DSPAM related mail messages.", + "field" => "dspamdomain"); + } else { + if (!is_domain($_POST['dspamdomain'])) { + $error_bucket[] = array("error" => "You must specify a valid domain name that should be used while sending DSPAM related mail messages.", + "field" => "dspamdomain"); + } + } + } + } + + /* Maintanance Settings */ + if (! $_POST['psig'] || $_POST['psig'] == "") { + $error_bucket[] = array("error" => "You must specify a value for the number of signatures to be purged.", + "field" => "psig"); + } else if (! $_POST['psig'] == "off") { + if (!is_numericint($_POST['psig'])) { + $error_bucket[] = array("error" => "You must specify a valide integer value for the number of signatures to be purged.", + "field" => "psig"); + } + } + if (! $_POST['pneut'] || $_POST['pneut'] == "") { + $error_bucket[] = array("error" => "You must specify a value for the number of neutrals to be purged.", + "field" => "pneut"); + } else if (! $_POST['pneut'] == "off") { + if (!is_numericint($_POST['pneut'])) { + $error_bucket[] = array("error" => "You must specify a valide integer value for the number of neutrals to be purged.", + "field" => "pneut"); + } + } + if (! $_POST['punu'] || $_POST['punu'] == "") { + $error_bucket[] = array("error" => "You must specify a value for the number of unused tokens to be purged.", + "field" => "punu"); + } else if (! $_POST['punu'] == "off") { + if (!is_numericint($_POST['punu'])) { + $error_bucket[] = array("error" => "You must specify a valide integer value for the number of unused tokens to be purged.", + "field" => "punu"); + } + } + if (! $_POST['phapa'] || $_POST['phapa'] == "") { + $input_errors[] = "You must specify a value for the number of hapaxes to be purged."; + $input_error_fields[] = "phapa"; + } else if (! $_POST['phapa'] == "off") { + if (!is_numericint($_POST['phapa'])) { + $error_bucket[] = array("error" => "You must specify a valide integer value for the number of hapaxes to be purged.", + "field" => "phapa"); + } + } + if (! $_POST['pones'] || $_POST['pones'] == "") { + $error_bucket[] = array("error" => "You must specify a value for the number of tokens with only 1 spam hit to be purged.", + "field" => "pones"); + } else if (! $_POST['pones'] == "off") { + if (!is_numericint($_POST['pones'])) { + $error_bucket[] = array("error" => "You must specify a valide integer value for the number of tokens with only 1 spam hit to be purged.", + "field" => "pones"); + } + } + if (! $_POST['ponei'] || $_POST['ponei'] == "") { + $error_bucket[] = array("error" => "You must specify a value for the number of tokens with only 1 innocent hit to be purged.", + "field" => "ponei"); + } else if (! $_POST['ponei'] == "off") { + if (!is_numericint($_POST['ponei'])) { + $error_bucket[] = array("error" => "You must specify a valide integer value for the number of tokens with only 1 innocent hit to be purged.", + "field" => "ponei"); + } + } + + /* System Settings */ + if (! is_ipaddr($_POST['locmx'])) { + $error_bucket[] = array("error" => "You must specify a valid IP address for the local MX parameter.", + "field" => "locmx"); + } + if ($_POST['maxmsgs'] && !is_numericint($_POST['maxmsgs'])) { + $error_bucket[] = array("error" => "You must specify a integer based value for the maximum message size.", + "field" => "maxmsgs"); + } + + /* ClamAV Settings */ + if ($_POST['enableclam'] == "yes") { + if (! is_port($_POST['clamport'])) { + $error_bucket[] = array("error" => "You must specify a valid port value for the ClamAV host.", + "field" => "clamport"); + } + if (! $_POST['clamhost'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid server name value for the ClamAV host.", + "field" => "clamhost"); + } else { + foreach (explode(' ', $_POST['clamhost']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A ClamAV host name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "clamhost"); + break; + } + } + } + } + + /* */ + /* DSPAM Daemon Settings (Server) */ + /* */ + + /* at least the DSPAM thin client (dspamc) + * should force the user to configure the + * DSPAM daemon. + */ + if (isset($_POST['dsthinc'])) { + if (! is_port($_POST['dsport'])) { + $error_bucket[] = array("error" => "You must specify a valid port value for the DSPAM host.", + "field" => "dsport"); + } + if ($_POST['dsqsize'] && !is_numericint($_POST['dsqsize'])) { + $error_bucket[] = array("error" => "You must specify a valid integer value as a number for the server queue size.", + "field" => "dsqsize"); + } + if (! $_POST['dspid'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid value as PID file for the DSPAM server.", + "field" => "dspid"); + } + if ($_POST['dssmode'] == "standard") { + if (! $_POST['serverparam'] <> "") { + $error_bucket[] = array("error" => "You must specify some valid parameters to be passed to the LMTP server.", + "field" => "serverparam"); + } + if (! $_POST['serverid'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid identification string to be passed to the LMTP server.", + "field" => "serverid"); + } + if ($_POST['serversock'] && $_POST['serversock'] <> "") { + if (strpos($_POST['serversock'], '/') === false) { + $error_bucket[] = array("error" => "You must specify a valid value for the location of a Unix domain socket.", + "field" => "serversock"); + } + } + } + } + + /* DSPAM Daemon Settings (Client) */ + if ($_POST['enabledsclient'] == "yes") { + if (! $_POST['dsclhost'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid server name value for the DSPAM client host.", + "field" => "dsclhost"); + } else { + foreach (explode(' ', $_POST['dsclhost']) as $ts) { + if (!is_domain($ts)) { + $error_bucket[] = array("error" => "A DSPAM client host name may only contain the characters a-z, 0-9, '-' and '.'.", + "field" => "dsclhost"); + break; + } + } + } + if (! is_port($_POST['dsclport'])) { + $error_bucket[] = array("error" => "You must specify a valid port value for the DSPAM client host.", + "field" => "dsclport"); + } + if (! $_POST['dsclident'] <> "") { + $error_bucket[] = array("error" => "You must specify a valid value as identification string for the DSPAM client.", + "field" => "dsclident"); + } + } + + if (is_array($error_bucket)) + foreach($error_bucket as $elem) + $input_errors[] =& $elem["error"]; + + /* if this is an AJAX caller then handle via JSON */ + if(isAjax() && is_array($input_errors)) { + input_errors2Ajax($input_errors); + exit; + } + + if (!$input_errors) { + $config['installedpackages']['dspam']['config'][0]['storage-driver'] = $_POST['sdriver']; + unset($config['installedpackages']['dspam']['config'][0]['dbsettings']); + + if($_POST['sdriver'] == "mysql") { + /* ====================================================================== */ + /* == String and integer values == */ + /* ====================================================================== */ + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-server'] = $_POST['msqlserver']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-port'] = $_POST['msqlport']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-user'] = $_POST['msqluser']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-password'] = $_POST['msqlpwd']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-database'] = $_POST['msqldb']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-ccache'] = $_POST['msqlccache']; + /* ====================================================================== */ + /* == Boolean values == */ + /* ====================================================================== */ + if($_POST['msqlcomp'] == "yes") + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-compress'] = $_POST['msqlcomp']; + else + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-compress']); + if($_POST['msqlsuqt'] == "yes") + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-squote'] = $_POST['msqlsuqt']; + else + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-squote']); + if($_POST['msqluid'] == "yes") + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-uid'] = $_POST['msqluid']; + else + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-uid']); + } else if($_POST['sdriver'] == "sqlite") { + /* ====================================================================== */ + /* == String and integer values == */ + /* ====================================================================== */ + if ($_POST['slitepr']) + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['sqlite-pragma'] = $_POST['slitepr']; + } else if($_POST['sdriver'] == "bdb") { + /* NOP */ + } else if($_POST['sdriver'] == "pgsql") { + /* ====================================================================== */ + /* == String and integer values == */ + /* ====================================================================== */ + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-server'] = $_POST['pgserver']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-port'] = $_POST['pgport']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-user'] = $_POST['pguser']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-password'] = $_POST['pgpwd']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-database'] = $_POST['pgdb']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-ccache'] = $_POST['pgccache']; + /* ====================================================================== */ + /* == Boolean values == */ + /* ====================================================================== */ + if($_POST['pguid'] == "yes") + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-uid'] = $_POST['pguid']; + else + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-uid']); + } else if($_POST['sdriver'] == "oracle") { + /* ====================================================================== */ + /* == String and integer values == */ + /* ====================================================================== */ + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-server'] = $_POST['oraserver']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-user'] = $_POST['orauser']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-password'] = $_POST['orapwd']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-schema'] = $_POST['orasch']; + } else if($_POST['sdriver'] == "hash") { + /* ====================================================================== */ + /* == String and integer values == */ + /* ====================================================================== */ + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-rec-max'] = $_POST['hsrmax']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-ext'] = $_POST['hsmxex']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-ext-size'] = $_POST['hsexsz']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-seek'] = $_POST['hsmxse']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-user'] = $_POST['hsccus']; + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-cache'] = $_POST['hscoca']; + /* ====================================================================== */ + /* == Boolean values == */ + /* ====================================================================== */ + if($_POST['hsatex'] == "yes") + $config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-auto-ex'] = $_POST['hsatex']; + else + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-auto-ex']); + } + + $config['installedpackages']['dspam']['config'][0]['tdelivery-agent'] = $_POST['dagent']; + $config['installedpackages']['dspam']['config'][0]['thin-client'] = $_POST['dsthinc']; + + if($_POST['tcpipdel'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery'] = $_POST['tcpipdel']; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-host'] = $_POST['dhost']; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-port'] = $_POST['dport']; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-ident'] = $_POST['dident']; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-proto'] = $_POST['delproto']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-host']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-port']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-ident']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-proto']); + } + + $config['installedpackages']['dspam']['config'][0]['delivery-onfail'] = $_POST['onfail']; + + if($_POST['enabledbg'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['debug-enable'] = $_POST['enabledbg']; + $config['installedpackages']['dspam']['config'][0]['debug-whom'] = $_POST['debug']; + $config['installedpackages']['dspam']['config'][0]['debug-options'] = $_POST['dopt']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['debug-enable']); + unset($config['installedpackages']['dspam']['config'][0]['debug-whom']); + unset($config['installedpackages']['dspam']['config'][0]['debug-options']); + } + + /* DSPAM engine settings */ + $config['installedpackages']['dspam']['config'][0]['training-mode'] = $_POST['tmode']; + if($_POST['testct'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['test-cond-training'] = $_POST['testct']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['test-cond-training']); + } + $config['installedpackages']['dspam']['config'][0]['pvalue'] = $_POST['pvalue']; + if($_POST['ipdrive'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['improbability-drive'] = $_POST['ipdrive']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['improbability-drive']); + } + + /* LDAP related settings */ + if($_POST['enableldap'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['ldap-enable'] = $_POST['enableldap']; + $config['installedpackages']['dspam']['config'][0]['ldap-mode'] = $_POST['ldapmode']; + $config['installedpackages']['dspam']['config'][0]['ldap-host'] = $_POST['ldaphost']; + $config['installedpackages']['dspam']['config'][0]['ldap-filter'] = $_POST['ldapfilter']; + $config['installedpackages']['dspam']['config'][0]['ldap-base'] = $_POST['ldapbase']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['ldap-enable']); + unset($config['installedpackages']['dspam']['config'][0]['ldap-mode']); + unset($config['installedpackages']['dspam']['config'][0]['ldap-host']); + unset($config['installedpackages']['dspam']['config'][0]['ldap-filter']); + unset($config['installedpackages']['dspam']['config'][0]['ldap-base']); + } + + /* misc settings */ + $config['installedpackages']['dspam']['config'][0]['failover-attempts'] = $_POST['foatt']; + if($_POST['enablesbl'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['sbl-enable'] = $_POST['enablesbl']; + $config['installedpackages']['dspam']['config'][0]['sbl-host'] = $_POST['sblhost']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['sbl-enable']); + unset($config['installedpackages']['dspam']['config'][0]['sbl-host']); + } + if($_POST['enablerbl'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['rbl-inoculate'] = $_POST['enablerbl']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['rbl-inoculate']); + } + if($_POST['enablenoti'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['notification-email'] = $_POST['enablenoti']; + $config['installedpackages']['dspam']['config'][0]['dspam-contact'] = $_POST['dspamcontact']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['notification-email']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-domain']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-contact']); + } + if($_POST['whichdomain'] == "yes") { + unset($config['installedpackages']['dspam']['config'][0]['dspam-domain']); + } else { + $config['installedpackages']['dspam']['config'][0]['dspam-domain'] = $_POST['dspamdomain']; + } + + /* Maintainance Settings */ + $config['installedpackages']['dspam']['config'][0]['purge-signatures'] = $_POST['psig']; + $config['installedpackages']['dspam']['config'][0]['purge-neutral'] = $_POST['pneut']; + $config['installedpackages']['dspam']['config'][0]['purge-unused'] = $_POST['punu']; + $config['installedpackages']['dspam']['config'][0]['purge-hapaxes'] = $_POST['phapa']; + $config['installedpackages']['dspam']['config'][0]['purge-hits-1s'] = $_POST['pones']; + $config['installedpackages']['dspam']['config'][0]['purge-hits-1i'] = $_POST['ponei']; + + /* System Settings */ + $config['installedpackages']['dspam']['config'][0]['local-mx'] = $_POST['locmx']; + $config['installedpackages']['dspam']['config'][0]['local-mx'] = $_POST['locmx']; + if($_POST['enablesysl'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['system-log'] = $_POST['enablesysl']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['system-log']); + } + if($_POST['enableusel'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['user-log'] = $_POST['enableusel']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['user-log']); + } + $config['installedpackages']['dspam']['config'][0]['filter-opt'] = $_POST['optinout']; + if($_POST['enableptoh'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['parse-to-headers'] = $_POST['enableptoh']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['parse-to-headers']); + } + if($_POST['enablecmop'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['change-mode-on-parse'] = $_POST['enablecmop']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['change-mode-on-parse']); + } + if($_POST['enablecuop'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['change-user-on-parse'] = $_POST['enablecuop']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['change-user-on-parse']); + } + if($_POST['enablecuop'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['change-user-on-parse'] = $_POST['enablecuop']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['change-user-on-parse']); + } + if($_POST['enablebmta'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['broken-mta-settings'] = $_POST['enablebmta']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['broken-mta-settings']); + } + $config['installedpackages']['dspam']['config'][0]['max-message-size'] = $_POST['maxmsgs']; + if($_POST['procbias'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['processor-bias'] = $_POST['procbias']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['processor-bias']); + } + + /* ClamAV related settings */ + if($_POST['enableclam'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['clamav-enable'] = $_POST['enableclam']; + $config['installedpackages']['dspam']['config'][0]['clamav-port'] = $_POST['clamport']; + $config['installedpackages']['dspam']['config'][0]['clamav-host'] = $_POST['clamhost']; + $config['installedpackages']['dspam']['config'][0]['clamav-response'] = $_POST['clamresp']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['clamav-enable']); + unset($config['installedpackages']['dspam']['config'][0]['clamav-port']); + unset($config['installedpackages']['dspam']['config'][0]['clamav-host']); + unset($config['installedpackages']['dspam']['config'][0]['clamav-response']); + } + + /* DSPAM daemon settings */ + $config['installedpackages']['dspam']['config'][0]['dspam-server-port'] = $_POST['dsport']; + $config['installedpackages']['dspam']['config'][0]['dspam-server-queue-size'] = $_POST['dsqsize']; + $config['installedpackages']['dspam']['config'][0]['dspam-server-pid'] = $_POST['dspid']; + $config['installedpackages']['dspam']['config'][0]['dspam-server-mode'] = $_POST['dssmode']; + $config['installedpackages']['dspam']['config'][0]['dspam-server-params'] = $_POST['serverparam']; + $config['installedpackages']['dspam']['config'][0]['dspam-server-id'] = $_POST['serverid']; + $config['installedpackages']['dspam']['config'][0]['dspam-server-socket'] = $_POST['serversock']; + + /* DSPAM client settings */ + if($_POST['enabledsclient'] == "yes") { + $config['installedpackages']['dspam']['config'][0]['dspam-client-enable'] = $_POST['enabledsclient']; + $config['installedpackages']['dspam']['config'][0]['dspam-client-host'] = $_POST['dsclhost']; + $config['installedpackages']['dspam']['config'][0]['dspam-client-port'] = $_POST['dsclport']; + $config['installedpackages']['dspam']['config'][0]['dspam-client-id'] = $_POST['dsclident']; + } else { + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-enable']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-host']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-port']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-id']); + } + + write_config(); + + $retval = 0; + conf_mount_rw(); + config_lock(); + $retval = dspam_configure(); + config_unlock(); + $savemsg = get_std_save_message($retval); + conf_mount_ro(); + } +} + +/* did the user send a request to delete an item? */ +if ($_GET['act'] == "del") { + if ($_GET['what'] == "tuser" && $t_users[$_GET['id']]) { + unset($t_users[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "feat" && $t_features[$_GET['id']]) { + unset($t_features[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "algo" && $t_algos[$_GET['id']]) { + unset($t_algos[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "pref" && $t_prefs[$_GET['id']]) { + unset($t_prefs[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "overr" && $t_overr[$_GET['id']]) { + unset($t_overr[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "header" && $t_headers[$_GET['id']]) { + unset($t_headers[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "bmta" && $t_bmtas[$_GET['id']]) { + unset($t_bmtas[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } else if ($_GET['what'] == "spwd" && $t_spwds[$_GET['id']]) { + unset($t_spwds[$_GET['id']]); + write_config(); + pfSenseHeader("dspam-settings.php"); + exit; + } +} + + /* if ajax is calling, give them an update message */ + if(isAjax()) + print_info_box_np($savemsg); + + include("head.inc"); + /* put your custom HTML head content here */ + /* using some of the $pfSenseHead function calls */ + $jscriptstr = << + + +EOD; + + $pfSenseHead->addScript($jscriptstr); + echo $pfSenseHead->getHTML();?> + +> + +
+ + + +

+ + + Note: + + the options on this page are intended for use by advanced users only. + Any setting found on this page is directly going into dspam.conf. + Make sure you do not mess with settings, you do not understand. + +

+

+ If you submit this page, the DSPAM daemon process will be restarted. +

+
+ + + + + + + +
+ +
+
+ + + + + + + +
+

Settings

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Database Settings
Storage Driver + + Specifies the storage driver backend (library) to use. +

+ + IMPORTANT: Switching storage drivers requires more than merely changing this option. + If you do not wish to lose all of your data, you will need to migrate it to the new + backend before making this change. + +

+
  + + " onclick="document.iform.sectionid.value = 'db';" /> +
 
 Delivery Settings
Trusted Delivery Agent + + Specifies the local delivery agent DSPAM should call when delivering mail as a trusted user. +

+ + Note: Use %u to specify the user DSPAM is processing mail for. It is generally a good idea to + allow the MTA to specify the pass-through arguments at run-time, but they may also be specified + here. + +

+
DSPAM Thin Client + /> + Use dspamc instead of the dspam binary. +

+ + Note: This requires to enable the dspam daemon as well (section: DSPAM Daemon Settings (Server)). + +

+
TCP/IP Based Delivery + onClick="enable_change(false, 5);" /> + Use TCP/IP based delivery. +

+ + Note: This option needs to be ticked if you are going to deliver via LMTP or SMTP. + +

+
Deliver Host + name="dhost" id="dhost" value="" /> + Alternatively, you may wish to use SMTP or LMTP delivery to deliver your message to the mail server. +

+ + Note: You will need to configure with --enable-daemon to use host delivery, + however you do not need to operate in daemon mode. Specify an IP address or UNIX path to a + domain socket below as a host. + +

+
Deliver Port + name="dport" id="dport" value="" /> + Port number of a particular host. +
Deliver Ident + name="dident" id="dident" value="" /> + A particular identification string +
TCP/IP Delivery Protocol + + A particular protocol typ. Either SMTP + or LMTP. +
On Fail + + What to do if local delivery or quarantine should fail. +

+ + Note: If set to "unlearn", DSPAM will unlearn the message prior to exiting with an un + successful return code. The default option, "error" will not unlearn the message but + return the appropriate error code. The unlearn option is use-ful on some systems where local + delivery failures will cause the message to be requeued for delivery, and could result in the + message being processed multiple times. During a very large failure, however, this could cause + a significant load increase. + +

+
  + + " onclick="document.iform.sectionid.value = 'del';" /> +
 
 DSPAM Privileges
Trusted Users + Unix users which are allowed to perform certain actions. +

+ + Note: Only the users specified below will be allowed to perform + administrative functions in DSPAM such as setting the active user and + accessing tools. All other users attempting to run DSPAM will be restricted; + their uids will be forced to match the active username and they will not be + able to specify delivery agent privileges or use tools. + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
  + + " onclick="document.iform.sectionid.value = 'priv';" /> +
 
 DSPAM Debugging Options + onClick="enable_change(false, 0);" /> + Enable +
Debug + name="debug" id="debug" value="" /> + Enables debugging for some or all users. +

+ + IMPORTANT: DSPAM must be compiled with debug support in order to use this option. + DSPAM should never be running in production with debug active unless you are + troubleshooting problems. + +

+
Debug Options + name="dopt" id="dopt" value="" /> + One or more of: process, classify, spam, fp, inoculation, corpus +

+ +

+process     standard message processing
+classify    message classification using --classify
+spam        error correction of missed spam
+fp          error correction of false positives
+inoculation message inoculations (source=inoculation)
+corpus      corpusfed messages (source=corpus)
+                        
+ +

+
  + + " onclick="document.iform.sectionid.value = 'dbg';" /> +
 
 DSPAM Engine Settings
Training Mode + + + The default training mode to use for all operations, when one has not been + specified on the commandline or in the user's preferences. + +

+ + Acceptable values are: toe, tum, teft, notrain + +

+
Test Conditional Training + /> + + By default, dspam will retrain certain errors + until the condition is no longer met. + +

+ + Note: This usually accelerates learning. Some people argue that this can increase + the risk of errors, however. + +

+
Features + + Specify features to activate by default; can also be specified + on the commandline. See the documentation for a list of available features. + If _any_ features are specified on the commandline, these are ignored. + +

+ + Note: For standard "CRM114" Markovian weighting, use sbph + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
Algorithms + + Specify the statistical algorithms to use, overriding any + defaults configured in the build. + +

+ + The options are: +

+naive       Naive-Bayesian (All Tokens)
+graham      Graham-Bayesian ("A Plan for Spam")
+burton      Burton-Bayesian (SpamProbe)
+robinson    Robinson's Geometric Mean Test (Obsolete)
+chi-square  Fisher-Robinson's Chi-Square Algorithm
+                        
+ +

+

+ + You may have multiple algorithms active simultaneously, but it is strongly + recommended that you group Bayesian algorithms with other Bayesian + algorithms, and any use of Chi-Square remain exclusive. +

+

+ + NOTE: For standard "CRM114" Markovian weighting, use ‘naive’, or consider + using ‘burton’ for slightly better accuracy. + +

+

+ + Don't mess with this unless you know what you're doing + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
PValue + + + Specify the technique used for calculating PValues, overriding any defaults + configured in the build. + +

+ + These options are: +

+graham      Graham's Technique ("A Plan for Spam")
+robinson    Robinson's Technique
+markov      Markovian Weighted Technique
+                        
+ +

+

+ + Unlike algorithms, you may only have one of these defined. Use of the + chi-square algorithm automatically changes this to robinson. + +

+

+ + Don't mess with this unless you know what you're doing. + +

+
Improbability Drive + /> + + Calculate odds-ratios for ham/spam, and add to X-DSPAM-Improbability headers + +
Preferences + + Specify any preferences to set by default, unless otherwise + overridden by the user (see next section) or a default.prefs file. + +

+ + Note: If user or default.prefs are found, the user's + preferences will override any defaults. + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
Overrides + + Specifies the user preferences which may override + configuration and commandline defaults. + +

+ + Note: Any other preferences supplied by an untrusted user will be ignored. + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
  + + " onclick="document.iform.sectionid.value = 'eng';" /> +
 
 LDAP Settings + onClick="enable_change(false, 1);" /> + Enable +
LDAP Mode + + + Perform various LDAP functions depending on LDAPMode variable. + +

+ + Note: Presently, the only mode supported is 'verify', which will verify the + existence of an unknown user in LDAP prior to creating them as a new user in + the system. This is useful on some systems acting as gateway machines. + +

+
LDAP Host + name="ldaphost" id="ldaphost" value="" /> + + Hostname of the LDAP directory server. + +
LDAP Filter + name="ldapfilter" id="ldapfilter" value="" /> + + A specific query filter, that should be used while querying the LDAP server. + +
LDAP Base + name="ldapbase" id="ldapbase" value="" /> + + A particular distinguish name from where to start LDAP queries. + +
  + + " onclick="document.iform.sectionid.value = 'ldap';" /> +
 
 Miscellaneous Settings
Failover Attempts + name="foatt" id="foatt" value="" /> + + A particular number of attempts. + +

+ + If the storage fails, the agent will follow each profile's failover up to + a maximum number of failover attempts. This should be set to a maximum of + the number of profiles you have, otherwise the agent could loop and try + the same profile multiple times (unless this is your desired behavior). + +

+
Ignore Headers +

+ + If DSPAM is behind other tools which may add a header to + incoming emails, it may be beneficial to ignore these headers - especially + if they are coming from another spam filter. If you are _not_ using one of + these tools, however, leaving the appropriate headers commented out will + allow DSPAM to use them as telltale signs of forged email. + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
SBL Lookup +

+ onClick="enable_change(false, 2);" /> + + Enable checks against a particular SBL host. + +

+

+ name="sblhost" id="sblhost" value="" /> + + A particular SBL hostname. + +

+

+ + Perform lookups on streamlined blackhole list servers (see + http://www.nuclearelephant.com/projects/sbl/). + The streamlined blacklist + server is machine-automated, unsupervised blacklisting system designed to + provide real-time and highly accurate blacklisting based on network spread. + When performing a lookup, DSPAM will automatically learn the inbound message + as spam if the source IP is listed. Until an official public RABL server is + available, this feature is only useful if you are running your own + streamlined blackhole list server for internal reporting among multiple mail + servers. Provide the name of the lookup zone below to use. + +

+

+ + This function performs standard reverse-octet.domain lookups, and while it + will function with many RBLs, it's strongly discouraged to use those + maintained by humans as they're often inaccurate and could hurt filter + learning and accuracy. + +

+
RBL Inoculate + /> + + Enable RBL inoculation support. + +
Enable Notification + onClick="enable_change(false, 2);" /> + + Enable the sending of notification emails to users (first message, quarantine full, etc.) + +
DSPAM Support Contact + name="dspamcontact" id="dspamcontact" value="" /> + + The username of the person who provides DSPAM support for this DSPAM installation + +  (This is the left most part of an email address before the @ sign). +
Email Domain Name + onClick="toggleDSPAMDomain(false, this);" /> + + Use global domain settings while trying to send an email message. + +
  + + " onclick="document.iform.sectionid.value = 'misc';" /> +
 
 Maintainance Settings
  +

+ + Set dspam_clean purge default options, if not + otherwise specified on the commandline. You may set some of + the below values to off, for instance if you are + using a SQL-based database backend for DSPAM. Please consult your + DSPAM manual for any details. + +

+
Purge Signatures + name="psig" id="psig" value="" /> + + Purge stale signatures + +
Purge Neutral + name="pneut" id="pneut" value="" /> + + Purge tokens with neutralish probabilities + +
Purge Unused + name="punu" id="punu" value="" /> + + Purge unused tokens + +
Purge Hapaxes + name="phapa" id="phapa" value="" /> + + Purge tokens with less than 5 hits (hapaxes) + +
Purge Hits 1S + name="pones" id="pones" value="" /> + + Purge tokens with only 1 spam hit + +
Purge Hits 1I + name="ponei" id="ponei" value="" /> + + Purge tokens with only 1 innocent hit + +
  + + " onclick="document.iform.sectionid.value = 'main';" /> +
 
 System Settings
Local MX + name="locmx" id="locmx" value="" /> + + Local Mail Exchangers: Used for source address tracking, tells DSPAM which + mail exchangers are local and therefore should be ignored in the Received: + header when tracking the source of an email. Note: you should use the address + of the host as appears between brackets [ ] in the Received header. + +
  + + Disabling logging for users will make usage graphs unavailable to + them. Disabling system logging will make admin graphs unavailable. + +
Enable System Log + /> + + Enable system logging. + +
Enable User Log + /> + + Enable user logging. + +
Opt Settings + +

+ + Opt: in or out; determines DSPAM's default filtering behavior. If this value + is set to in, users must opt-in to filtering by dropping a .dspam file in + /var/dspam/opt-in/user.dspam (or if you have homedirs configured, a .dspam + folder in their home directory). The default is opt-out, which means all + users will be filtered unless a .nodspam file is dropped in + /var/dspam/opt-out/user.nodspam + +

+
  + + In lieu of setting up individual aliases for each user, + DSPAM can be configured to automatically parse the To: address for spam and + false positive forwards. From there, it can be configured to either set the + DSPAM user based on the username specified in the header and/or change the + training class and source accordingly. The options below can be used to + customize most common types of header parsing behavior to avoid the need for + multiple aliases, or if using LMTP, aliases entirely.. + +
Parse To Headers + /> + + Parse the To: headers of an incoming message. + +

+ + This must be set to ‘on’ to use either of the following features. + +

+
Change Mode On Parse + /> + + Automatically change the class (to spam or innocent). + +

+ + This depends on whether spam- or notspam- was specified, and change + the source to ‘error’. This is convenient if you're not + using aliases at all, but are delivering via LMTP. + +

+
Change User On Parse + /> + + Automatically change the username to match that specified in the To: header. + +

+ + For example, spam-bob@domain.tld will set the username + to bob, ignoring any --user passed in. This may not always be desirable if + you are using virtual email addresses as usernames. Options: + on or user take the portion before the @ sign only + full take everything after the initial {spam,notspam}-. + +

+
Broken MTA Settings + /> + + Enable broken MTA settings. + +

+ + Broken MTA Options: Some MTAs don't support the proper functionality + necessary. In these cases you can activate certain features in DSPAM to + compensate. ‘returnCodes’ causes DSPAM to return an exit code of 99 if + the message is spam, 0 if not, or a negative code if an error has occured. + Specifying ‘case’ causes DSPAM to force the input usernames to lowercase. + Spceifying ‘lineStripping’ causes DSPAM to strip ˆM's from messages passed + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
Max Message Size + name="maxmsgs" id="maxmsgs" value="" /> + + You may specify a maximum message size for DSPAM to process. + +

+ + If the message is larger than the maximum size, it will be delivered + without processing. Value is in bytes. + +

+
Processor Bias + /> + + Bias causes the filter to lean more toward ‘innocent’, and + usually greatly reduces false positives. It is the default behavior of + most Bayesian filters (including dspam). + +

+ + Note: You probably DONT want this if you're using Markovian Weighting, + unless you are paranoid about false positives. + +

+
  + + " onclick="document.iform.sectionid.value = 'sys';" /> +
 
 ClamAV Engine Settings + onClick="enable_change(false, 3);" /> + Enable +
  +

+ + If you are running clamd, DSPAM can perform stream-based + virus checking using TCP. Uncomment the values below to enable virus + checking. + +

+

+ + ClamAVResponse: +

+
reject
+
(reject or drop the message with a permanent failure)
+
accept
+
(accept the message and quietly drop the message)
+
spam
+
(treat as spam and quarantine/tag/whatever)
+
+ +

+
ClamAV Port +

+ name="clamport" id="clamport" value="" /> + + A number that specifies the port the ClamAV daemon is listening to. + +

+

+ + If the message is larger than the maximum size, it will be delivered + without processing. Value is in bytes. + +

+
ClamAV Host + name="clamhost" id="clamhost" value="" /> + + An IP address that points to the host the ClamAV daemon is running on. + +
ClamAV Response + + + The action that should take place, if ClamAV reports a positive. + +
  + + " onclick="document.iform.sectionid.value = 'clam';" /> +
 
 DSPAM Daemon Settings (Server)
  + + If you are running DSPAM as a daemonized server using + --daemon, the following parameters will override the default. Use the + ServerPass option to set up accounts for each client machine. The DSPAM + server will process and deliver the message based on the parameters + specified. If you want the client machine to perform delivery, use + the --stdout option in conjunction with a local setup. + +
Server Port +

+ name="dsport" id="dsport" value="" /> + + A number that specifies the port the DSPAM daemon is listening to. + +

+
Server Queue Size +

+ name="dsqsize" id="dsqsize" value="" /> + + A number that specifies the server's queue size. + +

+
Server PID +

+ name="dspid" id="dspid" value="" /> + + Keep this is sync with /usr/local/etc/rc.d/dspam.rc script. + +

+

+ + Note: Don't change this value unless you know what you are doing. + +

+
Server Mode +

+ + + Specifies the type of LMTP server to start. + +

+ + This can be one of: +

+
dspam
+
DSPAM-proprietary DLMTP server, for communicating with dspamc
+
standard
+
Standard LMTP server, for communicating with Postfix or other MTA
+
auto
+
Speak both DLMTP and LMTP; auto-detect by ServerPass.IDENT
+
+ +

+

+
  +

+ + If supporting DLMTP (dspam) mode, dspam clients will require authentication + as they will be passing in parameters. The idents below will be used to + determine which clients will be speaking DLMTP, so if you will be using + both LMTP and DLMTP from the same host, be sure to use something other + than the server's hostname below (which will be sent by the MTA during a + standard LMTP LHLO). + +

+ + + + + + + + + ""): ?> + + + + + + + + + + + + + + +
+ + +   + + + + + + +
')">
+
+ + + + +
+
+
+

+ + If supporting standard LMTP mode, server parameters will need to be specified + here, as they will not be passed in by the mail server. The ServerIdent + specifies the 250 response code ident sent back to connecting clients and + should be set to the hostname of your server, or an alias. + +

+

+ + Note: If you specify --user in ServerParameters, the RCPT TO will be used + only for delivery, and not set as the active user for processing. + +

+
Server Parameters +

+ + + Parameters which will be passed to the LMTP server. + +

+
Server Ident +

+ name="serverid" id="serverid" value="" /> + + An identification string which will be used to be passed to the LMTP server. + +

+
Server Domain Socket Path +

+ name="serversock" id="serversock" value="" /> + + A local Unix domain socket. + +

+

+ + If you wish to use a local domain socket instead of a TCP socket, uncomment + the following. It is strongly recommended you use local domain sockets if + you are running the client and server on the same machine, as it eliminates + much of the bandwidth overhead. + +

+

+ + Keep this is sync with /usr/local/etc/rd.d/dspam.rc script + +

+
  + + " onclick="document.iform.sectionid.value = 'srv';" /> +
 
 DSPAM Daemon Settings (Client) + onClick="enable_change(false, 4);" /> + Enable +
  +

+ + If you are running DSPAM in client/server mode, uncomment and + set these variables. A ClientHost beginning with a / + will be treated as a domain socket. + +

Client Host +

+ name="dsclhost" id="dsclhost" value="" /> + + A IP address or a Unix domain socket. + +

+
Client Port +

+ name="dsclport" id="dsclport" value="" /> + + Will be only used if this client uses TCP/IP communication. + +

+
Client Ident +

+ name="dsclident" id="dsclident" value="" /> + + A string that will be used to identify the client against a server. + +

+
  + + " onclick="document.iform.sectionid.value = 'cli';" /> +
+
+
+
+
+
+ + +getHTML(); +?> + + + + + + + + +
Access denied for:
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-train.php b/packages/dspam/www/dspam-train.php new file mode 100644 index 00000000..22c2e8ba --- /dev/null +++ b/packages/dspam/www/dspam-train.php @@ -0,0 +1,284 @@ + + + +EOD; + + $pfSenseHead->addScript($jscriptstr); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
Archive Type + + +  Mailbox format (like it is used for example by Mozilla Thunderbird) +
+ + +  Maildir format (like it was initially introduced by qmail) +

+ + : + +
+ +
+

+
Compression Type + +  Archive was compressed using a ZIP algorithm. +
+ +  Archive was compressed using a GNU ZIP algorithm. +
+ +  Archive was compressed using a bzip2 algorithm +
+
Message Type + +  Archive to be uploaded contains Spam messages. +
+ +  Archive to be uploaded contains Ham messages. +
+
  +

+ +

+

+ +

+

+ " /> +

+

+ + : + +
+ +
+

+
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam-viewmsg.php b/packages/dspam/www/dspam-viewmsg.php new file mode 100644 index 00000000..13c55477 --- /dev/null +++ b/packages/dspam/www/dspam-viewmsg.php @@ -0,0 +1,158 @@ + + + +EOD; + + $pfSenseHead->addScript($jscriptstr); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + + + + + + +

+ + The contents of the message in the quarantine is shown below. + +

+ + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
+ + +
 
Mail Message
+ +
Mail Message
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/dspam.php b/packages/dspam/www/dspam.php new file mode 100644 index 00000000..488bed1b --- /dev/null +++ b/packages/dspam/www/dspam.php @@ -0,0 +1,264 @@ + + + +EOD; + + $pfSenseHead->addScript($jscriptstr); +echo $pfSenseHead->getHTML(); + +?> + + + +
+ + + + + + + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Statistical SPAM Protection for...
Username + + /> + + + +   + + /> +
 
DSPAM Version
DSPAM Copyright
DSPAM Copyright Text
DSPAM Website + +
DSPAM Configure Args + +
 
License User
Company
License Key
License Validity + + +  Renew License + +
Purchase Date
Expiry Date
Ni-ONE Website + http://www.niefert.net/nione.php +
Support Request + Issue a support request +
Ni-ONE Customer Forum + Visit Ni-ONE Customer Forum +
License File (nione.lic) + +
License Checksum (nione.lic.sha1) + +
License Disclaimer +

+ The Ni-ONE appliance solution is based on open source software. Hence you + are allowed to use the corresponding software components (i.e. DSPAM and + its dependencies) under the terms of the accompanying open source license. +

+

+ The Ni-ONE license provides 1st class priority support for a period + of one year starting from the day you did purchase a valide license option. If the + license is marked as expired, you may consider to purchase a renewal license + option using the renew license button that will be provided by the web + interface in such circumstances. +

+
  + " /> +

+ + : + +
+ +
+

+
+
+
+
+ + + + \ No newline at end of file diff --git a/packages/dspam/www/p3scan_rules.php b/packages/dspam/www/p3scan_rules.php new file mode 100644 index 00000000..487cb57d --- /dev/null +++ b/packages/dspam/www/p3scan_rules.php @@ -0,0 +1,12 @@ +/* + p3scan_rules.inc + part of pfSense (www.pfSense.com) + Copyright (C) 2006 Daniel S. Haischt + All rights reserved. + +*/ +$wanif = get_real_wan_interface(); +$anchor = "natearly"; +$natrules .= "rdr pass on {$wanif} proto tcp from to port pop3 -> 127.0.0.1 port 8110\n"; +$label = "p3scan"; +add_rule_to_anchor($anchor, $rule, $label); diff --git a/packages/dspam/www/themes/metallic/dspam.css b/packages/dspam/www/themes/metallic/dspam.css new file mode 100644 index 00000000..5b39ba32 --- /dev/null +++ b/packages/dspam/www/themes/metallic/dspam.css @@ -0,0 +1,115 @@ +.qrowEven { + background-color: #DDDDDD; + padding-right: 20px; + padding-left: 8px; + border-bottom: 1px solid #999999; +} +.qrowOdd { + background-color: #FFFFFF; + padding-right: 20px; + padding-left: 8px; + border-bottom: 1px solid #999999; +} +.qrowAlert { + background-color: yellow; + padding-right: 20px; + padding-left: 8px; + border-bottom: 1px solid #999999; +} +.qrowHighlight { + background-color: white; + font-weight: bold; + padding-right: 20px; + padding-left: 8px; + border-bottom: 1px solid #999999; +} +.qrowDivider { + padding-right: 20px; + padding-left: 8px; + border-left: 1px solid black; + border-bottom: 1px solid #999999; +} + +.innocent {color: limegreen; background-color: green;} +.whitelisted {color: magenta; background-color: purple;} +.spam {color: red; background-color: darkred;} +.false {color: white; font-weight: bold; background-color: green;} +.missed {color: white; font-weight: bold; background-color: darkred;} +.inoculation {color: dodgerblue; background-color: darkblue;} +.corpus {color: black; background-color: white;} +.relay {color: white; background-color: #994400;} +.low {color: darkblue; font-weight: bold;} +.medium {color: steelblue; font-weight: bold;} +.high {color: darkorange; font-weight: bold;} + +.small { font-size: 9px;} +.hollow { border: 0px; } + +.qnavtd { + border: 1px solid #CCCCCC; +} +.qnavtdl { + border-top: 1px solid #CCCCCC; + border-bottom: 1px solid #CCCCCC; + border-left: 1px solid #CCCCCC; +} +.qnavtdr { + border-top: 1px solid #CCCCCC; + border-bottom: 1px solid #CCCCCC; + border-right: 1px solid #CCCCCC; +} +.qnavbtnhl { + font-size: 9px !important; + border-right: 1px solid #FF7F7F; + border-bottom: 1px solid #FF7F7F; + border-left: 1px solid #5F0000; + border-top: 1px solid #5F0000; + padding-left: 3px; + padding-right: 3px; + padding-bottom: 2px; + padding-top: 2px; + background-color: #FF7F7F; +} +.qnavbtn { + font-size: 9px !important; + border-right: 1px solid #FF7F7F; + border-bottom: 1px solid #FF7F7F; + border-left: 1px solid #5F0000; + border-top: 1px solid #5F0000; + padding-left: 3px; + padding-right: 3px; + padding-bottom: 2px; + padding-top: 2px; + background-color: #507DCD; + cursor: pointer; +} +.qnavbtn a:link { + font-size: 9px !important; + font-weight: bold; + color: #FFFFFF; + text-decoration:none; +} +.qnavbtn a:visited { + font-size: 9px !important; + font-weight: bold; + color: #FFFFFF; + text-decoration:none; +} +.qnavbtn a:focus { + font-size: 9px !important; + font-weight: bold; + color: #FFFFFF; + text-decoration:underline; +} +.qnavbtn a:hover { + font-size: 9px !important; + font-weight: bold; + color: #FFFFFF; + text-decoration:none; +} +.qnavbtn a:active { + font-size: 9px !important; + font-weight: bold; + color: #FFFFFF; + text-decoration:underline; +} \ No newline at end of file diff --git a/packages/dspam/www/wizards/dspam-lda-proxy.png b/packages/dspam/www/wizards/dspam-lda-proxy.png new file mode 100644 index 00000000..7a4565ec Binary files /dev/null and b/packages/dspam/www/wizards/dspam-lda-proxy.png differ diff --git a/packages/dspam/www/wizards/dspam-pop-proxy.png b/packages/dspam/www/wizards/dspam-pop-proxy.png new file mode 100644 index 00000000..fa373385 Binary files /dev/null and b/packages/dspam/www/wizards/dspam-pop-proxy.png differ diff --git a/packages/dspam/www/wizards/dspam-smtp-relay.png b/packages/dspam/www/wizards/dspam-smtp-relay.png new file mode 100644 index 00000000..07f554c8 Binary files /dev/null and b/packages/dspam/www/wizards/dspam-smtp-relay.png differ diff --git a/packages/dspam/www/wizards/dspam_wizard.xml b/packages/dspam/www/wizards/dspam_wizard.xml new file mode 100644 index 00000000..659eaff1 --- /dev/null +++ b/packages/dspam/www/wizards/dspam_wizard.xml @@ -0,0 +1,1830 @@ + + + + +/* + dspam_wizard.xml + part of pfSense (http://www.pfsense.org/) + + Copyright (C) 2006 Daniel S. Haischt + All rights reserved. +*/ + +15 +Services: DSPAM: DSPAM Wizard + + 1 + dspam.inc + DSPAM Setup Wizard + true + This wizard will guide you through the initial configuration of the DSPAM filter. + + + Next + submit + + + + + 2 + dspam.inc + DSPAM Profile Selection + true + DSPAM can be used in different network environment. Hence we are providing three distinct profiles to suit different DSPAM use cases. Please select a particular profile from the below profile selection. + + + dspamprofile + radio + installedpackages->dspam->config->0->dspam-profile + + <center> + <p> +When your mail server gets ready to deliver mail to a user's mailbox it calls +a delivery agent of some sort. On most UNIX systems, this is procmail, maildrop, +mail.local, or a similar tool. When used as a delivery proxy, the DSPAM agent +is called in place of your existing agent - or better put, it can masquerade +as the local delivery agent. DSPAM then processes the message and will call +the /real/ delivery agent to pass the good mail into the user's mailbox, +quarantining the bad mail. DSPAM can optionally tag and deliver both spam +and legitimate mail. + </p> + <p> +In the diagram below, MTA refers to Mail Transfer Agent, or your mail server +software: Postfix, Sendmail, Exim, etc. LDA refers to the Local Delivery +Agent: Procmail, Maildrop, etc.. + </p> + </center> + + lda + + <center><img src="/wizards/dspam-lda-proxy.png" alt="DSPAM acts as a LDA proxy" border="0" /></center> + + + dspamprofile + radio + installedpackages->dspam->config->0->dspam-profile + + <center> +If you don't want to tinker with your existing mail server setup, DSPAM can +be combined with one of a few open source programs designed to act as a POP3 +proxy. This means spam is filtered whenever the user checks their mail, +rather than when it is delivered. The benefit to this is that you can set up +a small machine on your network that will connect to your existing mail server, +so no integration is needed. It also allows your users to arbitarily point their +mail client at it if they desire filtering. The drawback to this approach is +that the POP3 protocol has no way to tell the mail client that a message is +spam, and so the user will have to download the spam (tagged, of course). + </center> + + pop + + <center><img src="/wizards/dspam-pop-proxy.png" alt="DSPAM will be invoked by a POP3 proxy" border="0" /></center> + + + dspamprofile + radio + installedpackages->dspam->config->0->dspam-profile + + <center> +Newer versions of DSPAM have seen features that allow it to function more +easily as an SMTP relay. An SMTP relay sits in front of your existing mail +server (requiring no integration). To use an SMTP relay, the MX records for +your domains are repointed to the relay machine running DSPAM. DSPAM then +relays the good (and optionally bad) mail to the existing SMTP server. This +allows you to use DSPAM with even a Windows-based destination mail server +as no integration is necessary. See doc/relay.txt for one example of how to +do this with Postfix. + </center> + + smtp + + <center><img src="/wizards/dspam-smtp-relay.png" alt="DSPAM acts as a SMTP realy" border="0" /></center> + + + Next + submit + + + + if($_POST['dspamprofile'] != "") { + + /* set default trusted users */ + $config['installedpackages']['dspam']['config'][0]['tuser'][0]['name'] = "root"; + $config['installedpackages']['dspam']['config'][0]['tuser'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['tuser'][1]['name'] = "mail"; + $config['installedpackages']['dspam']['config'][0]['tuser'][1]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['tuser'][2]['name'] = "mailnull"; + $config['installedpackages']['dspam']['config'][0]['tuser'][2]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['tuser'][3]['name'] = "smmsp"; + $config['installedpackages']['dspam']['config'][0]['tuser'][3]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['tuser'][4]['name'] = "daemon"; + $config['installedpackages']['dspam']['config'][0]['tuser'][4]['descr'] = "desc"; + /* set default features */ + $config['installedpackages']['dspam']['config'][0]['feature'][0]['name'] = "chained"; + $config['installedpackages']['dspam']['config'][0]['feature'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['feature'][1]['name'] = "whitelist"; + $config['installedpackages']['dspam']['config'][0]['feature'][1]['descr'] = "desc"; + /* set default algorithms */ + $config['installedpackages']['dspam']['config'][0]['algorithm'][0]['name'] = "graham"; + $config['installedpackages']['dspam']['config'][0]['algorithm'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['algorithm'][1]['name'] = "burton"; + $config['installedpackages']['dspam']['config'][0]['algorithm'][1]['descr'] = "desc"; + /* set default prefs */ + $config['installedpackages']['dspam']['config'][0]['preference'][0]['value'] = "\"spamAction=quarantine\""; + $config['installedpackages']['dspam']['config'][0]['preference'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['preference'][1]['value'] = "\"signatureLocation=message\""; + $config['installedpackages']['dspam']['config'][0]['preference'][1]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['preference'][2]['value'] = "\"showFactors=on\""; + $config['installedpackages']['dspam']['config'][0]['preference'][2]['descr'] = "desc"; + /* set default overrides */ + $config['installedpackages']['dspam']['config'][0]['override'][0]['value'] = "trainingMode"; + $config['installedpackages']['dspam']['config'][0]['override'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][1]['value'] = "spamAction spamSubject"; + $config['installedpackages']['dspam']['config'][0]['override'][1]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][2]['value'] = "statisticalSedation"; + $config['installedpackages']['dspam']['config'][0]['override'][2]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][3]['value'] = "enableBNR"; + $config['installedpackages']['dspam']['config'][0]['override'][3]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][4]['value'] = "enableWhitelist"; + $config['installedpackages']['dspam']['config'][0]['override'][4]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][5]['value'] = "signatureLocation"; + $config['installedpackages']['dspam']['config'][0]['override'][5]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][6]['value'] = "showFactors"; + $config['installedpackages']['dspam']['config'][0]['override'][6]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][7]['value'] = "optIn optOut"; + $config['installedpackages']['dspam']['config'][0]['override'][7]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['override'][8]['value'] = "whitelistThreshold"; + $config['installedpackages']['dspam']['config'][0]['override'][8]['descr'] = "desc"; + + if($_POST['dspamprofile'] == "lda" || $_POST['dspamprofile'] == "pop") { + $config['installedpackages']['dspam']['config'][0]['tdelivery-agent'] = "mail"; + /* TCP/IP based deliver is not needed */ + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-host']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-port']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-ident']); + unset($config['installedpackages']['dspam']['config'][0]['tcpip-delivery-proto']); + $config['installedpackages']['dspam']['config'][0]['delivery-onfail'] = "error"; + + /* We will asume that the user is going to use the dspam and not the dspamc + * binary. Hence we are unsetting server/client settings. + */ + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-port']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-queue-size']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-pid']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-mode']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-params']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-id']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-server-socket']); + /* Client */ + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-enable']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-host']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-port']); + unset($config['installedpackages']['dspam']['config'][0]['dspam-client-id']); + } else if($_POST['dspamprofile'] == "smtp") { + /* TCP/IP based deliver is not needed */ + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery'] = "on"; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-host'] = "127.0.0.1"; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-port'] = "25"; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-ident'] = "localhost"; + $config['installedpackages']['dspam']['config'][0]['tcpip-delivery-proto'] = "smtp"; + $config['installedpackages']['dspam']['config'][0]['delivery-onfail'] = "error"; + + /* We will asume that the user is going to use the dspam and not the dspamc + * binary. Hence we are unsetting server/client settings. + */ + $config['installedpackages']['dspam']['config'][0]['dspam-server-port'] = "24"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-queue-size'] = "32"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-pid'] = "/var/run/dspam/dspam.pid"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-mode'] = "standard"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-params'] = "--deliver=innocent -d %u"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-id'] = "localhost"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-socket'] = "/var/run/dspam/dspam.sock"; + /* server passwords */ + $config['installedpackages']['dspam']['config'][0]['server-pwd'][0]['value'] = "secret"; + $config['installedpackages']['dspam']['config'][0]['server-pwd'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['server-pwd'][1]['value'] = "password"; + $config['installedpackages']['dspam']['config'][0]['server-pwd'][1]['descr'] = "desc"; + /* Client */ + $config['installedpackages']['dspam']['config'][0]['dspam-client-enable'] = "on"; + $config['installedpackages']['dspam']['config'][0]['dspam-client-host'] = "/tmp/dspam.sock"; + $config['installedpackages']['dspam']['config'][0]['dspam-client-port'] = "24"; + $config['installedpackages']['dspam']['config'][0]['dspam-client-id'] = "secret@Relay1"; + } + + write_config(); + } + + + + 3 + dspam.inc + Database Settings + + On this screen you will set the storage driver type that will be used to store + DSPAM tokens. After having completed this wizard you have to configure the + database that you did select herein. + + + + storagedriver + select + installedpackages->dspam->config->0->storage-driver + Specifies the storage driver backend (library) to use. + mysql + toggleDBSettings(); + 1 + + + + + + + + + + + msqlserver + input + installedpackages->dspam->config->0->dbsettings->0->mysql-server + Either a reference to a Unix domain socket or a reference to a specific host. + /tmp/mysql.sock + ^[a-z0-9.|/]+$ + Server name field is invalid + + + + msqlport + input + installedpackages->dspam->config->0->dbsettings->0->mysql-port + Use this variable if you are going to a MySQL server instance using TCP/IP instead of a socket connection. + 3306 + ^[0-9]+$ + Port field is invalid + + + + msqluser + input + installedpackages->dspam->config->0->dbsettings->0->mysql-user + Username, that will be used to connect to a MySQL server instance. + dspam + + + + msqlpwd + input + installedpackages->dspam->config->0->dbsettings->0->mysql-password + Password, that will be used to connect to a MySQL server instance. + dspam + + + + msqldb + input + installedpackages->dspam->config->0->dbsettings->0->mysql-database + Database name, that contains DSPAM data. + dspam + + + + msqlcomp + checkbox + installedpackages->dspam->config->0->dbsettings->0->mysql-compress + Indicates whether communication data between DSPAM and MySQL should be compressed. + on + + + msqlsuqt + checkbox + installedpackages->dspam->config->0->dbsettings->0->mysql-squote + Use this if you have the 4.1 quote bug (see doc/mysql.txt). + + + msqlccache + input + installedpackages->dspam->config->0->dbsettings->0->mysql-ccache + Conection cache default set to 10. + 10 + ^[0-9]+$ + Connection cache field is invalid + + + + msqluid + checkbox + installedpackages->dspam->config->0->dbsettings->0->mysql-uid + Insert user id into the DSPAM signature. + on + + + slitepr + input + installedpackages->dspam->config->0->dbsettings->0->sqlite-pragma + A particular SQLite pragma command to be used. + + + pgserver + input + installedpackages->dspam->config->0->dbsettings->0->pgsql-server + A reference to a specific host that is running a PostgreSQL instance. + 127.0.0.1 + ^[a-z0-9.|-]+$ + Server name field is invalid + + + + pgport + input + installedpackages->dspam->config->0->dbsettings->0->pgsql-port + A number that represents the port a specific PostgreSQL instance is listening to. + 5432 + ^[0-9]+$ + Port field is invalid + + + + pguser + input + installedpackages->dspam->config->0->dbsettings->0->pgsql-user + Username, that will be used to connect to a PostgreSQL server instance. + dspam + + + + pgpwd + input + installedpackages->dspam->config->0->dbsettings->0->pgsql-password + Password, that will be used to connect to a PostgreSQL server instance. + dspam + + + + pgdb + input + installedpackages->dspam->config->0->dbsettings->0->pgsql-database + Database name, that contains DSPAM data. + dspam + + + + pgccache + input + installedpackages->dspam->config->0->dbsettings->0->pgsql-ccache + Conection cache default set to 3. + 3 + ^[0-9]+$ + Connection cache field is invalid + + + + pguid + checkbox + installedpackages->dspam->config->0->dbsettings->0->pgsql-uid + Insert user id into the DSPAM signature. + on + + + oraserver + input + installedpackages->dspam->config->0->dbsettings->0->ora-server + A reference to a specific host that is running an Oracle database instance. + 50 + "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SID=PROD)))" + + + + orauser + input + installedpackages->dspam->config->0->dbsettings->0->ora-user + Username, that will be used to connect to a Oracle database server instance. + dspam + + + + orapwd + input + installedpackages->dspam->config->0->dbsettings->0->ora-password + Password, that will be used to connect to a Oracle database server instance. + dspam + + + + orasch + input + installedpackages->dspam->config->0->dbsettings->0->ora-schema + Schema name, that contains DSPAM data. + dspam + + + + hsrmax + input + installedpackages->dspam->config->0->dbsettings->0->hash-rec-max + Default number of records to create in the initial segment when building hash files. + 98317 + ^[0-9]+$ + Default number of record field is invalid + + + + hsatex + checkbox + installedpackages->dspam->config->0->dbsettings->0->hash-auto-ex + Autoextend hash databases when they fill up. This allows them to continue to train by adding extents (extensions) to the file. + on + + + + hsmxex + input + installedpackages->dspam->config->0->dbsettings->0->hash-max-ext + The maximum number of extents that may be created in a single hash file. + 0 + ^[0-9]+$ + Default number of record field is invalid + + + + hsexsz + input + installedpackages->dspam->config->0->dbsettings->0->hash-ext-size + The record size for newly created extents. + 49157 + ^[0-9]+$ + Default number of record field is invalid + + + + hsmxse + input + installedpackages->dspam->config->0->dbsettings->0->hash-max-seek + The maximum number of records to seek to insert a new record before failing or adding a new extent. + 100 + ^[0-9]+$ + Default number of record field is invalid + + + + hsccus + input + installedpackages->dspam->config->0->dbsettings->0->hash-co-user + If you are using a single, stateful hash database in daemon mode, specifying a concurrent user will cause the user to be permanently mapped into memory and shared via rwlocks. + user + + + + hscoca + input + installedpackages->dspam->config->0->dbsettings->0->hash-co-cache + If running in daemon mode, this is the max # of concurrent connections that will be supported. + 10 + ^[0-9]+$ + Default number of record field is invalid + + + + Next + submit + + + + if ($_POST['storagedriver'] == "mysql") { + /* ============================================================================================= */ + /* == SQLite == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['sqlite-pragma']); + /* ============================================================================================= */ + /* == PostgreSQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-uid']); + /* ============================================================================================= */ + /* == Oracle == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-schema']); + /* ============================================================================================= */ + /* == Hash == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-rec-max']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-auto-ex']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-ext']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-ext-size']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-seek']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-cache']); + } else if ($_POST['storagedriver'] == "sqlite") { + /* ============================================================================================= */ + /* == MySQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-compress']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-squote']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-uid']); + /* ============================================================================================= */ + /* == PostgreSQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-uid']); + /* ============================================================================================= */ + /* == Oracle == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-schema']); + /* ============================================================================================= */ + /* == Hash == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-rec-max']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-auto-ex']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-ext']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-ext-size']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-seek']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-cache']); + } else if ($_POST['storagedriver'] == "bdb") { + /* NOP */ + } else if ($_POST['storagedriver'] == "pgsql") { + /* ============================================================================================= */ + /* == MySQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-compress']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-squote']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-uid']); + /* ============================================================================================= */ + /* == SQLite == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['sqlite-pragma']); + /* ============================================================================================= */ + /* == Oracle == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-schema']); + /* ============================================================================================= */ + /* == Hash == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-rec-max']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-auto-ex']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-ext']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-ext-size']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-seek']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-cache']); + } else if ($_POST['storagedriver'] == "oracle") { + /* ============================================================================================= */ + /* == MySQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-compress']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-squote']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-uid']); + /* ============================================================================================= */ + /* == SQLite == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['sqlite-pragma']); + /* ============================================================================================= */ + /* == PostgreSQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-uid']); + /* ============================================================================================= */ + /* == Hash == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-rec-max']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-auto-ex']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-ext']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-ext-size']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-max-seek']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['hash-co-cache']); + } else if ($_POST['storagedriver'] == "hash") { + /* ============================================================================================= */ + /* == MySQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-compress']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-squote']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['mysql-uid']); + /* ============================================================================================= */ + /* == SQLite == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['sqlite-pragma']); + /* ============================================================================================= */ + /* == PostgreSQL == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-port']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-database']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-ccache']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['pgsql-uid']); + /* ============================================================================================= */ + /* == Oracle == */ + /* ============================================================================================= */ + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-server']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-user']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-password']); + unset($config['installedpackages']['dspam']['config'][0]['dbsettings'][0]['ora-schema']); + } + + + function toggleDBSettings(idx) { + if (idx) + idx = idx; + else + idx = document.iform.storagedriver.selectedIndex; + + switch (idx) { + case 0: /* mysql */ + /* mysql specifics */ + trNode = document.iform.msqlserver.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqlport.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqluser.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqlpwd.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqldb.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqlcomp.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqlsuqt.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqlccache.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.msqluid.parentNode.parentNode; + trNode.style.display = "table-row"; + /* sqlite specifics */ + trNode = document.iform.slitepr.parentNode.parentNode; + trNode.style.display = "none"; + /* pgsql specifics */ + trNode = document.iform.pgserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgdb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguid.parentNode.parentNode; + trNode.style.display = "none"; + /* oracle specifics */ + trNode = document.iform.oraserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orauser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orapwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orasch.parentNode.parentNode; + trNode.style.display = "none"; + /* hash specifics */ + trNode = document.iform.hsrmax.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsatex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsexsz.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxse.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsccus.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hscoca.parentNode.parentNode; + trNode.style.display = "none"; + break; + case 1: /* sqlite */ + /* mysql specifics */ + trNode = document.iform.msqlserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqldb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlcomp.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlsuqt.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluid.parentNode.parentNode; + trNode.style.display = "none"; + /* sqlite specifics */ + trNode = document.iform.slitepr.parentNode.parentNode; + trNode.style.display = "table-row"; + /* pgsql specifics */ + trNode = document.iform.pgserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgdb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguid.parentNode.parentNode; + trNode.style.display = "none"; + /* oracle specifics */ + trNode = document.iform.oraserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orauser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orapwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orasch.parentNode.parentNode; + trNode.style.display = "none"; + /* hash specifics */ + trNode = document.iform.hsrmax.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsatex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsexsz.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxse.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsccus.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hscoca.parentNode.parentNode; + trNode.style.display = "none"; + break; + case 2: /* bdb */ + /* mysql specifics */ + trNode = document.iform.msqlserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqldb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlcomp.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlsuqt.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluid.parentNode.parentNode; + trNode.style.display = "none"; + /* sqlite specifics */ + trNode = document.iform.slitepr.parentNode.parentNode; + trNode.style.display = "none"; + /* pgsql specifics */ + trNode = document.iform.pgserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgdb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguid.parentNode.parentNode; + trNode.style.display = "none"; + /* oracle specifics */ + trNode = document.iform.oraserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orauser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orapwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orasch.parentNode.parentNode; + trNode.style.display = "none"; + /* hash specifics */ + trNode = document.iform.hsrmax.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsatex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsexsz.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxse.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsccus.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hscoca.parentNode.parentNode; + trNode.style.display = "none"; + break; + case 3: /* pgsql */ + /* mysql specifics */ + trNode = document.iform.msqlserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqldb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlcomp.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlsuqt.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluid.parentNode.parentNode; + trNode.style.display = "none"; + /* sqlite specifics */ + trNode = document.iform.slitepr.parentNode.parentNode; + trNode.style.display = "none"; + /* pgsql specifics */ + trNode = document.iform.pgserver.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.pgport.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.pguser.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.pgpwd.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.pgdb.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.pgccache.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.pguid.parentNode.parentNode; + trNode.style.display = "table-row"; + /* oracle specifics */ + trNode = document.iform.oraserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orauser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orapwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orasch.parentNode.parentNode; + trNode.style.display = "none"; + /* hash specifics */ + trNode = document.iform.hsrmax.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsatex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsexsz.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxse.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsccus.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hscoca.parentNode.parentNode; + trNode.style.display = "none"; + break; + case 4: /* oracle */ + /* mysql specifics */ + trNode = document.iform.msqlserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqldb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlcomp.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlsuqt.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluid.parentNode.parentNode; + trNode.style.display = "none"; + /* sqlite specifics */ + trNode = document.iform.slitepr.parentNode.parentNode; + trNode.style.display = "none"; + /* pgsql specifics */ + trNode = document.iform.pgserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgdb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguid.parentNode.parentNode; + trNode.style.display = "none"; + /* oracle specifics */ + trNode = document.iform.oraserver.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.orauser.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.orapwd.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.orasch.parentNode.parentNode; + trNode.style.display = "table-row"; + /* hash specifics */ + trNode = document.iform.hsrmax.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsatex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxex.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsexsz.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsmxse.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hsccus.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.hscoca.parentNode.parentNode; + trNode.style.display = "none"; + break; + case 5: /* hash */ + /* mysql specifics */ + trNode = document.iform.msqlserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqldb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlcomp.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlsuqt.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqlccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.msqluid.parentNode.parentNode; + trNode.style.display = "none"; + /* sqlite specifics */ + trNode = document.iform.slitepr.parentNode.parentNode; + trNode.style.display = "none"; + /* pgsql specifics */ + trNode = document.iform.pgserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgport.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgpwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgdb.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pgccache.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.pguid.parentNode.parentNode; + trNode.style.display = "none"; + /* oracle specifics */ + trNode = document.iform.oraserver.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orauser.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orapwd.parentNode.parentNode; + trNode.style.display = "none"; + trNode = document.iform.orasch.parentNode.parentNode; + trNode.style.display = "none"; + /* hash specifics */ + trNode = document.iform.hsrmax.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.hsatex.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.hsmxex.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.hsexsz.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.hsmxse.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.hsccus.parentNode.parentNode; + trNode.style.display = "table-row"; + trNode = document.iform.hscoca.parentNode.parentNode; + trNode.style.display = "table-row"; + break; + } + } + + toggleDBSettings(0); + + + + 4 + dspam.inc + Delivery Settings + + On this page you will specify how DSPAM should deliver email messages to + their final destination. This could be either a local delivery method or + a TCP/IP based delivery method. + + + + dagent + Specifies the local delivery agent DSPAM should call when delivering mail as a trusted user. + select + + + + + + + + + installedpackages->dspam->config->0->tdelivery-agent + + + true + dspamc + Use <code>dspamc</code> instead of <code>dspam</code> to locally deliver mails from the MTA to the user's mailbox (this pulls in DSPAM client/server settings). + checkbox + + + true + tcpipdel + Use TCP/IP based delivery. This option needs to be ticked if you are going to deliver via LMTP or SMTP. + checkbox + installedpackages->dspam->config->0->tcpip-delivery + dhost,dport,dident,delproto + + + dhost + input + false + installedpackages->dspam->config->0->tcpip-delivery-host + Alternatively, you may wish to use SMTP or LMTP delivery to deliver your message to the mail server. + ^[a-z0-9.|-]+$ + Host name field is invalid + + + dport + input + installedpackages->dspam->config->0->tcpip-delivery-port + Port number of a particular host. + ^[0-9]+$ + Port field is invalid + + + dident + input + installedpackages->dspam->config->0->tcpip-delivery-ident + A particular identification string. + + + delproto + A particular protocol typ. Either SMTP or LMTP. + select + + + + + installedpackages->dspam->config->0->tcpip-delivery-proto + + + onfail + What to do if local delivery or quarantine should fail. + select + + + + + installedpackages->dspam->config->0->delivery-onfail + + + Next + submit + + + + if($_POST['dspamc'] != "") { + /* DSPAM server settings */ + $config['installedpackages']['dspam']['config'][0]['dspam-server-port'] = "24"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-queue-size'] = "32"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-pid'] = "/var/run/dspam/dspam.pid"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-mode'] = "auto"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-params'] = "--deliver=innocent -d %u"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-id'] = "abysseleven.abyssworld.de"; + $config['installedpackages']['dspam']['config'][0]['dspam-server-socket'] = "/var/run/dspam/dspam.sock"; + + /* server passwords */ + $config['installedpackages']['dspam']['config'][0]['server-pwd'][0]['value'] = "secret"; + $config['installedpackages']['dspam']['config'][0]['server-pwd'][0]['descr'] = "desc"; + $config['installedpackages']['dspam']['config'][0]['server-pwd'][1]['value'] = "password"; + $config['installedpackages']['dspam']['config'][0]['server-pwd'][1]['descr'] = "desc"; + + /* DSPAM client settings */ + $config['installedpackages']['dspam']['config'][0]['dspam-client-enable'] = "on"; + $config['installedpackages']['dspam']['config'][0]['dspam-client-host'] = "/tmp/dspam.sock"; + $config['installedpackages']['dspam']['config'][0]['dspam-client-port'] = "24"; + $config['installedpackages']['dspam']['config'][0]['dspam-client-id'] = "secret@Relay1"; + write_config(); + } + + + + 5 + dspam.inc + DSPAM Debugging Options + + Usually the DSPAM binary that ships with pfSense does not contain debugging symbols. + Hence it makes little sense to enable debugging options. If you are quite certain that + your DSPAM distribution comes with debugging enabled you may tweak the below debugging + options. + + + + true + enabledbg + Enable debugging. + checkbox + installedpackages->dspam->config->0->debug-enable + debug,dopt + + + debug + input + installedpackages->dspam->config->0->debug-whom + Enables debugging for some or all users. + + + dopt + input + installedpackages->dspam->config->0->debug-options + One or more of: process, classify, spam, fp, inoculation, corpus + + + Next + submit + + + + + 6 + dspam.inc + DSPAM Engine Settings + + On this page you will find some specific options required to operate the DSPAM engine. Please + consult your <code>dspam.conf</code> for a detailed explanation of each option. + If you are unsure about the meaning of a particular option, please use the default values. + + + + tmode + + The default training mode to use for all operations, when one has not + been specified on the commandline or in the user's preferences (default: teft). + + select + teft + + + + + + + installedpackages->dspam->config->0->training-mode + + + true + testct + on + + By default, dspam will retrain certain errors until the condition is + no longer met (default: enabled). + + checkbox + installedpackages->dspam->config->0->test-cond-training + + + pvalue + + Specify the technique used for calculating PValues, overriding any + defaults configured in the build (default: graham). + + select + teft + + + + + + installedpackages->dspam->config->0->pvalue + + + true + ipdrive + on + + Calculate odds-ratios for ham/spam, and add to X-DSPAM-Improbability + headers (default: disabled). + + checkbox + installedpackages->dspam->config->0->improbability-drive + + + Next + submit + + + + + 7 + dspam.inc + LDAP Settings + + DSPAM comes with the ability to verify users agains user records stored within a LDAP directory. + If using this option, it would be for example possible to verify mail users against Windows + user entries stored within an Active Directory. Please consider this feature as somewhat experimental. + + + + true + enableldap + Enable checks against a LDAP directory. + checkbox + installedpackages->dspam->config->0->ldap-enable + ldapmode,ldaphost,ldapfilter,ldapbase + + + ldapmode + + Perform various LDAP functions depending on LDAPMode variable. + + select + verify + + + + installedpackages->dspam->config->0->ldap-mode + + + ldaphost + input + installedpackages->dspam->config->0->ldap-host + Hostname of the LDAP directory server. + + + ldapfilter + input + installedpackages->dspam->config->0->ldap-filter + A specific query filter, that should be used while querying the LDAP server. + + + ldapbase + input + installedpackages->dspam->config->0->ldap-base + A particular distinguish name from where to start LDAP queries. + + + Next + submit + + + + + 8 + dspam.inc + Miscellaneous Settings + + On this page we will give you an opertunity to fine-tune the DSPAM engine. As mentioned earlier, + if you are unsure about the meaning of a particular option, use its default value. + + + + foatt + input + installedpackages->dspam->config->0->failover-attempts + A particular number of attempts (default: 1). + + + true + enablesbl + Enable checks against a particular SBL host (default: disabled). + checkbox + installedpackages->dspam->config->0->sbl-enable + sblhost + + + sblhost + input + installedpackages->dspam->config->0->sbl-host + A particular SBL hostname (default: none). + 30 + + + true + enablerbl + Enable RBL inoculation support (default: disabled). + checkbox + installedpackages->dspam->config->0->rbl-inoculate + + + true + enablenoti + Enable the sending of notification emails to users (first message, quarantine full, etc. default: disabled). + checkbox + installedpackages->dspam->config->0->notification-email + + + Next + submit + + + + + 9 + dspam.inc + Maintainance Settings + + DSPAM stores token data etc. in some kind of a database (e.g. a RDBMS or flat files). + Over time, this token data may consume lots of space. Hence it makes sense to run + certain routines to clean up unused data. + + + + psig + input + installedpackages->dspam->config->0->purge-signatures + Purge stale signatures (default: 14). + + + pneut + input + installedpackages->dspam->config->0->purge-neutral + Purge tokens with neutralish probabilities (default: 90). + + + punu + input + installedpackages->dspam->config->0->purge-unused + Purge unused tokens (default: 90). + + + phapa + input + installedpackages->dspam->config->0->purge-hapaxes + Purge tokens with less than 5 hits (hapaxes - default: 30). + + + pones + input + installedpackages->dspam->config->0->purge-hits-1s + Purge tokens with only 1 spam hit (default: 15). + + + ponei + input + installedpackages->dspam->config->0->purge-hits-1i + Purge tokens with only 1 innocent hit (default: 15). + + + Next + submit + + + + + 10 + dspam.inc + System Settings + + This page contains additional settings related to the DSPAM system such as logging, + message processing behaviour et cetera. + + + + locmx + input + installedpackages->dspam->config->0->local-mx + + Local Mail Exchangers: Used for source address tracking, tells DSPAM + which mail exchangers are local and therefore should be ignored in the + Received: header when tracking the source of an email. Note: you should + use the address of the host as appears between brackets [ ] in the + Received header (default: 127.0.0.1). + + + + true + enablesysl + Enable system logging (default: enabled). + checkbox + installedpackages->dspam->config->0->system-log + + + true + enableusel + Enable per user logging (default: enabled). + checkbox + installedpackages->dspam->config->0->user-log + + + optinout + + Opt: in or out; determines DSPAM's default filtering behavior (default: out). + + select + out + + + + + installedpackages->dspam->config->0->filter-opt + + + true + enableptoh + Parse the To: headers of an incoming message. (default: disabled). + checkbox + installedpackages->dspam->config->0->parse-to-headers + + + true + enablecmop + Automatically change the class (to spam or innocent - default: disabled). + checkbox + installedpackages->dspam->config->0->change-mode-on-parse + + + true + enablecuop + Automatically change the username to match that specified in the To: header (default: enabled). + checkbox + installedpackages->dspam->config->0->change-user-on-parse + + + maxmsgs + input + installedpackages->dspam->config->0->max-message-size + + You may specify a maximum message size in bytes for DSPAM to process. (default: 307200). + + + + true + procbias + + Bias causes the filter to lean more toward "innocent", and usually + greatly reduces false positives. It is the default behavior of most + Bayesian filters, including dspam (default: enabled). + + checkbox + installedpackages->dspam->config->0->processor-bias + + + Next + submit + + + + + 11 + dspam.inc + ClamAV Engine Settings + + DSPAM comes with an additional feature which allows to scan mail messages + for malicious code (i.e. virii). If you require messages not only to be + classified as Spam/Ham but additionally to be scanned for virii, enable + to appropriate option below. + + + + true + enableclam + Enable ClamAV Engine (default: disabled). + checkbox + installedpackages->dspam->config->0->clamav-enable + clamport,clamhost,clamresp + + + clamport + input + installedpackages->dspam->config->0->clamav-port + A number that specifies the port the ClamAV daemon is listening to (default: none). + + + clamhost + input + installedpackages->dspam->config->0->clamav-host + An IP address that points to the host the ClamAV daemon is running on (default: none). + + + clamresp + The action that should take place, if ClamAV reports a positive (default: none). + select + accept + + + + + + installedpackages->dspam->config->0->clamav-response + + + Next + submit + + + + + 12 + dspam.inc + DSPAM Daemon Settings (Server) + + DSPAM can be either invoked per message (i.e. a thread per message) or it + can be run as a daemon in the background. The latter option enables DSPAM + to maintain database connection pools which may increase overall performance. + Based on the profile, that you did choose initially, some of the below options + may be already set. + + + + dsport + input + installedpackages->dspam->config->0->dspam-server-port + A number that specifies the port the DSPAM daemon is listening to (default: none). + + + dsqsize + input + installedpackages->dspam->config->0->dspam-server-queue-size + A number that specifies the server's queue size (default: none). + + + dspid + input + installedpackages->dspam->config->0->dspam-server-pid + Keep this is sync with <code>/usr/local/etc/rc.d/dspam.rc</code> script (default: none). + 40 + + + dssmode + Specifies the type of LMTP server to start. (default: none). + select + auto + + + + + + installedpackages->dspam->config->0->dspam-server-mode + + + serverparam + input + installedpackages->dspam->config->0->dspam-server-params + Parameters which will be passed to the LMTP server (default: none). + + + serverid + input + installedpackages->dspam->config->0->dspam-server-id + An identification string which will be used to be passed to the LMTP server (default: none). + + + serversock + input + installedpackages->dspam->config->0->dspam-server-socket + A local Unix domain socket (default: none). + 40 + + + Next + submit + + + + + 13 + dspam.inc + DSPAM Daemon Settings (Client) + + If you did configure DSPAM to run in dspam mode, it is required to configure + client settings because DSPAM needs for example to authenticate against its + server counterpart. + + + + true + enabledsclient + Run DSPAM in client mode (default: disabled). + checkbox + installedpackages->dspam->config->0->dspam-client-enable + dsclhost,dsclport,dsclident + + + dsclhost + input + installedpackages->dspam->config->0->dspam-client-host + An IP address or a Unix domain socket (default: none). + + + dsclport + input + installedpackages->dspam->config->0->dspam-client-port + Will be only used if this client uses TCP/IP communication (default: none). + + + dsclident + input + installedpackages->dspam->config->0->dspam-client-id + A string that will be used to identify the client against a server. (default: none). + 40 + + + Next + submit + + + + + 14 + dspam.inc + Reload configuration + true + Click 'Reload' to reload the DSPAM daemon with new changes. + + + Reload + submit + + + + + 15 + dspam.inc + Reload in progress + + A reload is now in progress. Please wait. <p> The system will + automatically try to access DSPAM settings in 120 page seconds. <p> + You can click on the icon above to access the site more quickly. + + + window.setTimeout('window.location.href = "/dspam-settings.php"', 120000); + + + dspam_configure(); + mwexec("/usr/local/etc/rc.d/spamd.sh stop"); + mwexec("/usr/local/etc/rc.d/spamd.sh start"); + + + -- cgit v1.2.3