Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/Contracts/IAttachmentService.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,5 @@ public function getAttachment(string $userId, int $id): array;
* @param int $id
*/
public function deleteAttachment(string $userId, int $id);

}
11 changes: 11 additions & 0 deletions lib/Db/Message.php
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ class Message extends Entity implements JsonSerializable {

/** @var bool */
private $fetchAvatarFromClient = false;
/** @var array */
private $attachments = [];

public function __construct() {
$this->from = new AddressList([]);
Expand Down Expand Up @@ -312,6 +314,14 @@ public function getAvatar(): ?Avatar {
return $this->avatar;
}

public function setAttachments(array $attachments): void {
$this->attachments = $attachments;
}

public function getAttachments(): array {
return $this->attachments;
}

#[\Override]
#[ReturnTypeWillChange]
public function jsonSerialize() {
Expand Down Expand Up @@ -359,6 +369,7 @@ static function (Tag $tag) {
'mentionsMe' => $this->getMentionsMe(),
'avatar' => $this->avatar?->jsonSerialize(),
'fetchAvatarFromClient' => $this->fetchAvatarFromClient,
'attachments' => $this->getAttachments(),
];
}
}
16 changes: 13 additions & 3 deletions lib/IMAP/PreviewEnhancer.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use OCA\Mail\Db\Message;
use OCA\Mail\Db\MessageMapper as DbMapper;
use OCA\Mail\IMAP\MessageMapper as ImapMapper;
use OCA\Mail\Service\Attachment\AttachmentService;
use OCA\Mail\Service\Avatar\Avatar;
use OCA\Mail\Service\AvatarService;
use Psr\Log\LoggerInterface;
Expand All @@ -39,11 +40,14 @@
/** @var AvatarService */
private $avatarService;

public function __construct(IMAPClientFactory $clientFactory,
public function __construct(
IMAPClientFactory $clientFactory,
ImapMapper $imapMapper,
DbMapper $dbMapper,
LoggerInterface $logger,
AvatarService $avatarService) {
AvatarService $avatarService,
private AttachmentService $attachmentService,
) {
$this->clientFactory = $clientFactory;
$this->imapMapper = $imapMapper;
$this->mapper = $dbMapper;
Expand All @@ -54,10 +58,10 @@
/**
* @param Message[] $messages
*
* @return Message[]

Check failure on line 61 in lib/IMAP/PreviewEnhancer.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-master

InvalidReturnType

lib/IMAP/PreviewEnhancer.php:61:13: InvalidReturnType: The declared return type 'array<array-key, array<array-key, OCA\Mail\Db\Message>>' for OCA\Mail\IMAP\PreviewEnhancer::process is incorrect, got 'array<array-key, OCA\Mail\Db\Message|array<array-key, OCA\Mail\Db\Message>>' (see https://psalm.dev/011)
*/
public function process(Account $account, Mailbox $mailbox, array $messages, bool $preLoadAvatars = false, ?string $userId = null): array {
$needAnalyze = array_reduce($messages, static function (array $carry, Message $message) {

Check failure on line 64 in lib/IMAP/PreviewEnhancer.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-master

InvalidArgument

lib/IMAP/PreviewEnhancer.php:64:73: InvalidArgument: The second param of the closure passed to array_reduce must take array<array-key, OCA\Mail\Db\Message> but only accepts OCA\Mail\Db\Message (see https://psalm.dev/004)
if ($message->getStructureAnalyzed()) {
// Nothing to do
return $carry;
Expand All @@ -65,6 +69,12 @@

return array_merge($carry, [$message->getUid()]);
}, []);
$client = $this->clientFactory->getClient($account);

foreach ($messages as $message) {
$attachments = $this->attachmentService->getAttachmentNames($account, $mailbox, $message, $client);
$message->setAttachments($attachments);
}

if ($preLoadAvatars) {
foreach ($messages as $message) {
Expand All @@ -87,7 +97,7 @@
return $messages;
}

$client = $this->clientFactory->getClient($account);

try {
$data = $this->imapMapper->getBodyStructureData(
$client,
Expand Down
3 changes: 2 additions & 1 deletion lib/Model/IMAPMessage.php
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,7 @@ public function getSentDate(): Horde_Imap_Client_DateTime {
return $this->imapDate;
}


/**
* @param int $id
*
Expand Down Expand Up @@ -384,7 +385,7 @@ public function setContent(string $content) {
*/
#[\Override]
public function getAttachments(): array {
throw new Exception('not implemented');
return $this->attachments;
}

/**
Expand Down
35 changes: 35 additions & 0 deletions lib/Service/Attachment/AttachmentService.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,18 @@
use OCA\Mail\Db\LocalAttachment;
use OCA\Mail\Db\LocalAttachmentMapper;
use OCA\Mail\Db\LocalMessage;
use OCA\Mail\Db\Mailbox;
use OCA\Mail\Db\Message;
use OCA\Mail\Exception\AttachmentNotFoundException;
use OCA\Mail\Exception\ServiceException;
use OCA\Mail\Exception\UploadException;
use OCA\Mail\IMAP\MessageMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\ICacheFactory;
use Psr\Log\LoggerInterface;

class AttachmentService implements IAttachmentService {
Expand All @@ -51,6 +55,10 @@ class AttachmentService implements IAttachmentService {
* @var LoggerInterface
*/
private $logger;
/**
* @var ICache
*/
private $cache;

/**
* @param Folder $userFolder
Expand All @@ -60,13 +68,15 @@ public function __construct($userFolder,
AttachmentStorage $storage,
IMailManager $mailManager,
MessageMapper $imapMessageMapper,
ICacheFactory $cacheFactory,
LoggerInterface $logger) {
$this->mapper = $mapper;
$this->storage = $storage;
$this->mailManager = $mailManager;
$this->messageMapper = $imapMessageMapper;
$this->userFolder = $userFolder;
$this->logger = $logger;
$this->cache = $cacheFactory->createLocal('mail.attachment_names');
}

/**
Expand Down Expand Up @@ -249,6 +259,31 @@ public function handleAttachments(Account $account, array $attachments, \Horde_I
return array_values(array_filter($attachmentIds));
}

public function getAttachmentNames(Account $account, Mailbox $mailbox, Message $message, \Horde_Imap_Client_Socket $client): array {
$attachments = [];
$cached = $this->cache->get($message->getUid());
if ($cached) {
return $cached;
}
try {
$imapMessage = $this->mailManager->getImapMessage(
$client,
$account,
$mailbox,
$message->getUid(),
true
);
$attachments = $imapMessage->getAttachments();
} catch (ServiceException $e) {
$this->logger->error('Could not get attachment names', ['exception' => $e, 'messageId' => $message->getUid()]);
}
$result = array_map(static function (array $attachment) {
return $attachment['fileName'];
}, $attachments);
$this->cache->set($message->getUid(), $result);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UIDs are unique in the scope of a single mailbox. You'll run into conflicts across mailboxes, and worse, across user accounts. Use the primary key or find another unique identifier.

return $result;
}

/**
* Add a message as attachment
*
Expand Down
Loading