From b52d648895ce1abc38429a02bd80d3255414a812 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Wed, 21 Sep 2016 15:06:17 +0200 Subject: [PATCH 1/3] use JsonSerializable for accounts --- lib/account.php | 28 ++++++++++++---------- lib/controller/folderscontroller.php | 2 +- lib/service/iaccount.php | 9 ++----- lib/service/unifiedaccount.php | 6 ++--- tests/controller/folderscontrollertest.php | 2 +- tests/imap/accounttest.php | 2 +- 6 files changed, 22 insertions(+), 27 deletions(-) diff --git a/lib/account.php b/lib/account.php index 53b17853c6..2a2163892d 100644 --- a/lib/account.php +++ b/lib/account.php @@ -33,27 +33,30 @@ namespace OCA\Mail; +use Horde_Imap_Client; +use Horde_Imap_Client_Exception; use Horde_Imap_Client_Ids; use Horde_Imap_Client_Mailbox; use Horde_Imap_Client_Socket; -use Horde_Imap_Client; use Horde_Mail_Rfc822_Address; +use Horde_Mail_Rfc822_List; use Horde_Mail_Transport; use Horde_Mail_Transport_Mail; use Horde_Mail_Transport_Smtphorde; use Horde_Mime_Headers_Date; use Horde_Mime_Mail; use Horde_Mime_Part; +use OC; use OCA\Mail\Cache\Cache; +use OCA\Mail\Db\Alias; use OCA\Mail\Db\MailAccount; use OCA\Mail\Model\IMessage; use OCA\Mail\Model\Message; use OCA\Mail\Model\ReplyMessage; use OCA\Mail\Service\IAccount; -use OCP\IConfig; use OCP\ICacheFactory; +use OCP\IConfig; use OCP\Security\ICrypto; -use OCA\Mail\Db\Alias; class Account implements IAccount { @@ -84,9 +87,9 @@ class Account implements IAccount { public function __construct(MailAccount $account) { $this->account = $account; $this->mailboxes = null; - $this->crypto = \OC::$server->getCrypto(); - $this->config = \OC::$server->getConfig(); - $this->memcacheFactory = \OC::$server->getMemcacheFactory(); + $this->crypto = OC::$server->getCrypto(); + $this->config = OC::$server->getConfig(); + $this->memcacheFactory = OC::$server->getMemcacheFactory(); $this->alias = null; } @@ -312,7 +315,7 @@ protected function listMailboxes($pattern = '*') { /** * @param string $folderId - * @return \OCA\Mail\Mailbox + * @return Mailbox */ public function getMailbox($folderId) { $conn = $this->getImapConnection(); @@ -343,8 +346,7 @@ public function getMailboxes() { /** * @return array */ - public function getListArray() { - + public function jsonSerialize() { $folders = []; $mailBoxes = $this->getMailboxes(); $mailBoxNames = array_map(function($mb) { @@ -505,13 +507,13 @@ public function deleteMessage($sourceFolderId, $messageId) { $this->getImapConnection()->expunge($hordeSourceMailBox, array('ids' => $hordeMessageIds, 'delete' => true)); - \OC::$server->getLogger()->info("Message expunged: {message} from mailbox {mailbox}", + OC::$server->getLogger()->info("Message expunged: {message} from mailbox {mailbox}", array('message' => $messageId, 'mailbox' => $sourceFolderId)); } else { $this->getImapConnection()->copy($hordeSourceMailBox, $hordeTrashMailBox, array('create' => $createTrash, 'move' => true, 'ids' => $hordeMessageIds)); - \OC::$server->getLogger()->info("Message moved to trash: {message} from mailbox {mailbox}", + OC::$server->getLogger()->info("Message moved to trash: {message} from mailbox {mailbox}", array('message' => $messageId, 'mailbox' => $sourceFolderId, 'app' => 'mail')); } } @@ -586,7 +588,7 @@ protected function getSpecialFolder($role, $guessBest=true) { */ protected function localizeSpecialMailboxes() { - $l = \OC::$server->getL10N('mail'); + $l = OC::$server->getL10N('mail'); $map = [ // TRANSLATORS: translated mail box name 'inbox' => $l->t('Inbox'), @@ -738,7 +740,7 @@ public function getChangedMailboxes($query) { } /** - * @throws \Horde_Imap_Client_Exception + * @throws Horde_Imap_Client_Exception */ public function reconnect() { $this->mailboxes = null; diff --git a/lib/controller/folderscontroller.php b/lib/controller/folderscontroller.php index 48937c8031..a014247dfa 100644 --- a/lib/controller/folderscontroller.php +++ b/lib/controller/folderscontroller.php @@ -59,7 +59,7 @@ public function __construct($appName, IRequest $request, AccountService $account */ public function index($accountId) { $account = $this->accountService->find($this->currentUserId, $accountId); - $json = $account->getListArray(); + $json = $account->jsonSerialize(); $folders = array_filter($json['folders'], function($folder){ return is_null($folder['parent']); diff --git a/lib/service/iaccount.php b/lib/service/iaccount.php index fb53df8eb7..2515f4663c 100644 --- a/lib/service/iaccount.php +++ b/lib/service/iaccount.php @@ -21,21 +21,16 @@ */ namespace OCA\Mail\Service; +use JsonSerializable; use OCA\Mail\Model\IMessage; -interface IAccount { +interface IAccount extends JsonSerializable { /** * @return array */ public function getConfiguration(); - /** - * @return array - * TODO: function name is :hankey: - */ - public function getListArray(); - /** * @param $folderId * @return IMailbox diff --git a/lib/service/unifiedaccount.php b/lib/service/unifiedaccount.php index f31cb52eee..17b505ee20 100644 --- a/lib/service/unifiedaccount.php +++ b/lib/service/unifiedaccount.php @@ -63,14 +63,12 @@ public function getConfiguration() { /** * @return array - * TODO: function name is :hankey: */ - public function getListArray() { - $inbox = $this->buildInbox(); + public function jsonSerialize() { return [ 'id' => UnifiedAccount::ID, 'email' => '', - 'folders' => [$inbox], + 'folders' => [$this->buildInbox()], 'specialFolders' => [], 'delimiter' => '.', ]; diff --git a/tests/controller/folderscontrollertest.php b/tests/controller/folderscontrollertest.php index 3d39e9746a..dc72550eee 100644 --- a/tests/controller/folderscontrollertest.php +++ b/tests/controller/folderscontrollertest.php @@ -74,7 +74,7 @@ public function testIndex($data) { ->with($this->userId, $accountId) ->will($this->returnValue($account)); $account->expects($this->once()) - ->method('getListArray') + ->method('jsonSerialize') ->will($this->returnValue($data)); $this->controller->index($accountId); diff --git a/tests/imap/accounttest.php b/tests/imap/accounttest.php index 9f89e31a9c..bf240b166a 100644 --- a/tests/imap/accounttest.php +++ b/tests/imap/accounttest.php @@ -53,7 +53,7 @@ public function providesMailBoxNames() { public function testListMailBoxes($name) { $name = uniqid($name); $this->createMailBox($name); - $mailBoxes = $this->getTestAccount()->getListArray(); + $mailBoxes = $this->getTestAccount()->jsonSerialize(); $this->assertInternalType('array', $mailBoxes); $m = array_filter($mailBoxes['folders'], function($item) use ($name) { From efc67c6b4208e7aebcc607d1223bfe2b049810e1 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Wed, 21 Sep 2016 15:27:55 +0200 Subject: [PATCH 2/3] Mailbox::getListArray -> Mailbox::serialize --- lib/account.php | 4 ++-- lib/mailbox.php | 2 +- lib/service/imailbox.php | 3 ++- lib/service/unifiedmailbox.php | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/account.php b/lib/account.php index 2a2163892d..b9d2488355 100644 --- a/lib/account.php +++ b/lib/account.php @@ -360,7 +360,7 @@ public function jsonSerialize() { $status = $this->getImapConnection()->status($mailBoxNames); foreach ($mailBoxes as $mailbox) { $s = isset($status[$mailbox->getFolderId()]) ? $status[$mailbox->getFolderId()] : null; - $folders[] = $mailbox->getListArray($this->getId(), $s); + $folders[] = $mailbox->serialize($this->getId(), $s); } $delimiter = reset($folders)['delimiter']; return [ @@ -725,7 +725,7 @@ public function getChangedMailboxes($query) { $newMessages = $m->getMessagesSince($uidNext, $s['uidnext']); // only trigger updates in case new messages are actually available if (!empty($newMessages)) { - $changedBoxes[$folderId] = $m->getListArray($this->getId(), $s); + $changedBoxes[$folderId] = $m->serialize($this->getId(), $s); $changedBoxes[$folderId]['messages'] = $newMessages; $newUnreadMessages = array_filter($newMessages, function($m) { return $m['flags']['unseen']; diff --git a/lib/mailbox.php b/lib/mailbox.php index 16c7ed97a3..fbcce79796 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -288,7 +288,7 @@ public function setDisplayName($displayName) { * @param integer $accountId * @return array */ - public function getListArray($accountId, $status = null) { + public function serialize($accountId, $status = null) { $displayName = $this->getDisplayName(); try { if (is_null($status)) { diff --git a/lib/service/imailbox.php b/lib/service/imailbox.php index e2e0416250..76b9fb96c3 100644 --- a/lib/service/imailbox.php +++ b/lib/service/imailbox.php @@ -21,6 +21,7 @@ */ namespace OCA\Mail\Service; +use Horde_Imap_Client_Search_Query; use OCA\Mail\Attachment; use OCA\Mail\Message; @@ -34,7 +35,7 @@ public function getFolderId(); /** * @param int $from * @param int $count - * @param string|\Horde_Imap_Client_Search_Query $filter + * @param string|Horde_Imap_Client_Search_Query $filter * @return array */ public function getMessages($from, $count, $filter); diff --git a/lib/service/unifiedmailbox.php b/lib/service/unifiedmailbox.php index c9bde9c263..34c68f2049 100644 --- a/lib/service/unifiedmailbox.php +++ b/lib/service/unifiedmailbox.php @@ -153,4 +153,5 @@ private function resolve($messageId) { $messageId = $data[1]; return array($inbox, $messageId, $account); } + } From 488a5eb22239410669657be59699c3e1879a1413 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Wed, 21 Sep 2016 15:32:04 +0200 Subject: [PATCH 3/3] IMAPMessage::getListArray -> JsonSerializable::jsonSerialize --- lib/mailbox.php | 2 +- lib/model/imapmessage.php | 85 ++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/lib/mailbox.php b/lib/mailbox.php index fbcce79796..cf80360838 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -187,7 +187,7 @@ public function getMessages($from = 0, $count = 2, $filter = '') { foreach ($headers->ids() as $message_id) { $header = $headers[$message_id]; $message = new IMAPMessage($this->conn, $this->mailBox, $message_id, $header); - $messages[] = $message->getListArray(); + $messages[] = $message->jsonSerialize(); } ob_get_clean(); diff --git a/lib/model/imapmessage.php b/lib/model/imapmessage.php index 646f2a259d..129ce2afbe 100644 --- a/lib/model/imapmessage.php +++ b/lib/model/imapmessage.php @@ -29,14 +29,23 @@ use Closure; use Exception; use Horde_Imap_Client; +use Horde_Imap_Client_Data_Envelope; use Horde_Imap_Client_Data_Fetch; +use Horde_Imap_Client_DateTime; +use Horde_Imap_Client_Fetch_Query; +use Horde_Imap_Client_Ids; +use Horde_Imap_Client_Mailbox; +use Horde_Imap_Client_Socket; use Horde_Mail_Rfc822_List; -use OCP\Files\File; +use Horde_Mime_Part; +use JsonSerializable; +use OC; use OCA\Mail\Service\Html; use OCP\AppFramework\Db\DoesNotExistException; +use OCP\Files\File; use OCP\Util; -class IMAPMessage implements IMessage { +class IMAPMessage implements IMessage, JsonSerializable { use ConvertAddresses; @@ -49,8 +58,8 @@ class IMAPMessage implements IMessage { private $uid; /** - * @param \Horde_Imap_Client_Socket|null $conn - * @param \Horde_Imap_Client_Mailbox $mailBox + * @param Horde_Imap_Client_Socket|null $conn + * @param Horde_Imap_Client_Mailbox $mailBox * @param integer $messageId * @param \Horde_Imap_Client_Data_Fetch|null $fetch * @param boolean $loadHtmlMessage @@ -65,8 +74,8 @@ public function __construct($conn, $mailBox, $messageId, $fetch=null, $this->htmlService = $htmlService; if (is_null($htmlService)) { - $urlGenerator = \OC::$server->getURLGenerator(); - $request = \OC::$server->getRequest(); + $urlGenerator = OC::$server->getURLGenerator(); + $request = OC::$server->getRequest(); $this->htmlService = new Html($urlGenerator, $request); } @@ -86,12 +95,12 @@ public function __construct($conn, $mailBox, $messageId, $fetch=null, private $hasHtmlMessage = false; /** - * @var \Horde_Imap_Client_Socket + * @var Horde_Imap_Client_Socket */ private $conn; /** - * @var \Horde_Imap_Client_Mailbox + * @var Horde_Imap_Client_Mailbox */ private $mailBox; private $messageId; @@ -144,7 +153,7 @@ public function setFlags(array $flags) { } /** - * @return \Horde_Imap_Client_Data_Envelope + * @return Horde_Imap_Client_Data_Envelope */ public function getEnvelope() { return $this->fetch->getEnvelope(); @@ -296,7 +305,7 @@ public function setSubject($subject) { } /** - * @return \Horde_Imap_Client_DateTime + * @return Horde_Imap_Client_DateTime */ public function getSentDate() { return $this->fetch->getImapDate(); @@ -307,13 +316,13 @@ public function getSize() { } /** - * @param \Horde_Mime_Part $part + * @param Horde_Mime_Part $part * @return bool */ private function hasAttachments($part) { foreach($part->getParts() as $p) { /** - * @var \Horde_Mime_Part $p + * @var Horde_Mime_Part $p */ $filename = $p->getName(); @@ -339,7 +348,7 @@ private function hasAttachments($part) { private function loadMessageBodies() { $headers = []; - $fetch_query = new \Horde_Imap_Client_Fetch_Query(); + $fetch_query = new Horde_Imap_Client_Fetch_Query(); $fetch_query->envelope(); $fetch_query->structure(); $fetch_query->flags(); @@ -359,7 +368,7 @@ private function loadMessageBodies() { ]); // $list is an array of Horde_Imap_Client_Data_Fetch objects. - $ids = new \Horde_Imap_Client_Ids($this->messageId); + $ids = new Horde_Imap_Client_Ids($this->messageId); $headers = $this->conn->fetch($this->mailBox, $fetch_query, ['ids' => $ids]); /** @var $fetch \Horde_Imap_Client_Data_Fetch */ $fetch = $headers[$this->messageId]; @@ -452,7 +461,7 @@ private function getPart($p, $partNo) { public function getFullMessage($ownMail, $specialRole=null) { $mailBody = $this->plainMessage; - $data = $this->getListArray(); + $data = $this->jsonSerialize(); if ($this->hasHtmlMessage) { $data['hasHtmlBody'] = true; } else { @@ -474,23 +483,23 @@ public function getFullMessage($ownMail, $specialRole=null) { return $data; } - public function getListArray() { - $data = []; - $data['id'] = $this->getUid(); - $data['from'] = $this->getFrom(); - $data['fromEmail'] = $this->getFromEmail(); - $data['fromList'] = $this->getFromList(); - $data['to'] = $this->getTo(); - $data['toEmail'] = $this->getToEmail(); - $data['toList'] = $this->getToList(true); - $data['subject'] = $this->getSubject(); - $data['date'] = \OC::$server->getDateTimeFormatter()->formatDate($this->getSentDate()->format('U')); - $data['size'] = Util::humanFileSize($this->getSize()); - $data['flags'] = $this->getFlags(); - $data['dateInt'] = $this->getSentDate()->getTimestamp(); - $data['dateIso'] = $this->getSentDate()->format('c'); - $data['ccList'] = $this->getCCList(true); - return $data; + public function jsonSerialize() { + return [ + 'id' => $this->getUid(), + 'from' => $this->getFrom(), + 'fromEmail' => $this->getFromEmail(), + 'fromList' => $this->getFromList(), + 'to' => $this->getTo(), + 'toEmail' => $this->getToEmail(), + 'toList' => $this->getToList(true), + 'subject' => $this->getSubject(), + 'date' => OC::$server->getDateTimeFormatter()->formatDate($this->getSentDate()->format('U')), + 'size' => Util::humanFileSize($this->getSize()), + 'flags' => $this->getFlags(), + 'dateInt' => $this->getSentDate()->getTimestamp(), + 'dateIso' => $this->getSentDate()->format('c'), + 'ccList' => $this->getCCList(true), + ]; } /** @@ -516,7 +525,7 @@ public function getPlainBody() { } /** - * @param \Horde_Mime_Part $part + * @param Horde_Mime_Part $part * @param int $partNo */ private function handleMultiPartMessage($part, $partNo) { @@ -528,7 +537,7 @@ private function handleMultiPartMessage($part, $partNo) { } /** - * @param \Horde_Mime_Part $p + * @param Horde_Mime_Part $p * @param int $partNo */ private function handleTextMessage($p, $partNo) { @@ -538,7 +547,7 @@ private function handleTextMessage($p, $partNo) { } /** - * @param \Horde_Mime_Part $p + * @param Horde_Mime_Part $p * @param int $partNo */ private function handleHtmlMessage($p, $partNo) { @@ -550,7 +559,7 @@ private function handleHtmlMessage($p, $partNo) { } /** - * @param \Horde_Mime_Part $p + * @param Horde_Mime_Part $p * @param int $partNo * @return string * @throws DoesNotExistException @@ -558,8 +567,8 @@ private function handleHtmlMessage($p, $partNo) { */ private function loadBodyData($p, $partNo) { // DECODE DATA - $fetch_query = new \Horde_Imap_Client_Fetch_Query(); - $ids = new \Horde_Imap_Client_Ids($this->messageId); + $fetch_query = new Horde_Imap_Client_Fetch_Query(); + $ids = new Horde_Imap_Client_Ids($this->messageId); $fetch_query->bodyPart($partNo, [ 'peek' => true