This commit is contained in:
the-djmaze 2023-03-03 10:50:53 +01:00
parent 1663cc6ce5
commit dae15e26d8
3 changed files with 29 additions and 22 deletions

View file

@ -172,6 +172,10 @@ trait Folders
$bReselect = false; $bReselect = false;
$bWritable = false; $bWritable = false;
if ($oFolderInfo && $sFolderName === $oFolderInfo->FolderName) { if ($oFolderInfo && $sFolderName === $oFolderInfo->FolderName) {
if ($oFolderInfo->hasStatus) {
return $oFolderInfo;
}
/** /**
* There's a long standing IMAP CLIENTBUG where STATUS command is executed * There's a long standing IMAP CLIENTBUG where STATUS command is executed
* after SELECT/EXAMINE on same folder (it should not). * after SELECT/EXAMINE on same folder (it should not).
@ -196,19 +200,20 @@ trait Folders
if ($bReselect || $bSelect) { if ($bReselect || $bSelect) {
// Don't use FolderExamine, else PERMANENTFLAGS is empty in Dovecot // Don't use FolderExamine, else PERMANENTFLAGS is empty in Dovecot
$oFolderInformation = $this->selectOrExamineFolder($sFolderName, $bSelect || $bWritable, false); $oFolderInfo = $this->selectOrExamineFolder($sFolderName, $bSelect || $bWritable, false);
$oFolderInformation->MESSAGES = \max(0, $oFolderInformation->MESSAGES, $oInfo->MESSAGES); $oFolderInfo->MESSAGES = \max(0, $oFolderInfo->MESSAGES, $oInfo->MESSAGES);
// SELECT or EXAMINE command then UNSEEN is the message sequence number of the first unseen message. // SELECT or EXAMINE command then UNSEEN is the message sequence number of the first unseen message.
// And deprecated in IMAP4rev2, so we set it to the amount of unseen messages // And deprecated in IMAP4rev2, so we set it to the amount of unseen messages
$oFolderInformation->UNSEEN = \max(0, $oInfo->UNSEEN); $oFolderInfo->UNSEEN = \max(0, $oInfo->UNSEEN);
$oFolderInformation->UIDNEXT = \max(0, $oFolderInformation->UIDNEXT, $oInfo->UIDNEXT); $oFolderInfo->UIDNEXT = \max(0, $oFolderInfo->UIDNEXT, $oInfo->UIDNEXT);
$oFolderInformation->UIDVALIDITY = \max(0, $oFolderInformation->UIDVALIDITY, $oInfo->UIDVALIDITY); $oFolderInfo->UIDVALIDITY = \max(0, $oFolderInfo->UIDVALIDITY, $oInfo->UIDVALIDITY);
$oFolderInformation->HIGHESTMODSEQ = \max(0, $oInfo->HIGHESTMODSEQ); $oFolderInfo->HIGHESTMODSEQ = \max(0, $oInfo->HIGHESTMODSEQ);
$oFolderInformation->APPENDLIMIT = \max(0, $oFolderInformation->APPENDLIMIT, $oInfo->APPENDLIMIT); $oFolderInfo->APPENDLIMIT = \max(0, $oFolderInfo->APPENDLIMIT, $oInfo->APPENDLIMIT);
$oFolderInformation->MAILBOXID = $oFolderInformation->MAILBOXID ?: $oInfo->MAILBOXID; $oFolderInfo->MAILBOXID = $oFolderInfo->MAILBOXID ?: $oInfo->MAILBOXID;
// $oFolderInformation->SIZE = \max($oFolderInformation->SIZE, $oInfo->SIZE); // $oFolderInfo->SIZE = \max($oFolderInfo->SIZE, $oInfo->SIZE);
// $oFolderInformation->RECENT = \max(0, $oFolderInformation->RECENT, $oInfo->RECENT); // $oFolderInfo->RECENT = \max(0, $oFolderInfo->RECENT, $oInfo->RECENT);
return $oFolderInformation; $oFolderInfo->hasStatus = $oInfo->hasStatus;
return $oFolderInfo;
} }
return $oInfo; return $oInfo;
@ -258,19 +263,16 @@ trait Folders
if ($this->IsSelected()) { if ($this->IsSelected()) {
if ($this->hasCapability('UNSELECT')) { if ($this->hasCapability('UNSELECT')) {
$this->SendRequestGetResponse('UNSELECT'); $this->SendRequestGetResponse('UNSELECT');
$this->oCurrentFolderInfo = null;
} else { } else {
try { try {
$this->SendRequestGetResponse('SELECT', ['""']); $this->SendRequestGetResponse('SELECT', ['""']);
// * OK [CLOSED] Previous mailbox closed. // * OK [CLOSED] Previous mailbox closed.
// 3 NO [CANNOT] Invalid mailbox name: Name is empty // 3 NO [CANNOT] Invalid mailbox name: Name is empty
} catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) {
if ('NO' === $oException->GetResponseStatus()) {
$this->oCurrentFolderInfo = null;
}
} }
} }
} }
$this->oCurrentFolderInfo = null;
} }
/** /**
@ -315,9 +317,9 @@ trait Folders
* @throws \MailSo\Net\Exceptions\* * @throws \MailSo\Net\Exceptions\*
* @throws \MailSo\Imap\Exceptions\* * @throws \MailSo\Imap\Exceptions\*
*/ */
public function FolderSelect(string $sFolderName, bool $bReSelectSameFolders = false) : FolderInformation public function FolderSelect(string $sFolderName, bool $bForceReselect = false) : FolderInformation
{ {
return $this->selectOrExamineFolder($sFolderName, true, $bReSelectSameFolders); return $this->selectOrExamineFolder($sFolderName, true, $bForceReselect);
} }
/** /**
@ -331,9 +333,9 @@ trait Folders
* @throws \MailSo\Net\Exceptions\* * @throws \MailSo\Net\Exceptions\*
* @throws \MailSo\Imap\Exceptions\* * @throws \MailSo\Imap\Exceptions\*
*/ */
public function FolderExamine(string $sFolderName, bool $bReSelectSameFolders = false) : FolderInformation public function FolderExamine(string $sFolderName, bool $bForceReselect = false) : FolderInformation
{ {
return $this->selectOrExamineFolder($sFolderName, $this->Settings->force_select, $bReSelectSameFolders); return $this->selectOrExamineFolder($sFolderName, $this->Settings->force_select, $bForceReselect);
} }
/** /**
@ -345,9 +347,9 @@ trait Folders
* REQUIRED IMAP4rev2 untagged responses: FLAGS, EXISTS, LIST * REQUIRED IMAP4rev2 untagged responses: FLAGS, EXISTS, LIST
* REQUIRED IMAP4rev2 OK untagged responses: PERMANENTFLAGS, UIDNEXT, UIDVALIDITY * REQUIRED IMAP4rev2 OK untagged responses: PERMANENTFLAGS, UIDNEXT, UIDVALIDITY
*/ */
protected function selectOrExamineFolder(string $sFolderName, bool $bIsWritable, bool $bReSelectSameFolders) : FolderInformation protected function selectOrExamineFolder(string $sFolderName, bool $bIsWritable, bool $bForceReselect) : FolderInformation
{ {
if (!$bReSelectSameFolders if (!$bForceReselect
&& $this->oCurrentFolderInfo && $this->oCurrentFolderInfo
&& $sFolderName === $this->oCurrentFolderInfo->FolderName && $sFolderName === $this->oCurrentFolderInfo->FolderName
&& ($bIsWritable === $this->oCurrentFolderInfo->IsWritable || $this->oCurrentFolderInfo->IsWritable) && ($bIsWritable === $this->oCurrentFolderInfo->IsWritable || $this->oCurrentFolderInfo->IsWritable)

View file

@ -24,6 +24,8 @@ trait Status
{ {
public string $FolderName; public string $FolderName;
public bool $hasStatus = false;
public public
/** /**
* The number of messages in the mailbox. * The number of messages in the mailbox.
@ -110,7 +112,7 @@ trait Status
])); ]));
} }
public function setStatus(string $name, $value) : bool private function setStatus(string $name, $value) : bool
{ {
if ('EXISTS' === $name) { if ('EXISTS' === $name) {
$name = 'MESSAGES'; $name = 'MESSAGES';
@ -165,6 +167,7 @@ trait Status
$oResponse->ResponseList[3][$i+1] $oResponse->ResponseList[3][$i+1]
); );
} }
$this->hasStatus = $bResult;
} }
// SELECT or EXAMINE command // SELECT or EXAMINE command
else if (\is_numeric($oResponse->ResponseList[1]) && \is_string($oResponse->ResponseList[2])) { else if (\is_numeric($oResponse->ResponseList[1]) && \is_string($oResponse->ResponseList[2])) {

View file

@ -603,6 +603,8 @@ class MailClient
} }
} }
$this->oImapClient->FolderExamine($sFolderName);
$aResultUids = []; $aResultUids = [];
if ($bUseSort) { if ($bUseSort) {
$aSortTypes = []; $aSortTypes = [];