public function __construct($params = array(), $scriptparams = array())
{
$this->_disable = !empty($params['disable']);
$this->_params = array_merge($this->_params, $scriptparams);
$delivery = '';
if (isset($this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_agent'])) {
$delivery = '| ' . $this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_agent'] . ' ';
}
if (isset($this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_mailbox_prefix'])) {
$delivery .= ' ' . $this->_params['transport'][Ingo::RULE_ALL]['params']['delivery_mailbox_prefix'];
}
if (!empty($this->_params['transport'][Ingo::RULE_ALL]['params']['date'])) {
$this->_params['date'] = $this->_params['transport'][Ingo::RULE_ALL]['params']['date'];
}
if (!empty($this->_params['transport'][Ingo::RULE_ALL]['params']['echo'])) {
$this->_params['echo'] = $this->_params['transport'][Ingo::RULE_ALL]['params']['echo'];
}
if (!empty($this->_params['transport'][Ingo::RULE_ALL]['params']['ls'])) {
$this->_params['ls'] = $this->_params['transport'][Ingo::RULE_ALL]['params']['ls'];
}
switch ($params['action']) {
case 'Ingo_Rule_User_Keep':
// Note: you may have to set the DEFAULT variable in your
// backend configuration.
$this->_action[] = $delivery .= '$DEFAULT';
break;
case 'Ingo_Rule_User_Move':
$this->_action[] = $delivery .= $this->procmailPath($params['action-value']);
break;
case 'Ingo_Rule_User_Discard':
$this->_action[] = '/dev/null';
break;
case 'Ingo_Rule_User_Redirect':
$this->_action[] = '! ' . $params['action-value'];
break;
case 'Ingo_Rule_User_RedirectKeep':
$this->_action[] = '{';
$this->_action[] = ' :0 c';
$this->_action[] = ' ! ' . $params['action-value'];
if (strpos($this->_flags, 'c') === false) {
$this->_action[] = '';
$this->_action[] = ' :0' . (isset($this->_params['delivery_agent']) ? ' w' : '');
$this->_action[] = ' ' . $delivery . '$DEFAULT';
}
$this->_action[] = '}';
break;
case 'Ingo_Rule_User_Reject':
$this->_action[] = '{';
$this->_action[] = ' :0 h';
$this->_action[] = ' SUBJECT=| formail -xSubject:';
$this->_action[] = '';
$this->_action[] = ' :0 h';
$this->_action[] = ' SENDER=| formail -zxFrom:';
$this->_action[] = '';
$this->_action[] = ' :0 Wh';
$this->_action[] = ' * !^FROM_DAEMON';
$this->_action[] = ' * !^X-Loop: $SENDER';
$this->_action[] = ' | (formail -rA"X-Loop: $SENDER" \\';
$reason = $params['action-value'];
if (Horde_Mime::is8bit($reason)) {
$this->_action[] = ' -i"Subject: Re: $SUBJECT" \\';
$this->_action[] = ' -i"Content-Transfer-Encoding: quoted-printable" \\';
$this->_action[] = ' -i"Content-Type: text/plain; charset=UTF-8" ; \\';
$reason = Horde_Mime_QuotedPrintable::encode($reason);
} else {
$this->_action[] = ' -i"Subject: Re: $SUBJECT" ; \\';
}
$reason = addcslashes($reason, "\\\n\r\t\"`");
$this->_action[] = ' ' . $this->_params['echo'] . ' -e "' . $reason . '" \\';
$this->_action[] = ' ) | $SENDMAIL -oi -t';
$this->_action[] = '}';
break;
case 'Ingo_Rule_System_Vacation':
$days = $params['action-value']['days'];
$timed = !empty($params['action-value']['start']) && !empty($params['action-value']['end']);
$this->_action[] = '{';
foreach ($params['action-value']['addresses'] as $address) {
if (empty($address)) {
continue;
}
$this->_action[] = ' :0';
$this->_action[] = ' * ^TO_' . $address;
$this->_action[] = ' {';
$this->_action[] = ' FILEDATE=`test -f ${VACATION_DIR:-.}/\'.vacation.' . $address . '\' && ' . $this->_params['ls'] . ' -lcn --time-style=+%s ${VACATION_DIR:-.}/\'.vacation.' . $address . '\' | ' . 'awk \'{ print $6 + (' . $days * 86400 . ') }\'`';
$this->_action[] = ' DATE=`' . $this->_params['date'] . ' +%s`';
$this->_action[] = ' DUMMY=`test -f ${VACATION_DIR:-.}/\'.vacation.' . $address . '\' && ' . 'test $FILEDATE -le $DATE && ' . 'rm ${VACATION_DIR:-.}/\'.vacation.' . $address . '\'`';
if ($timed) {
$this->_action[] = ' START=' . $params['action-value']['start'];
$this->_action[] = ' END=' . $params['action-value']['end'];
}
$this->_action[] = '';
$this->_action[] = ' :0 h';
$this->_action[] = ' SUBJECT=| formail -xSubject:';
$this->_action[] = '';
$this->_action[] = ' :0 Wc: ${VACATION_DIR:-.}/vacation.lock';
if ($timed) {
$this->_action[] = ' * ? test $DATE -gt $START && test $END -gt $DATE';
}
$this->_action[] = ' {';
$this->_action[] = ' :0 Wh';
$this->_action[] = ' * ^TO_' . $address;
$this->_action[] = ' * !^X-Loop: ' . $address;
$this->_action[] = ' * !^X-Spam-Flag: YES';
if (count($params['action-value']['excludes']) > 0) {
foreach ($params['action-value']['excludes'] as $exclude) {
if (!empty($exclude)) {
$this->_action[] = ' * !^From.*' . $exclude;
}
}
}
if ($params['action-value']['ignorelist']) {
$this->_action[] = ' * !^FROM_DAEMON';
}
$this->_action[] = ' | formail -rD 8192 ${VACATION_DIR:-.}/.vacation.' . $address;
$this->_action[] = ' :0 eh';
$this->_action[] = ' | (formail -rI"Precedence: junk" \\';
$this->_action[] = ' -a"From: <' . $address . '>" \\';
$this->_action[] = ' -A"X-Loop: ' . $address . '" \\';
$reason = Ingo_Rule_System_Vacation::vacationReason($params['action-value']['reason'], $params['action-value']['start'], $params['action-value']['end']);
if (Horde_Mime::is8bit($reason)) {
$this->_action[] = ' -i"Subject: ' . Horde_Mime::encode($params['action-value']['subject'] . ' (Re: $SUBJECT)') . '" \\';
$this->_action[] = ' -i"Content-Transfer-Encoding: quoted-printable" \\';
$this->_action[] = ' -i"Content-Type: text/plain; charset=UTF-8" ; \\';
$reason = Horde_Mime_QuotedPrintable::encode($reason);
} else {
$this->_action[] = ' -i"Subject: ' . Horde_Mime::encode($params['action-value']['subject'] . ' (Re: $SUBJECT)') . '" ; \\';
}
$reason = addcslashes($reason, "\\\n\r\t\"`");
$this->_action[] = ' ' . $this->_params['echo'] . ' -e "' . $reason . '" \\';
$this->_action[] = ' ) | $SENDMAIL -f' . $address . ' -oi -t';
$this->_action[] = ' :0';
$this->_action[] = ' /dev/null';
$this->_action[] = ' }';
$this->_action[] = ' }';
}
$this->_action[] = '}';
break;
case 'Ingo_Rule_System_Forward':
/* Make sure that we prevent mail loops using 3 methods.
*
* First, we call sendmail -f to set the envelope sender to be the
* same as the original sender, so bounces will go to the original
* sender rather than to us. This unfortunately triggers lots of
* Authentication-Warning: messages in sendmail's logs.
*
* Second, add an X-Loop header, to handle the case where the
* address we forward to forwards back to us.
*
* Third, don't forward mailer daemon messages (i.e., bounces).
* Method 1 above should make this redundant, unless we're sending
* mail from this account and have a bad forward-to account.
*
* Get the from address, saving a call to formail if possible.
* The procmail code for doing this is borrowed from the
* Procmail Library Project, http://pm-lib.sourceforge.net/.
* The Ingo project has the permission to use Procmail Library code
* under Apache licence v 1.x or any later version.
* Permission obtained 2006-04-04 from Author Jari Aalto. */
$this->_action[] = '{';
$this->_action[] = ' :0 ';
$this->_action[] = ' *$ ! ^From *\\/[^ ]+';
$this->_action[] = ' *$ ! ^Sender: *\\/[^ ]+';
$this->_action[] = ' *$ ! ^From: *\\/[^ ]+';
$this->_action[] = ' *$ ! ^Reply-to: *\\/[^ ]+';
$this->_action[] = ' {';
$this->_action[] = ' OUTPUT = `formail -zxFrom:`';
$this->_action[] = ' }';
$this->_action[] = ' :0 E';
$this->_action[] = ' {';
$this->_action[] = ' OUTPUT = $MATCH';
$this->_action[] = ' }';
$this->_action[] = '';
/* Forward to each address on our list. */
foreach ($params['action-value'] as $address) {
if (!empty($address)) {
$this->_action[] = ' :0 c';
$this->_action[] = ' * !^FROM_MAILER';
$this->_action[] = ' * !^X-Loop: to-' . $address;
$this->_action[] = ' | formail -A"X-Loop: to-' . $address . '" | $SENDMAIL -oi -f $OUTPUT ' . $address;
}
}
/* In case of mail loop or bounce, store a copy locally. Note
* that if we forward to more than one address, only a mail loop
* on the last address will cause a local copy to be saved. TODO:
* The next two lines are redundant (and create an extra copy of
* the message) if "Keep a copy of messages in this account" is
* checked. */
$this->_action[] = ' :0 E' . (isset($this->_params['delivery_agent']) ? 'w' : '');
$this->_action[] = ' ' . $delivery . '$DEFAULT';
$this->_action[] = ' :0 ';
$this->_action[] = ' /dev/null';
$this->_action[] = '}';
break;
default:
$this->_valid = false;
break;
}
}