mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-25 10:09:20 +03:00
Filter improvements
This commit is contained in:
parent
f91f74fe7c
commit
05b1c1dfe5
14 changed files with 222 additions and 68 deletions
|
|
@ -19,6 +19,11 @@ class FilterCondition
|
|||
*/
|
||||
private $sValue;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $sValueSecond;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->Clear();
|
||||
|
|
@ -29,6 +34,7 @@ class FilterCondition
|
|||
$this->sField = \RainLoop\Providers\Filters\Enumerations\ConditionField::FROM;
|
||||
$this->sType = \RainLoop\Providers\Filters\Enumerations\ConditionType::EQUAL_TO;
|
||||
$this->sValue = '';
|
||||
$this->sValueSecond = '';
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -55,6 +61,14 @@ class FilterCondition
|
|||
return $this->sValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function ValueSecond()
|
||||
{
|
||||
return $this->sValueSecond;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $aData
|
||||
*
|
||||
|
|
@ -70,7 +84,8 @@ class FilterCondition
|
|||
$this->sType = isset($aData['Type']) ? $aData['Type'] :
|
||||
\RainLoop\Providers\Filters\Enumerations\ConditionType::EQUAL_TO;
|
||||
|
||||
$this->sValue = isset($aData['Value']) ? $aData['Value'] : '';
|
||||
$this->sValue = isset($aData['Value']) ? (string) $aData['Value'] : '';
|
||||
$this->sValueSecond = isset($aData['ValueSecond']) ? (string) $aData['ValueSecond'] : '';
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -88,7 +103,8 @@ class FilterCondition
|
|||
return array(
|
||||
'Field' => $this->Field(),
|
||||
'Type' => $this->Type(),
|
||||
'Value' => $this->Value()
|
||||
'Value' => $this->Value(),
|
||||
'ValueSecond' => $this->ValueSecond()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,4 +7,6 @@ class ConditionField
|
|||
const FROM = 'From';
|
||||
const RECIPIENT = 'Recipient';
|
||||
const SUBJECT = 'Subject';
|
||||
const HEADER = 'Header';
|
||||
const SIZE = 'Size';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,4 +8,6 @@ class ConditionType
|
|||
const NOT_EQUAL_TO = 'NotEqualTo';
|
||||
const CONTAINS = 'Contains';
|
||||
const NOT_CONTAINS = 'NotContains';
|
||||
const OVER = 'Over';
|
||||
const UNDER = 'Under';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -163,12 +163,23 @@ class SieveStorage implements \RainLoop\Providers\Filters\FiltersInterface
|
|||
{
|
||||
$sResult = '';
|
||||
$sTypeWord = '';
|
||||
$bTrue = true;
|
||||
|
||||
$sValue = \trim($oCondition->Value());
|
||||
if (0 < strlen($sValue))
|
||||
$sValueSecond = \trim($oCondition->ValueSecond());
|
||||
|
||||
if (0 < \strlen($sValue) ||
|
||||
(0 < \strlen($sValue) && 0 < \strlen($sValueSecond) &&
|
||||
\RainLoop\Providers\Filters\Enumerations\ConditionField::HEADER === $oCondition->Field()))
|
||||
{
|
||||
switch ($oCondition->Type())
|
||||
{
|
||||
case \RainLoop\Providers\Filters\Enumerations\ConditionType::OVER:
|
||||
$sTypeWord = ':over';
|
||||
break;
|
||||
case \RainLoop\Providers\Filters\Enumerations\ConditionType::UNDER:
|
||||
$sTypeWord = ':under';
|
||||
break;
|
||||
case \RainLoop\Providers\Filters\Enumerations\ConditionType::NOT_EQUAL_TO:
|
||||
$sResult .= 'not ';
|
||||
case \RainLoop\Providers\Filters\Enumerations\ConditionType::EQUAL_TO:
|
||||
|
|
@ -179,6 +190,10 @@ class SieveStorage implements \RainLoop\Providers\Filters\FiltersInterface
|
|||
case \RainLoop\Providers\Filters\Enumerations\ConditionType::CONTAINS:
|
||||
$sTypeWord = ':contains';
|
||||
break;
|
||||
default:
|
||||
$bTrue = false;
|
||||
$sResult = '/* @Error: unknown type value */ false';
|
||||
break;
|
||||
}
|
||||
|
||||
switch ($oCondition->Field())
|
||||
|
|
@ -192,26 +207,43 @@ class SieveStorage implements \RainLoop\Providers\Filters\FiltersInterface
|
|||
case \RainLoop\Providers\Filters\Enumerations\ConditionField::SUBJECT:
|
||||
$sResult .= 'header '.$sTypeWord.' ["Subject"]';
|
||||
break;
|
||||
case \RainLoop\Providers\Filters\Enumerations\ConditionField::HEADER:
|
||||
$sResult .= 'header '.$sTypeWord.' ["'.$this->quote($sValueSecond).'"]';
|
||||
break;
|
||||
case \RainLoop\Providers\Filters\Enumerations\ConditionField::SIZE:
|
||||
$sResult .= 'size '.$sTypeWord;
|
||||
break;
|
||||
default:
|
||||
$bTrue = false;
|
||||
$sResult = '/* @Error: unknown field value */ false';
|
||||
break;
|
||||
}
|
||||
|
||||
if (\in_array($oCondition->Field(), array(
|
||||
\RainLoop\Providers\Filters\Enumerations\ConditionField::FROM,
|
||||
\RainLoop\Providers\Filters\Enumerations\ConditionField::RECIPIENT
|
||||
)) && false !== \strpos($sValue, ','))
|
||||
if ($bTrue)
|
||||
{
|
||||
$self = $this;
|
||||
$aValue = \array_map(function ($sValue) use ($self) {
|
||||
return '"'.$self->quote(\trim($sValue)).'"';
|
||||
}, \explode(',', $sValue));
|
||||
if (\in_array($oCondition->Field(), array(
|
||||
\RainLoop\Providers\Filters\Enumerations\ConditionField::FROM,
|
||||
\RainLoop\Providers\Filters\Enumerations\ConditionField::RECIPIENT
|
||||
)) && false !== \strpos($sValue, ','))
|
||||
{
|
||||
$self = $this;
|
||||
$aValue = \array_map(function ($sValue) use ($self) {
|
||||
return '"'.$self->quote(\trim($sValue)).'"';
|
||||
}, \explode(',', $sValue));
|
||||
|
||||
$sResult .= ' ['.\trim(\implode(', ', $aValue)).']';
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult .= ' "'.$this->quote($sValue).'"';
|
||||
}
|
||||
$sResult .= ' ['.\trim(\implode(', ', $aValue)).']';
|
||||
}
|
||||
else if (\RainLoop\Providers\Filters\Enumerations\ConditionField::SIZE === $oCondition->Field())
|
||||
{
|
||||
$sResult .= ' '.$this->quote($sValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sResult .= ' "'.$this->quote($sValue).'"';
|
||||
}
|
||||
|
||||
$sResult = \preg_replace('/[\s]+/u', ' ', $sResult);
|
||||
$sResult = \preg_replace('/[\s]+/u', ' ', $sResult);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue