mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-07 16:37:02 +03:00
Merge STATUS related code into a trait
This commit is contained in:
parent
d952ec5930
commit
8d07ab87fa
6 changed files with 187 additions and 126 deletions
|
|
@ -17,6 +17,9 @@ namespace MailSo\Imap;
|
||||||
*/
|
*/
|
||||||
class Folder
|
class Folder
|
||||||
{
|
{
|
||||||
|
// RFC5258 Response data STATUS items when using LIST-EXTENDED
|
||||||
|
use Traits\Status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ namespace MailSo\Imap;
|
||||||
*/
|
*/
|
||||||
class FolderInformation
|
class FolderInformation
|
||||||
{
|
{
|
||||||
|
use Traits\Status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
|
|
@ -43,38 +45,6 @@ class FolderInformation
|
||||||
*/
|
*/
|
||||||
public $Exists = null;
|
public $Exists = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* https://datatracker.ietf.org/doc/html/rfc3501#section-7.3.2
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
public $Recent = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rfc3501 2.3.1.1
|
|
||||||
* A 32-bit value
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
public $Uidvalidity = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
public $Unread = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rfc3501 2.3.1.1
|
|
||||||
* A 32-bit value
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
public $Uidnext = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* rfc4551
|
|
||||||
* 1*DIGIT Positive unsigned 64-bit integer
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
public $HighestModSeq = null;
|
|
||||||
|
|
||||||
function __construct(string $sFolderName, bool $bIsWritable)
|
function __construct(string $sFolderName, bool $bIsWritable)
|
||||||
{
|
{
|
||||||
$this->FolderName = $sFolderName;
|
$this->FolderName = $sFolderName;
|
||||||
|
|
|
||||||
|
|
@ -209,39 +209,15 @@ class ResponseCollection extends \MailSo\Base\Collection
|
||||||
foreach ($this as $oResponse) {
|
foreach ($this as $oResponse) {
|
||||||
if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType &&
|
if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType &&
|
||||||
'STATUS' === $oResponse->StatusOrIndex &&
|
'STATUS' === $oResponse->StatusOrIndex &&
|
||||||
isset($oResponse->ResponseList[2]) &&
|
isset($oResponse->ResponseList[2]))
|
||||||
isset($oResponse->ResponseList[3]) &&
|
|
||||||
\is_array($oResponse->ResponseList[3]))
|
|
||||||
{
|
{
|
||||||
$sFolderNameRaw = $oResponse->ResponseList[2];
|
$sFolderNameRaw = $oResponse->ResponseList[2];
|
||||||
|
|
||||||
$oCurrentFolder = null;
|
|
||||||
foreach ($aReturn as $oFolder) {
|
foreach ($aReturn as $oFolder) {
|
||||||
if ($oFolder && $sFolderNameRaw === $oFolder->FullNameRaw()) {
|
if ($oFolder && $sFolderNameRaw === $oFolder->FullNameRaw()) {
|
||||||
$oCurrentFolder =& $oFolder;
|
$oFolder->setStatusFromResponse($oResponse);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null !== $oCurrentFolder) {
|
|
||||||
$sName = null;
|
|
||||||
$aStatus = array();
|
|
||||||
|
|
||||||
foreach ($oResponse->ResponseList[3] as $sArrayItem) {
|
|
||||||
if (null === $sName) {
|
|
||||||
$sName = $sArrayItem;
|
|
||||||
} else {
|
|
||||||
$aStatus[$sName] = $sArrayItem;
|
|
||||||
$sName = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 < count($aStatus)) {
|
|
||||||
$oCurrentFolder->SetExtended('STATUS', $aStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unset($oCurrentFolder);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -309,59 +285,36 @@ class ResponseCollection extends \MailSo\Base\Collection
|
||||||
return $aReturn;
|
return $aReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called by selectOrExamineFolder
|
||||||
|
*/
|
||||||
public function getCurrentFolderInformation(string $sFolderName, bool $bIsWritable) : FolderInformation
|
public function getCurrentFolderInformation(string $sFolderName, bool $bIsWritable) : FolderInformation
|
||||||
{
|
{
|
||||||
$oResult = new FolderInformation($sFolderName, $bIsWritable);
|
$oResult = new FolderInformation($sFolderName, $bIsWritable);
|
||||||
foreach ($this as $oResponse) {
|
foreach ($this as $oResponse) {
|
||||||
if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType) {
|
if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType) {
|
||||||
if (\count($oResponse->ResponseList) > 2 &&
|
if (!$oResult->setStatusFromResponse($oResponse)) {
|
||||||
'FLAGS' === $oResponse->ResponseList[1] && \is_array($oResponse->ResponseList[2]))
|
// OK untagged responses
|
||||||
{
|
if (\is_array($oResponse->OptionalResponse)) {
|
||||||
$oResult->Flags = $oResponse->ResponseList[2];
|
if (\count($oResponse->OptionalResponse) > 1) {
|
||||||
}
|
if ('PERMANENTFLAGS' === $oResponse->OptionalResponse[0] && \is_array($oResponse->OptionalResponse[1])) {
|
||||||
|
$oResult->PermanentFlags = $oResponse->OptionalResponse[1];
|
||||||
if (\is_array($oResponse->OptionalResponse)) {
|
}
|
||||||
if (\count($oResponse->OptionalResponse) > 1) {
|
} else if ('READ-ONLY' === $oResponse->OptionalResponse[0]) {
|
||||||
if ('PERMANENTFLAGS' === $oResponse->OptionalResponse[0]
|
// $oResult->IsWritable = false;
|
||||||
&& is_array($oResponse->OptionalResponse[1]))
|
} else if ('READ-WRITE' === $oResponse->OptionalResponse[0]) {
|
||||||
{
|
// $oResult->IsWritable = true;
|
||||||
$oResult->PermanentFlags = $oResponse->OptionalResponse[1];
|
} else if ('NOMODSEQ' === $key) {
|
||||||
|
// https://datatracker.ietf.org/doc/html/rfc4551#section-3.1.2
|
||||||
}
|
}
|
||||||
else if ('UIDVALIDITY' === $oResponse->OptionalResponse[0])
|
|
||||||
{
|
|
||||||
$oResult->Uidvalidity = (int) $oResponse->OptionalResponse[1];
|
|
||||||
}
|
|
||||||
else if ('UNSEEN' === $oResponse->OptionalResponse[0])
|
|
||||||
{
|
|
||||||
$oResult->Unread = (int) $oResponse->OptionalResponse[1];
|
|
||||||
}
|
|
||||||
else if ('UIDNEXT' === $oResponse->OptionalResponse[0])
|
|
||||||
{
|
|
||||||
$oResult->Uidnext = (int) $oResponse->OptionalResponse[1];
|
|
||||||
}
|
|
||||||
else if ('HIGHESTMODSEQ' === $oResponse->OptionalResponse[0])
|
|
||||||
{
|
|
||||||
$oResult->HighestModSeq = (int) $oResponse->OptionalResponse[1];
|
|
||||||
}
|
|
||||||
} else if ('READ-ONLY' === $oResponse->OptionalResponse[0]) {
|
|
||||||
// $oResult->IsWritable = false;
|
|
||||||
} else if ('READ-WRITE' === $oResponse->OptionalResponse[0]) {
|
|
||||||
// $oResult->IsWritable = true;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (\count($oResponse->ResponseList) > 2 &&
|
// untagged responses
|
||||||
\is_string($oResponse->ResponseList[2]) &&
|
else if (\count($oResponse->ResponseList) > 2) {
|
||||||
\is_numeric($oResponse->ResponseList[1]))
|
if ('FLAGS' === $oResponse->ResponseList[1] && \is_array($oResponse->ResponseList[2]))
|
||||||
{
|
{
|
||||||
switch ($oResponse->ResponseList[2])
|
$oResult->Flags = $oResponse->ResponseList[2];
|
||||||
{
|
}
|
||||||
case 'EXISTS':
|
|
||||||
$oResult->Exists = (int) $oResponse->ResponseList[1];
|
|
||||||
break;
|
|
||||||
case 'RECENT':
|
|
||||||
$oResult->Recent = (int) $oResponse->ResponseList[1];
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -456,24 +409,11 @@ class ResponseCollection extends \MailSo\Base\Collection
|
||||||
|
|
||||||
public function getStatusFolderInformationResult() : array
|
public function getStatusFolderInformationResult() : array
|
||||||
{
|
{
|
||||||
$aReturn = array();
|
$oInfo = new FolderInformation('', false);
|
||||||
foreach ($this as $oResponse) {
|
foreach ($this as $oResponse) {
|
||||||
if (\MailSo\Imap\Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType &&
|
$oInfo->setStatusFromResponse($oResponse);
|
||||||
'STATUS' === $oResponse->StatusOrIndex && isset($oResponse->ResponseList[3]) &&
|
|
||||||
\is_array($oResponse->ResponseList[3]))
|
|
||||||
{
|
|
||||||
$sName = null;
|
|
||||||
foreach ($oResponse->ResponseList[3] as $sArrayItem) {
|
|
||||||
if (null === $sName) {
|
|
||||||
$sName = $sArrayItem;
|
|
||||||
} else {
|
|
||||||
$aReturn[$sName] = $sArrayItem;
|
|
||||||
$sName = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return $aReturn;
|
return $oInfo->getStatusItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
149
snappymail/v/0.0.0/app/libraries/MailSo/Imap/Traits/Status.php
Normal file
149
snappymail/v/0.0.0/app/libraries/MailSo/Imap/Traits/Status.php
Normal file
|
|
@ -0,0 +1,149 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of MailSo.
|
||||||
|
*
|
||||||
|
* (c) 2021 DJMaze
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace MailSo\Imap\Traits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @category MailSo
|
||||||
|
* @package Imap
|
||||||
|
* @subpackage Traits
|
||||||
|
*
|
||||||
|
* https://datatracker.ietf.org/doc/html/rfc3501#section-6.3.10
|
||||||
|
* https://datatracker.ietf.org/doc/html/rfc4551#section-3.6
|
||||||
|
* https://datatracker.ietf.org/doc/html/rfc8474#section-4
|
||||||
|
*/
|
||||||
|
trait Status
|
||||||
|
{
|
||||||
|
public
|
||||||
|
/**
|
||||||
|
* The number of messages in the mailbox.
|
||||||
|
* This response is named EXISTS as a result of a SELECT or EXAMINE command.
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
$MESSAGES,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of messages with the \Recent flag set.
|
||||||
|
* This response also occurs as a result of a SELECT or EXAMINE command.
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
$RECENT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The next unique identifier value of the mailbox.
|
||||||
|
* A 32-bit value
|
||||||
|
* This response also occurs as a result of a SELECT or EXAMINE command.
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
$UIDNEXT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The unique identifier validity value of the mailbox.
|
||||||
|
* This response also occurs as a result of a SELECT or EXAMINE command.
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
$UIDVALIDITY,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of messages which do not have the \Seen flag set.
|
||||||
|
* This response also occurs as a result of a SELECT or EXAMINE command,
|
||||||
|
* but then it is the message sequence number of the first unseen message.
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
$UNSEEN,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC4551
|
||||||
|
* The highest mod-sequence value of all messages in the mailbox.
|
||||||
|
* This response also occurs as a result of a SELECT or EXAMINE command.
|
||||||
|
* @var int 1*DIGIT Positive unsigned 64-bit integer
|
||||||
|
*/
|
||||||
|
$HIGHESTMODSEQ,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC8474
|
||||||
|
* A server-allocated unique identifier for the mailbox.
|
||||||
|
* This response also occurs as a result of a CREATE, SELECT or EXAMINE command.
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
$MAILBOXID;
|
||||||
|
|
||||||
|
public function getStatusItems() : array
|
||||||
|
{
|
||||||
|
return \array_filter(\get_object_vars($this), function($v, $k){
|
||||||
|
return isset($v) && \property_exists(__TRAIT__, $k);
|
||||||
|
}, ARRAY_FILTER_USE_BOTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setStatus(string $name, $value) : bool
|
||||||
|
{
|
||||||
|
if ('EXISTS' === $name) {
|
||||||
|
$name = 'MESSAGES';
|
||||||
|
}
|
||||||
|
if (\property_exists(__TRAIT__, $name)) {
|
||||||
|
if ('MAILBOXID' !== $name) {
|
||||||
|
$value = (int) $value;
|
||||||
|
}
|
||||||
|
$this->$name = $value;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SELECT https://datatracker.ietf.org/doc/html/rfc3501#section-6.3.1
|
||||||
|
* EXAMINE https://datatracker.ietf.org/doc/html/rfc3501#section-6.3.2
|
||||||
|
* STATUS https://datatracker.ietf.org/doc/html/rfc3501#section-6.3.10
|
||||||
|
*
|
||||||
|
* getCurrentFolderInformation
|
||||||
|
* ResponseList[2] => EXISTS | RECENT
|
||||||
|
* OptionalResponse[0] => UNSEEN
|
||||||
|
* getStatusFolderInformationResult
|
||||||
|
* OptionalResponse[0] => HIGHESTMODSEQ
|
||||||
|
* ResponseList[1] => STATUS
|
||||||
|
* getFoldersResult LIST-EXTENDED
|
||||||
|
* ResponseList[1] => STATUS
|
||||||
|
*/
|
||||||
|
public function setStatusFromResponse(\MailSo\Imap\Response $oResponse) : bool
|
||||||
|
{
|
||||||
|
$bResult = false;
|
||||||
|
|
||||||
|
// OK untagged responses
|
||||||
|
if (\is_array($oResponse->OptionalResponse)) {
|
||||||
|
if (\count($oResponse->OptionalResponse) > 1) {
|
||||||
|
$bResult = $this->setStatus($oResponse->OptionalResponse[0], $oResponse->OptionalResponse[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// untagged responses
|
||||||
|
else if (\count($oResponse->ResponseList) > 2) {
|
||||||
|
// LIST or STATUS command
|
||||||
|
if ('STATUS' === $oResponse->ResponseList[1]
|
||||||
|
&& isset($oResponse->ResponseList[3])
|
||||||
|
&& \is_array($oResponse->ResponseList[3])) {
|
||||||
|
$c = \count($oResponse->ResponseList[3]);
|
||||||
|
for ($i = 0; $i < $c; $i += 2) {
|
||||||
|
$bResult |= $this->setStatus(
|
||||||
|
$oResponse->ResponseList[3][$i],
|
||||||
|
$oResponse->ResponseList[3][$i+1]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// SELECT or EXAMINE command
|
||||||
|
else if (\is_numeric($oResponse->ResponseList[1]) && \is_string($oResponse->ResponseList[2])) {
|
||||||
|
$bResult = $this->setStatus($oResponse->ResponseList[2], $oResponse->ResponseList[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $bResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -175,12 +175,9 @@ class Folder implements \JsonSerializable
|
||||||
return $this->bExists && $this->oImapFolder->IsSelectable();
|
return $this->bExists && $this->oImapFolder->IsSelectable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function Status() : array
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function Status()
|
|
||||||
{
|
{
|
||||||
return $this->oImapFolder->GetExtended('STATUS');
|
return $this->oImapFolder->getStatusItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function IsInbox() : bool
|
public function IsInbox() : bool
|
||||||
|
|
@ -191,6 +188,7 @@ class Folder implements \JsonSerializable
|
||||||
public function GetFolderListType() : int
|
public function GetFolderListType() : int
|
||||||
{
|
{
|
||||||
$aFlags = $this->oImapFolder->FlagsLowerCase();
|
$aFlags = $this->oImapFolder->FlagsLowerCase();
|
||||||
|
// RFC 6154
|
||||||
// $aFlags[] = \strtolower($this->oImapFolder->GetMetadata(MetadataKeys::SPECIALUSE));
|
// $aFlags[] = \strtolower($this->oImapFolder->GetMetadata(MetadataKeys::SPECIALUSE));
|
||||||
|
|
||||||
switch (true)
|
switch (true)
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,7 @@ class MailClient
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($oFolderInfo && 0 < $oFolderInfo->Exists)
|
if ($oFolderInfo && 0 < $oFolderInfo->MESSAGES)
|
||||||
{
|
{
|
||||||
$sStoreAction = $bSetAction
|
$sStoreAction = $bSetAction
|
||||||
? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT
|
? \MailSo\Imap\Enumerations\StoreAction::ADD_FLAGS_SILENT
|
||||||
|
|
@ -1935,6 +1935,7 @@ class MailClient
|
||||||
}
|
}
|
||||||
|
|
||||||
$aFolders = $this->oImapClient->FolderList($sParent, $sListPattern);
|
$aFolders = $this->oImapClient->FolderList($sParent, $sListPattern);
|
||||||
|
// $aFolders = $this->oImapClient->FolderStatusList($sParent, $sListPattern);
|
||||||
if (!$aFolders) {
|
if (!$aFolders) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
@ -2210,7 +2211,7 @@ class MailClient
|
||||||
$this->oImapClient->FolderSelect($sFolderFullNameRaw);
|
$this->oImapClient->FolderSelect($sFolderFullNameRaw);
|
||||||
|
|
||||||
$oFolderInformation = $this->oImapClient->FolderCurrentInformation();
|
$oFolderInformation = $this->oImapClient->FolderCurrentInformation();
|
||||||
if ($oFolderInformation && $oFolderInformation->Exists && 0 < $oFolderInformation->Exists) // STATUS?
|
if ($oFolderInformation && 0 < $oFolderInformation->MESSAGES)
|
||||||
{
|
{
|
||||||
$this->oImapClient->MessageStoreFlag('1:*', false,
|
$this->oImapClient->MessageStoreFlag('1:*', false,
|
||||||
array(\MailSo\Imap\Enumerations\MessageFlag::DELETED),
|
array(\MailSo\Imap\Enumerations\MessageFlag::DELETED),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue