Esempio n. 1
0
 /**
  * Constructs a new procmail recipe.
  *
  * @param array $params        Array of parameters.
  *                               REQUIRED FIELDS:
  *                                'action'
  *                               OPTIONAL FIELDS:
  *                                'action-value' (only used if the
  *                                'action' requires it)
  * @param array $scriptparams  Array of parameters passed to
  *                             Ingo_Script_Procmail::.
  */
 public function __construct($params = array(), $scriptparams = array())
 {
     $this->_disable = !empty($params['disable']);
     $this->_params = array_merge($this->_params, $scriptparams);
     switch ($params['action']) {
         case Ingo_Storage::ACTION_KEEP:
             // Note: you may have to set the DEFAULT variable in your
             // backend configuration.
             if (isset($this->_params['delivery_agent']) && isset($this->_params['delivery_mailbox_prefix'])) {
                 $this->_action[] = '| ' . $this->_params['delivery_agent'] . ' ' . $this->_params['delivery_mailbox_prefix'] . '$DEFAULT';
             } elseif (isset($this->_params['delivery_agent'])) {
                 $this->_action[] = '| ' . $this->_params['delivery_agent'] . ' $DEFAULT';
             } else {
                 $this->_action[] = '$DEFAULT';
             }
             break;
         case Ingo_Storage::ACTION_MOVE:
             if (isset($this->_params['delivery_agent']) && isset($this->_params['delivery_mailbox_prefix'])) {
                 $this->_action[] = '| ' . $this->_params['delivery_agent'] . ' ' . $this->_params['delivery_mailbox_prefix'] . $this->procmailPath($params['action-value']);
             } elseif (isset($this->_params['delivery_agent'])) {
                 $this->_action[] = '| ' . $this->_params['delivery_agent'] . ' ' . $this->procmailPath($params['action-value']);
             } else {
                 $this->_action[] = $this->procmailPath($params['action-value']);
             }
             break;
         case Ingo_Storage::ACTION_DISCARD:
             $this->_action[] = '/dev/null';
             break;
         case Ingo_Storage::ACTION_REDIRECT:
             $this->_action[] = '! ' . $params['action-value'];
             break;
         case Ingo_Storage::ACTION_REDIRECTKEEP:
             $this->_action[] = '{';
             $this->_action[] = '  :0 c';
             $this->_action[] = '  ! ' . $params['action-value'];
             $this->_action[] = '';
             $this->_action[] = '  :0' . (isset($this->_params['delivery_agent']) ? ' w' : '');
             if (isset($this->_params['delivery_agent']) && isset($this->_params['delivery_mailbox_prefix'])) {
                 $this->_action[] = '  | ' . $this->_params['delivery_agent'] . ' ' . $this->_params['delivery_mailbox_prefix'] . '$DEFAULT';
             } elseif (isset($this->_params['delivery_agent'])) {
                 $this->_action[] = '  | ' . $this->_params['delivery_agent'] . ' $DEFAULT';
             } else {
                 $this->_action[] = '  $DEFAULT';
             }
             $this->_action[] = '}';
             break;
         case Ingo_Storage::ACTION_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::quotedPrintableEncode($reason, "\n");
             } 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_Storage::ACTION_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)) {
                     $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 Whc: ${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_Script_Util::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::quotedPrintableEncode($reason, "\n");
                     } 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[] = '    }';
                     $this->_action[] = '  }';
                 }
             }
             $this->_action[] = '}';
             break;
         case Ingo_Storage::ACTION_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' : '');
             if (isset($this->_params['delivery_agent'])) {
                 $this->_action[] = isset($this->_params['delivery_mailbox_prefix']) ? ' | ' . $this->_params['delivery_agent'] . ' ' . $this->_params['delivery_mailbox_prefix'] . '$DEFAULT' : ' | ' . $this->_params['delivery_agent'] . ' $DEFAULT';
             } else {
                 $this->_action[] = '  $DEFAULT';
             }
             $this->_action[] = '  :0 ';
             $this->_action[] = '  /dev/null';
             $this->_action[] = '}';
             break;
         default:
             $this->_valid = false;
             break;
     }
 }
Esempio n. 2
0
 /**
  */
 protected function _vacationCode()
 {
     $code = 'vacation :days ' . $this->_vars['days'] . ' ';
     $addresses = $this->_vars['addresses'];
     $stringlist = '';
     if (count($addresses) > 1) {
         foreach ($addresses as $address) {
             $address = trim($address);
             if (!empty($address)) {
                 $stringlist .= empty($stringlist) ? '"' : ', "';
                 $stringlist .= Ingo_Script_Sieve::escapeString($address) . '"';
             }
         }
         $stringlist = "[" . $stringlist . "] ";
     } elseif (count($addresses) == 1) {
         $stringlist = '"' . Ingo_Script_Sieve::escapeString($addresses[0]) . '" ';
     }
     if (!empty($stringlist)) {
         $code .= ':addresses ' . $stringlist;
     }
     if (!empty($this->_vars['subject'])) {
         $code .= ':subject "' . Horde_Mime::encode(Ingo_Script_Sieve::escapeString($this->_vars['subject'])) . '" ';
     }
     return $code . '"' . Ingo_Script_Sieve::escapeString(Ingo_Script_Util::vacationReason($this->_vars['reason'], $this->_vars['start'], $this->_vars['end'])) . '";';
 }
Esempio n. 3
0
 /**
  * Generates the maildrop script to handle vacation messages.
  *
  * @param boolean $disable  Disable forwarding?
  */
 public function generateVacation($disable = false)
 {
     $vacation = $this->_params['storage']->retrieve(Ingo_Storage::ACTION_VACATION);
     $addresses = $vacation->getVacationAddresses();
     $actionval = array('addresses' => $addresses, 'subject' => $vacation->getVacationSubject(), 'days' => $vacation->getVacationDays(), 'ignorelist' => $vacation->getVacationIgnorelist(), 'excludes' => $vacation->getVacationExcludes(), 'start' => $vacation->getVacationStart(), 'end' => $vacation->getVacationEnd());
     if (!empty($addresses)) {
         $this->_addItem(Ingo::RULE_VACATION, new Ingo_Script_Maildrop_Comment(_("Vacation"), $disable, true));
         $params = array('action' => Ingo_Storage::ACTION_VACATION, 'action-value' => $actionval, 'disable' => $disable);
         $recipe = new Ingo_Script_Maildrop_Recipe($params, $this->_params);
         $this->_addItem(Ingo::RULE_VACATION, $recipe);
         $this->_addItem(Ingo::RULE_VACATION, new Ingo_Script_String(Ingo_Script_Util::vacationReason($vacation->getVacationReason(), $vacation->getVacationStart(), $vacation->getVacationEnd())), 'vacation.msg');
     }
 }