diff --git a/lib/Account.php b/lib/Account.php index 7f63d042864a0faabfb5ee6570699ece77e6c307..456fac53119250a5de66dc16c9e1f6a73827de31 100644 --- a/lib/Account.php +++ b/lib/Account.php @@ -185,8 +185,7 @@ class Account implements JsonSerializable { public function getMailbox($folderId) { return new Mailbox( $this->getImapConnection(), - new Horde_Imap_Client_Mailbox($folderId), - [] + new Horde_Imap_Client_Mailbox($folderId) ); } diff --git a/lib/Mailbox.php b/lib/Mailbox.php index 98e5f8f80aceefcade941932730bad918367ef8e..777f82ee4cbecb1989fb90433afd3a10ef37f709 100644 --- a/lib/Mailbox.php +++ b/lib/Mailbox.php @@ -32,7 +32,6 @@ namespace OCA\Mail; use Horde_Imap_Client; -use Horde_Imap_Client_Exception; use Horde_Imap_Client_Mailbox; use Horde_Imap_Client_Socket; use OCA\Mail\Model\IMAPMessage; @@ -44,26 +43,6 @@ class Mailbox { */ protected $conn; - /** - * @var array - */ - private $attributes; - - /** - * @var string - */ - private $specialRole; - - /** - * @var string - */ - private $displayName; - - /** - * @var string - */ - private $delimiter; - /** * @var Horde_Imap_Client_Mailbox */ @@ -72,26 +51,10 @@ class Mailbox { /** * @param Horde_Imap_Client_Socket $conn * @param Horde_Imap_Client_Mailbox $mailBox - * @param array $attributes - * @param string $delimiter */ - public function __construct($conn, $mailBox, $attributes, $delimiter = '/') { + public function __construct($conn, $mailBox) { $this->conn = $conn; $this->mailBox = $mailBox; - $this->attributes = $attributes; - $this->delimiter = $delimiter; - $this->getSpecialRoleFromAttributes(); - if ($this->specialRole === null) { - $this->guessSpecialRole(); - } - $this->makeDisplayName(); - } - - /** - * @return array - */ - public function attributes() { - return $this->attributes; } /** @@ -104,195 +67,6 @@ class Mailbox { return new IMAPMessage($this->conn, $this->mailBox, $uid, null, $loadHtmlMessageBody); } - /** - * @return array - */ - public function getStatus(int $flags = Horde_Imap_Client::STATUS_ALL): array { - return $this->conn->status($this->mailBox, $flags); - } - - /** - * @return int - */ - public function getTotalMessages() { - $status = $this->getStatus(\Horde_Imap_Client::STATUS_MESSAGES); - return (int) $status['messages']; - } - - protected function makeDisplayName(): void { - $parts = explode($this->delimiter, $this->mailBox->utf8, 2); - - if (count($parts) > 1) { - $displayName = $parts[1]; - } elseif (strtolower($this->mailBox->utf8) === 'inbox') { - $displayName = 'Inbox'; - } else { - $displayName = $this->mailBox->utf8; - } - - $this->displayName = $displayName; - } - - public function getFolderId(): string { - return $this->mailBox->utf8; - } - - /** - * @return null|string - */ - public function getParent(): ?string { - $folderId = $this->getFolderId(); - $parts = explode($this->delimiter, $folderId, 2); - - if (count($parts) > 1) { - return $parts[0]; - } - - return null; - } - - /** - * @return string - */ - public function getSpecialRole() { - return $this->specialRole; - } - - /** - * @return string - */ - public function getDisplayName() { - return $this->displayName; - } - - /** - * @param string $displayName - * - * @return void - */ - public function setDisplayName($displayName): void { - $this->displayName = $displayName; - } - - /** - * @param integer $accountId - * @return array - */ - public function serialize($accountId, $status = null) { - $displayName = $this->getDisplayName(); - try { - if (is_null($status)) { - $status = $this->getStatus(); - } - $total = $status['messages']; - $specialRole = $this->getSpecialRole(); - $unseen = ($specialRole === 'trash') ? 0 : $status['unseen']; - $isEmpty = ($total === 0); - $noSelect = in_array('\\noselect', $this->attributes); - $parentId = $this->getParent(); - $parentId = ($parentId !== null) ? base64_encode($parentId) : null; - return [ - 'id' => base64_encode($this->getFolderId()), - 'parent' => $parentId, - 'name' => $displayName, - 'specialRole' => $specialRole, - 'unseen' => $unseen, - 'total' => $total, - 'isEmpty' => $isEmpty, - 'accountId' => $accountId, - 'noSelect' => $noSelect, - 'uidvalidity' => $status['uidvalidity'], - 'uidnext' => $status['uidnext'], - 'delimiter' => $this->delimiter - ]; - } catch (Horde_Imap_Client_Exception $e) { - return [ - 'id' => base64_encode($this->getFolderId()), - 'parent' => null, - 'name' => $displayName, - 'specialRole' => null, - 'unseen' => 0, - 'total' => 0, - 'error' => $e->getMessage(), - 'isEmpty' => true, - 'accountId' => $accountId, - 'noSelect' => true - ]; - } - } - - /** - * Get the special use role of the mailbox - * - * This method reads the attributes sent by the server - * - * @return void - */ - protected function getSpecialRoleFromAttributes(): void { - /* - * @todo: support multiple attributes on same folder - * "any given server or message store may support - * any combination of the attributes" - * https://tools.ietf.org/html/rfc6154 - */ - $result = null; - if (is_array($this->attributes)) { - /* Convert attributes to lowercase, because gmail - * returns them as lowercase (eg. \trash and not \Trash) - */ - $specialUseAttributes = [ - strtolower(Horde_Imap_Client::SPECIALUSE_ALL), - strtolower(Horde_Imap_Client::SPECIALUSE_ARCHIVE), - strtolower(Horde_Imap_Client::SPECIALUSE_DRAFTS), - strtolower(Horde_Imap_Client::SPECIALUSE_FLAGGED), - strtolower(Horde_Imap_Client::SPECIALUSE_JUNK), - strtolower(Horde_Imap_Client::SPECIALUSE_SENT), - strtolower(Horde_Imap_Client::SPECIALUSE_TRASH) - ]; - - $attributes = array_map(function ($n) { - return strtolower($n); - }, $this->attributes); - - foreach ($specialUseAttributes as $attr) { - if (in_array($attr, $attributes)) { - $result = ltrim($attr, '\\'); - break; - } - } - } - - $this->specialRole = $result; - } - - /** - * Assign a special role to this mailbox based on its name - * - * @return void - */ - protected function guessSpecialRole(): void { - $specialFoldersDict = [ - 'inbox' => ['inbox'], - 'sent' => ['sent', 'sent items', 'sent messages', 'sent-mail', 'sentmail'], - 'drafts' => ['draft', 'drafts'], - 'archive' => ['archive', 'archives'], - 'trash' => ['deleted messages', 'trash'], - 'junk' => ['junk', 'spam', 'bulk mail'], - ]; - - $lowercaseExplode = explode($this->delimiter, $this->getFolderId(), 2); - $lowercaseId = strtolower(array_pop($lowercaseExplode)); - $result = null; - foreach ($specialFoldersDict as $specialRole => $specialNames) { - if (in_array($lowercaseId, $specialNames)) { - $result = $specialRole; - break; - } - } - - $this->specialRole = $result; - } - /** * @param int $messageUid * @param string $attachmentId diff --git a/tests/Integration/IMAP/AbstractTest.php b/tests/Integration/IMAP/AbstractTest.php index 2d28c9702de3b628293ab3d29a7936c91616385c..bbaaddf46a398ccd03032f3bbc98c401fda329e1 100644 --- a/tests/Integration/IMAP/AbstractTest.php +++ b/tests/Integration/IMAP/AbstractTest.php @@ -105,9 +105,8 @@ abstract class AbstractTest extends TestCase { * @param string $name */ public function existsMailBox($name) { - $mb = $this->getTestAccount()->getMailbox($name); try { - $mb->getStatus(); + self::$account->getImapConnection()->status($name); return true; } catch (Exception $ex) { return false;