diff options
author | Anna Larch <anna@nextcloud.com> | 2021-03-04 19:31:21 +0300 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2021-03-22 20:06:02 +0300 |
commit | 83a58623b116cd3f8c79f751a3df5963b3392692 (patch) | |
tree | 8f9660e75ea8748057e752c4f1573e3c618b5b85 /lib/Model | |
parent | f27fb61c0fe15ef6a278a40d7774cde4b7c748b8 (diff) |
Add tagging to messages
Signed-off-by: Anna Larch <anna@nextcloud.com>
Diffstat (limited to 'lib/Model')
-rw-r--r-- | lib/Model/IMAPMessage.php | 99 |
1 files changed, 78 insertions, 21 deletions
diff --git a/lib/Model/IMAPMessage.php b/lib/Model/IMAPMessage.php index 46005a0c3..24743ef44 100644 --- a/lib/Model/IMAPMessage.php +++ b/lib/Model/IMAPMessage.php @@ -29,29 +29,32 @@ declare(strict_types=1); namespace OCA\Mail\Model; +use OC; 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_Mime_Headers; -use Horde_Mime_Headers_MessageId; +use function trim; +use OCP\Files\File; use Horde_Mime_Part; +use OCA\Mail\Db\Tag; use JsonSerializable; -use OC; +use function in_array; +use Horde_Imap_Client; +use Horde_Mime_Headers; +use OCA\Mail\Db\Message; use OCA\Mail\AddressList; -use OCA\Mail\Db\LocalAttachment; +use Horde_Imap_Client_Ids; use OCA\Mail\Service\Html; -use OCP\AppFramework\Db\DoesNotExistException; -use OCP\Files\File; -use OCP\Files\SimpleFS\ISimpleFile; -use function in_array; +use OCA\Mail\Db\MailAccount; +use Horde_Imap_Client_Socket; +use Horde_Imap_Client_Mailbox; +use Horde_Imap_Client_DateTime; +use OCA\Mail\Db\LocalAttachment; use function mb_convert_encoding; -use function trim; +use Horde_Imap_Client_Data_Fetch; +use Horde_Mime_Headers_MessageId; +use Horde_Imap_Client_Fetch_Query; +use OCP\Files\SimpleFS\ISimpleFile; +use Horde_Imap_Client_Data_Envelope; +use OCP\AppFramework\Db\DoesNotExistException; class IMAPMessage implements IMessage, JsonSerializable { use ConvertAddresses; @@ -149,7 +152,7 @@ class IMAPMessage implements IMessage, JsonSerializable { 'forwarded' => in_array(Horde_Imap_Client::FLAG_FORWARDED, $flags), 'hasAttachments' => $this->hasAttachments($this->fetch->getStructure()), 'mdnsent' => in_array(Horde_Imap_Client::FLAG_MDNSENT, $flags, true), - 'important' => in_array('$important', $flags, true) + 'important' => in_array(Tag::LABEL_IMPORTANT, $flags, true) ]; } @@ -673,8 +676,14 @@ class IMAPMessage implements IMessage, JsonSerializable { throw new Exception('not implemented'); } - public function toDbMessage(int $mailboxId): \OCA\Mail\Db\Message { - $msg = new \OCA\Mail\Db\Message(); + /** + * Cast all values from an IMAP message into the correct DB format + * + * @param integer $mailboxId + * @return Message + */ + public function toDbMessage(int $mailboxId, MailAccount $account): Message { + $msg = new Message(); $messageId = $this->getMessageId(); if (empty(trim($messageId))) { @@ -707,10 +716,58 @@ class IMAPMessage implements IMessage, JsonSerializable { in_array('junk', $flags, true) ); $msg->setFlagNotjunk(in_array(Horde_Imap_Client::FLAG_NOTJUNK, $flags, true)); - $msg->setFlagImportant(in_array('$important', $flags, true)); + // @todo remove this as soon as possible @link https://github.com/nextcloud/mail/issues/25 + $msg->setFlagImportant(in_array('$important', $flags, true) || in_array(Tag::LABEL_IMPORTANT, $flags, true)); $msg->setFlagAttachments(false); $msg->setFlagMdnsent(in_array(Horde_Imap_Client::FLAG_MDNSENT, $flags, true)); + $allowed = [ + Horde_Imap_Client::FLAG_SEEN, + Horde_Imap_Client::FLAG_ANSWERED, + Horde_Imap_Client::FLAG_FLAGGED, + Horde_Imap_Client::FLAG_DELETED, + Horde_Imap_Client::FLAG_DRAFT, + Horde_Imap_Client::FLAG_RECENT, + Horde_Imap_Client::FLAG_JUNK, + Horde_Imap_Client::FLAG_MDNSENT, + ]; + // remove all standard IMAP flags from $filters + $tags = array_filter($flags, function ($flag) use ($allowed) { + return in_array($flag, $allowed, true) === false; + }); + + if (empty($tags) === true) { + return $msg; + } + // cast all leftover $flags to be used as tags + $msg->setTags($this->generateTagEntites($tags, $account->getUserId())); return $msg; } + + /** + * Build tag entities from keywords sent by IMAP + * + * Will use IMAP keyword '$xxx' to create a value for + * display_name like 'xxx' + * + * @link https://github.com/nextcloud/mail/issues/25 + * + * @param string[] $tags + * @return Tag[] + */ + private function generateTagEntites(array $tags, string $userId): array { + $t = []; + foreach ($tags as $keyword) { + // Map the old $important to $label1 until we have caught them all + if ($keyword === '$important') { + $keyword = Tag::LABEL_IMPORTANT; + } + $tag = new Tag(); + $tag->setImapLabel($keyword); + $tag->setDisplayName(str_replace('$', '', $keyword)); + $tag->setUserId($userId); + $t[] = $tag; + } + return $t; + } } |