* Mail: Implements date extension for vacation rule. None imap admin user can also set vacation rule by date.

This commit is contained in:
Hadi Nategh 2021-10-15 14:29:19 +02:00
parent d7de30a423
commit 551d797cb6
3 changed files with 57 additions and 27 deletions

View File

@ -1374,6 +1374,7 @@ class Imap extends Horde_Imap_Client_Socket implements Imap\PushIface
case 'retrieveRules': case 'retrieveRules':
case 'getVacation': case 'getVacation':
case 'setVacation': case 'setVacation':
case 'getExtensions':
if (is_null($this->sieve)) if (is_null($this->sieve))
{ {
$this->sieve = new Sieve($this); $this->sieve = new Sieve($this);

View File

@ -34,6 +34,7 @@ class Script
var $emailNotification; /* email notification settings. */ var $emailNotification; /* email notification settings. */
var $pcount; /* highest priority value in ruleset. */ var $pcount; /* highest priority value in ruleset. */
var $errstr; /* error text. */ var $errstr; /* error text. */
var $extensions; /* contains extensions status*/
/** /**
* Body transform content types * Body transform content types
* *
@ -69,6 +70,21 @@ class Script
$this->emailNotification = array(); // Added email notifications $this->emailNotification = array(); // Added email notifications
$this->pcount = 0; $this->pcount = 0;
$this->errstr = ''; $this->errstr = '';
$this->extensions = [];
}
private function _setExtensionsStatus(Sieve $connection)
{
$this->extensions = [
'vacation' => $connection->hasExtension('vacation'),
'regex' => $connection->hasExtension('regex'),
'enotify' => $connection->hasExtension('enotify'),
'body' => $connection->hasExtension('body'),
'variables' => $connection->hasExtension('variables'),
'date' => $connection->hasExtension('date'),
'imap4flags' => $connection->hasExtension('imap4flags'),
'relational' => $connection->hasExtension('relational'),
];
} }
// get sieve script rules for this user // get sieve script rules for this user
@ -86,6 +102,7 @@ class Script
$anyofbit = 4; $anyofbit = 4;
$keepbit = 8; $keepbit = 8;
$regexbit = 128; $regexbit = 128;
$this->_setExtensionsStatus($connection);
if (!isset($this->name)){ if (!isset($this->name)){
$this->errstr = 'retrieveRules: no script name specified'; $this->errstr = 'retrieveRules: no script name specified';
@ -236,7 +253,6 @@ class Script
$activerules = 0; $activerules = 0;
$regexused = 0; $regexused = 0;
$regexsupported = true;
$rejectused = 0; $rejectused = 0;
$vacation_active = false; $vacation_active = false;
@ -245,13 +261,10 @@ class Script
//include "$default->lib_dir/version.php"; //include "$default->lib_dir/version.php";
// lets generate the main body of the script from our rules // set extensions status
$enotify = $variables= $supportsbody = false; $this->_setExtensionsStatus($connection);
if ($connection->hasExtension('enotify')) $enotify = true;
if ($connection->hasExtension('variables')) $variables = true; if (!$this->extensions['vacation']) $this->vacation = false;
if ($connection->hasExtension('body')) $supportsbody = true;
if (!$connection->hasExtension('vacation')) $this->vacation = false;
if (!$connection->hasExtension('regex')) $regexsupported = false;
$newscriptbody = ""; $newscriptbody = "";
$continue = 1; $continue = 1;
@ -334,7 +347,7 @@ class Script
$newruletext .= "size " . $xthan . $rule['size'] . "K"; $newruletext .= "size " . $xthan . $rule['size'] . "K";
$started = 1; $started = 1;
} }
if ($supportsbody){ if ($this->extensions['body']){
if (!empty($rule['field_bodytransform'])){ if (!empty($rule['field_bodytransform'])){
if ($started) $newruletext .= ", "; if ($started) $newruletext .= ", ";
$btransform = " :raw "; $btransform = " :raw ";
@ -417,7 +430,7 @@ class Script
$vacation_active = true; $vacation_active = true;
if ($vacation['text']) if ($vacation['text'])
{ {
if ($regexsupported) if ($this->extensions['regex'])
{ {
$newscriptbody .= "if header :regex ".'"X-Spam-Status" '.'"\\\\bYES\\\\b"'."{\n\tstop;\n}\n"; //stop vacation reply if it is spam $newscriptbody .= "if header :regex ".'"X-Spam-Status" '.'"\\\\bYES\\\\b"'."{\n\tstop;\n}\n"; //stop vacation reply if it is spam
$regexused = 1; $regexused = 1;
@ -441,17 +454,17 @@ class Script
} }
$newscriptbody .= "\tkeep;\n}\n"; $newscriptbody .= "\tkeep;\n}\n";
} }
$newscriptbody .= "vacation :days " . $vacation['days']; $vac_rule = "vacation :days " . $vacation['days'];
$first = 1; $first = 1;
if (!empty($vacation['addresses'][0])) if (!empty($vacation['addresses'][0]))
{ {
$newscriptbody .= " :addresses ["; $vac_rule .= " :addresses [";
foreach ($vacation['addresses'] as $vaddress) { foreach ($vacation['addresses'] as $vaddress) {
if (!$first) $newscriptbody .= ", "; if (!$first) $vac_rule .= ", ";
$newscriptbody .= "\"" . trim($vaddress) . "\""; $vac_rule .= "\"" . trim($vaddress) . "\"";
$first = 0; $first = 0;
} }
$newscriptbody .= "] "; $vac_rule .= "] ";
} }
$message = $vacation['text']; $message = $vacation['text'];
if ($vacation['start_date'] || $vacation['end_date']) if ($vacation['start_date'] || $vacation['end_date'])
@ -463,7 +476,20 @@ class Script
date($format_date,$vacation['end_date']), date($format_date,$vacation['end_date']),
),$message); ),$message);
} }
$newscriptbody .= " text:\n" . $message . "\n.\n;\n\n"; $vac_rule .= " text:\n" . $message . "\n.\n;\n\n";
if ($this->extensions['date'] && $vacation['start_date'] && $vacation['end_date'])
{
$newscriptbody .= "if allof (\n".
"currentdate :value \"ge\" \"date\" \"". date('Y-m-d', $vacation['start_date']) ."\",\n".
"currentdate :value \"le\" \"date\" \"". date('Y-m-d', $vacation['end_date']) ."\")\n".
"{\n".
$vac_rule."\n".
"}\n";
}
else
{
$newscriptbody .= $vac_rule;
}
} }
// update with any changes. // update with any changes.
@ -476,10 +502,10 @@ class Script
// format notification body // format notification body
$egw_site_title = $GLOBALS['egw_info']['server']['site_title']; $egw_site_title = $GLOBALS['egw_info']['server']['site_title'];
if ($enotify==true) if ($this->extensions['enotify']==true)
{ {
$notification_body = lang("You have received a new message on the")." {$egw_site_title}"; $notification_body = lang("You have received a new message on the")." {$egw_site_title}";
if ($variables) if ($this->extensions['variables'])
{ {
$notification_body .= ", "; $notification_body .= ", ";
$notification_body .= 'From: ${from}'; $notification_body .= 'From: ${from}';
@ -522,13 +548,16 @@ class Script
if ($activerules) { if ($activerules) {
$newscripthead .= "require [\"fileinto\""; $newscripthead .= "require [\"fileinto\"";
if ($regexsupported && $regexused) $newscripthead .= ",\"regex\""; if ($this->extensions['regex'] && $regexused) $newscripthead .= ",\"regex\"";
if ($rejectused) $newscripthead .= ",\"reject\""; if ($rejectused) $newscripthead .= ",\"reject\"";
if ($this->vacation && $vacation_active) { if ($this->vacation && $vacation_active) {
$newscripthead .= ",\"vacation\""; $newscripthead .= ",\"vacation\"";
} }
if ($supportsbody) $newscripthead .= ",\"body\""; if ($this->extensions['body']) $newscripthead .= ",\"body\"";
if ($this->emailNotification && $this->emailNotification['status'] == 'on') $newscripthead .= ',"'.($enotify?'e':'').'notify"'.($variables?',"variables"':''); // Added email notifications if ($this->extensions['date']) $newscripthead .= ",\"date\"";
if ($this->extensions['relational']) $newscripthead .= ",\"relational\"";
if ($this->emailNotification && $this->emailNotification['status'] == 'on') $newscripthead .= ',"'.($this->extensions['enotify']?'e':'').'notify"'.($this->extensions['variables']?',"variables"':''); // Added email notifications
$newscripthead .= "];\n\n"; $newscripthead .= "];\n\n";
} else { } else {
// no active rules, but might still have an active vacation rule // no active rules, but might still have an active vacation rule
@ -536,18 +565,18 @@ class Script
if ($this->vacation && $vacation_active) if ($this->vacation && $vacation_active)
{ {
$newscripthead .= "require [\"vacation\""; $newscripthead .= "require [\"vacation\"";
if ($regexsupported && $regexused) $newscripthead .= ",\"regex\""; if ($this->extensions['regex'] && $regexused) $newscripthead .= ",\"regex\"";
$closeRequired=true; $closeRequired=true;
} }
if ($this->emailNotification && $this->emailNotification['status'] == 'on') if ($this->emailNotification && $this->emailNotification['status'] == 'on')
{ {
if ($this->vacation && $vacation_active) if ($this->vacation && $vacation_active)
{ {
$newscripthead .= ",\"".($enotify?'e':'')."notify\"".($variables?',"variables"':'')."];\n\n"; // Added email notifications $newscripthead .= ",\"".($this->extensions['enotify']?'e':'')."notify\"".($this->extensions['variables']?',"variables"':'')."];\n\n"; // Added email notifications
} }
else else
{ {
$newscripthead .= "require [\"".($enotify?'e':'')."notify\"".($variables?',"variables"':'')."];\n\n"; // Added email notifications $newscripthead .= "require [\"".($this->extensions['enotify']?'e':'')."notify\"".($this->extensions['variables']?',"variables"':'')."];\n\n"; // Added email notifications
} }
} }
if ($closeRequired) $newscripthead .= "];\n\n"; if ($closeRequired) $newscripthead .= "];\n\n";
@ -570,7 +599,7 @@ class Script
$newscriptfoot .= "#rule&&" . $rule['priority'] . "&&" . $rule['status'] . "&&" . $newscriptfoot .= "#rule&&" . $rule['priority'] . "&&" . $rule['status'] . "&&" .
addslashes($rule['from']) . "&&" . addslashes($rule['to']) . "&&" . addslashes($rule['subject']) . "&&" . $rule['action'] . "&&" . addslashes($rule['from']) . "&&" . addslashes($rule['to']) . "&&" . addslashes($rule['subject']) . "&&" . $rule['action'] . "&&" .
$rule['action_arg'] . "&&" . $rule['flg'] . "&&" . addslashes($rule['field']) . "&&" . addslashes($rule['field_val']) . "&&" . $rule['size']; $rule['action_arg'] . "&&" . $rule['flg'] . "&&" . addslashes($rule['field']) . "&&" . addslashes($rule['field_val']) . "&&" . $rule['size'];
if ($supportsbody && (!empty($rule['field_bodytransform']) || ($rule['ctype']!= '0' && !empty($rule['ctype'])))) $newscriptfoot .= "&&" . $rule['bodytransform'] . "&&" . $rule['field_bodytransform']. "&&" . $rule['ctype'] . "&&" . $rule['field_ctype_val']; if ($this->extensions['body'] && (!empty($rule['field_bodytransform']) || ($rule['ctype']!= '0' && !empty($rule['ctype'])))) $newscriptfoot .= "&&" . $rule['bodytransform'] . "&&" . $rule['field_bodytransform']. "&&" . $rule['ctype'] . "&&" . $rule['field_ctype_val'];
$newscriptfoot .= "\n"; $newscriptfoot .= "\n";
$pcount = $pcount+2; $pcount = $pcount+2;
//error_log(__CLASS__."::".__METHOD__.__LINE__.array2string($newscriptfoot)); //error_log(__CLASS__."::".__METHOD__.__LINE__.array2string($newscriptfoot));
@ -616,7 +645,7 @@ class Script
} }
catch (\Exception $e) { catch (\Exception $e) {
$this->errstr = 'updateScript: putscript failed: ' . $e->getMessage().($e->details?': '.$e->details:''); $this->errstr = 'updateScript: putscript failed: ' . $e->getMessage().($e->details?': '.$e->details:'');
if ($regexused&&!$regexsupported) $this->errstr .= " REGEX is not an supported CAPABILITY"; if ($regexused && !$this->extensions['regex']) $this->errstr .= " REGEX is not an supported CAPABILITY";
error_log(__METHOD__.__LINE__.' # Error: ->'.$this->errstr); error_log(__METHOD__.__LINE__.' # Error: ->'.$this->errstr);
error_log(__METHOD__.__LINE__.' # ScriptName:'.$this->name.' Script:'.$newscript); error_log(__METHOD__.__LINE__.' # ScriptName:'.$this->name.' Script:'.$newscript);
error_log(__METHOD__.__LINE__.' # Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid']); error_log(__METHOD__.__LINE__.' # Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid']);

View File

@ -550,7 +550,7 @@ class mail_sieve
} }
else else
{ {
if ($icServer->acc_imap_administration) if ($icServer->acc_imap_administration || (!empty($icServer->getExtensions()) && in_array('DATE', $icServer->getExtensions())))
{ {
$ByDate = array('by_date' => lang('By date')); $ByDate = array('by_date' => lang('By date'));
} }