plugin->registerEvent('mail:mail_user_filter:on_after_insert','mail_user_filter_plugin','mail_user_filter_edit'); $app->plugin->registerEvent('mail:mail_user_filter:on_after_update','mail_user_filter_plugin','mail_user_filter_edit'); } /* function to create the mail filter rule and insert it into the custom rules field when a new mail filter is added or modified. */ function mail_user_filter_edit($event_name,$page_form) { global $app, $conf; $mailuser = $app->db->queryOneRecord("SELECT custom_mailfilter FROM mail_user WHERE mailuser_id = ".$page_form->dataRecord["mailuser_id"]); $skip = false; $lines = explode("\n",$mailuser['custom_mailfilter']); $out = ''; $found = false; foreach($lines as $line) { $line = rtrim($line); if($line == '### BEGIN FILTER_ID:'.$page_form->id) { $skip = true; $found = true; } if($skip == false && $line != '') $out .= $line ."\n"; if($line == '### END FILTER_ID:'.$page_form->id) { if($page_form->dataRecord["active"] == 'y') $out .= $this->mail_user_filter_get_rule($page_form); $skip = false; } } // We did not found our rule, so we add it now as first rule. if($found == false && $page_form->dataRecord["active"] == 'y') { $new_rule = $this->mail_user_filter_get_rule($page_form); $out = $new_rule . $out; } $out = $app->db->quote($out); $app->db->datalogUpdate('mail_user', "custom_mailfilter = '$out'", 'mailuser_id', $page_form->dataRecord["mailuser_id"]); } /* private function to create the mail filter rules in maildrop or sieve format. */ private function mail_user_filter_get_rule($page_form) { global $app,$conf; $app->uses("getconf"); $mailuser_rec = $app->db->queryOneRecord("SELECT server_id FROM mail_user WHERE mailuser_id = ".intval($page_form->dataRecord["mailuser_id"])); $mail_config = $app->getconf->get_server_config(intval($mailuser_rec["server_id"]),'mail'); if($mail_config['mail_filter_syntax'] == 'sieve') { // ####################################################### // Filter in Sieve Syntax // ####################################################### $content = ''; $content .= '### BEGIN FILTER_ID:'.$page_form->id."\n"; //$content .= 'require ["fileinto", "regex", "vacation"];'."\n"; $content .= 'if header :regex ["'.strtolower($page_form->dataRecord["source"]).'"] ["'; $searchterm = preg_quote($page_form->dataRecord["searchterm"]); if($page_form->dataRecord["op"] == 'contains') { $content .= ".*".$searchterm; } elseif ($page_form->dataRecord["op"] == 'is') { $content .= $searchterm."$"; } elseif ($page_form->dataRecord["op"] == 'begins') { $content .= " ".$searchterm.""; } elseif ($page_form->dataRecord["op"] == 'ends') { $content .= ".*".$searchterm."$"; } $content .= '"] {'."\n"; if($page_form->dataRecord["action"] == 'move') { $content .= ' fileinto "'.$page_form->dataRecord["target"].'";' . "\n"; } else { $content .= " discard;\n"; } $content .= " stop;\n}\n"; $content .= '### END FILTER_ID:'.$page_form->id."\n"; } else { // ####################################################### // Filter in Maildrop Syntax // ####################################################### $content = ''; $content .= '### BEGIN FILTER_ID:'.$page_form->id."\n"; $TargetNoQuotes = $page_form->dataRecord["target"]; $TargetQuotes = "\"$TargetNoQuotes\""; $TestChDirNoQuotes = '$DEFAULT/.'.$TargetNoQuotes; $TestChDirQuotes = "\"$TestChDirNoQuotes\""; $MailDirMakeNoQuotes = $TargetQuotes.' $DEFAULT'; $EchoTargetFinal = $TargetNoQuotes; if($page_form->dataRecord["action"] == 'move') { $content .= " `test -e ".$TestChDirQuotes." && exit 1 || exit 0` if ( ".'$RETURNCODE'." != 1 ) { `maildirmake -f $MailDirMakeNoQuotes` `chmod -R 0700 ".$TestChDirQuotes."` `echo \"INBOX.$EchoTargetFinal\" >> ".'$DEFAULT'."/courierimapsubscribed` } "; } $content .= "if (/^".$page_form->dataRecord["source"].": "; $searchterm = preg_quote($page_form->dataRecord["searchterm"]); if($page_form->dataRecord["op"] == 'contains') { $content .= ".*".$searchterm."/:h)\n"; } elseif ($page_form->dataRecord["op"] == 'is') { $content .= $searchterm."$/:h)\n"; } elseif ($page_form->dataRecord["op"] == 'begins') { $content .= $searchterm."/:h)\n"; } elseif ($page_form->dataRecord["op"] == 'ends') { $content .= ".*".$searchterm."$/:h)\n"; } $content .= "{\n"; $content .= "exception {\n"; if($page_form->dataRecord["action"] == 'move') { $content .= 'ID' . "$page_form->id" . 'EndFolder = "$DEFAULT/.' . $page_form->dataRecord['target'] . '/"' . "\n"; $content .= "to ". '$ID' . "$page_form->id" . 'EndFolder' . "\n"; } else { $content .= "to /dev/null\n"; } $content .= "}\n"; $content .= "}\n"; //} $content .= '### END FILTER_ID:'.$page_form->id."\n"; } return $content; } } // end class ?>