Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: bring back too many recipients check #7311

Draft
wants to merge 27 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
60293f0
fix(outbox): add status for messages
miaulalala Feb 26, 2024
bf5c874
fixup! fix(outbox): add status for messages
miaulalala Feb 26, 2024
18415a0
fixup! fix(outbox): add status for messages
miaulalala Feb 28, 2024
364d7a6
fixup! fix(outbox): add status for messages
miaulalala Feb 28, 2024
589ee89
fixup! fix(outbox): add status for messages
miaulalala Feb 28, 2024
f59c1aa
fixup! fix(outbox): add status for messages
miaulalala Feb 28, 2024
730326b
fixup! fix(outbox): add status for messages
miaulalala Feb 28, 2024
44e280e
fixup! fix(outbox): add status for messages
miaulalala Mar 5, 2024
4704952
fixup! fix(outbox): add status for messages
miaulalala Mar 5, 2024
b43b17d
fixup! fix(outbox): add status for messages
miaulalala Mar 12, 2024
86b23e0
fixup! fix(outbox): add status for messages
miaulalala Mar 13, 2024
ebd98ca
fixup! fix(outbox): add status for messages
miaulalala Mar 13, 2024
64cddb3
fixup! fix(outbox): add status for messages
miaulalala Mar 13, 2024
d72d20d
fixup! fix(outbox): add status for messages
miaulalala Mar 13, 2024
ea30607
fixup! fix(outbox): add status for messages
miaulalala Mar 13, 2024
56f50f1
fixup! fix(outbox): add status for messages
miaulalala Mar 15, 2024
9bfc6be
fixup! fix(outbox): add status for messages
miaulalala Mar 15, 2024
b54bca9
fixup! fix(outbox): add status for messages
miaulalala Mar 15, 2024
6b39c4b
fixup! fix(outbox): add status for messages
miaulalala Mar 18, 2024
90dfae5
fixup! fix(outbox): add status for messages
miaulalala Mar 18, 2024
1e280d5
fixup! fix(outbox): add status for messages
miaulalala Mar 18, 2024
457ea26
fixup! fix(outbox): add status for messages
miaulalala Mar 18, 2024
bfb59af
fix: bring back too many recipients check
miaulalala Mar 19, 2024
71c2d48
fixup! fix: bring back too many recipients check
miaulalala Mar 20, 2024
7eefdee
fixup! fix: bring back too many recipients check
miaulalala Mar 20, 2024
79767da
fixup! fix: bring back too many recipients check
GVodyanov Mar 28, 2024
f13f646
Implement front end dialog for warning of too many recipients
GVodyanov Mar 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 3 additions & 7 deletions lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
use OCA\Mail\Dashboard\UnreadMailWidget;
use OCA\Mail\Dashboard\UnreadMailWidgetV2;
use OCA\Mail\Events\BeforeImapClientCreated;
use OCA\Mail\Events\BeforeMessageSentEvent;
use OCA\Mail\Events\DraftMessageCreatedEvent;
use OCA\Mail\Events\DraftSavedEvent;
use OCA\Mail\Events\MailboxesSynchronizedEvent;
Expand All @@ -49,15 +48,14 @@
use OCA\Mail\Events\MessageSentEvent;
use OCA\Mail\Events\NewMessagesSynchronized;
use OCA\Mail\Events\OutboxMessageCreatedEvent;
use OCA\Mail\Events\OutboxMessageStatusChangeEvent;
use OCA\Mail\Events\SynchronizationEvent;
use OCA\Mail\HordeTranslationHandler;
use OCA\Mail\Http\Middleware\ErrorMiddleware;
use OCA\Mail\Http\Middleware\ProvisioningMiddleware;
use OCA\Mail\Listener\AccountSynchronizedThreadUpdaterListener;
use OCA\Mail\Listener\AddressCollectionListener;
use OCA\Mail\Listener\AntiAbuseListener;
use OCA\Mail\Listener\DeleteDraftListener;
use OCA\Mail\Listener\FlagRepliedMessageListener;
use OCA\Mail\Listener\HamReportListener;
use OCA\Mail\Listener\InteractionListener;
use OCA\Mail\Listener\MailboxesSynchronizedSpecialMailboxesUpdater;
Expand All @@ -67,8 +65,8 @@
use OCA\Mail\Listener\NewMessageClassificationListener;
use OCA\Mail\Listener\OauthTokenRefreshListener;
use OCA\Mail\Listener\OptionalIndicesListener;
use OCA\Mail\Listener\OutboxStatusChangeListener;
use OCA\Mail\Listener\OutOfOfficeListener;
use OCA\Mail\Listener\SaveSentMessageListener;
use OCA\Mail\Listener\SpamReportListener;
use OCA\Mail\Listener\UserDeletedListener;
use OCA\Mail\Notification\Notifier;
Expand Down Expand Up @@ -132,20 +130,18 @@

$context->registerEventListener(AddMissingIndicesEvent::class, OptionalIndicesListener::class);
$context->registerEventListener(BeforeImapClientCreated::class, OauthTokenRefreshListener::class);
$context->registerEventListener(BeforeMessageSentEvent::class, AntiAbuseListener::class);
$context->registerEventListener(DraftSavedEvent::class, DeleteDraftListener::class);
$context->registerEventListener(DraftMessageCreatedEvent::class, DeleteDraftListener::class);
$context->registerEventListener(OutboxMessageCreatedEvent::class, DeleteDraftListener::class);
$context->registerEventListener(OutboxMessageStatusChangeEvent::class, OutboxStatusChangeListener::class);

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-stable27

UndefinedClass

lib/AppInfo/Application.php:136:35: UndefinedClass: Class, interface or enum named OCA\Mail\Events\OutboxMessageStatusChangeEvent does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-stable27

UndefinedClass

lib/AppInfo/Application.php:136:74: UndefinedClass: Class, interface or enum named OCA\Mail\Listener\OutboxStatusChangeListener does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-stable28

UndefinedClass

lib/AppInfo/Application.php:136:35: UndefinedClass: Class, interface or enum named OCA\Mail\Events\OutboxMessageStatusChangeEvent does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-stable28

UndefinedClass

lib/AppInfo/Application.php:136:74: UndefinedClass: Class, interface or enum named OCA\Mail\Listener\OutboxStatusChangeListener does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-master

UndefinedClass

lib/AppInfo/Application.php:136:35: UndefinedClass: Class, interface or enum named OCA\Mail\Events\OutboxMessageStatusChangeEvent does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-master

UndefinedClass

lib/AppInfo/Application.php:136:74: UndefinedClass: Class, interface or enum named OCA\Mail\Listener\OutboxStatusChangeListener does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-stable26

UndefinedClass

lib/AppInfo/Application.php:136:35: UndefinedClass: Class, interface or enum named OCA\Mail\Events\OutboxMessageStatusChangeEvent does not exist (see https://psalm.dev/019)

Check failure on line 136 in lib/AppInfo/Application.php

View workflow job for this annotation

GitHub Actions / static-psalm-analysis dev-stable26

UndefinedClass

lib/AppInfo/Application.php:136:74: UndefinedClass: Class, interface or enum named OCA\Mail\Listener\OutboxStatusChangeListener does not exist (see https://psalm.dev/019)
$context->registerEventListener(MailboxesSynchronizedEvent::class, MailboxesSynchronizedSpecialMailboxesUpdater::class);
$context->registerEventListener(MessageFlaggedEvent::class, MessageCacheUpdaterListener::class);
$context->registerEventListener(MessageFlaggedEvent::class, SpamReportListener::class);
$context->registerEventListener(MessageFlaggedEvent::class, HamReportListener::class);
$context->registerEventListener(MessageFlaggedEvent::class, MoveJunkListener::class);
$context->registerEventListener(MessageDeletedEvent::class, MessageCacheUpdaterListener::class);
$context->registerEventListener(MessageSentEvent::class, AddressCollectionListener::class);
$context->registerEventListener(MessageSentEvent::class, FlagRepliedMessageListener::class);
$context->registerEventListener(MessageSentEvent::class, InteractionListener::class);
$context->registerEventListener(MessageSentEvent::class, SaveSentMessageListener::class);
$context->registerEventListener(NewMessagesSynchronized::class, NewMessageClassificationListener::class);
$context->registerEventListener(NewMessagesSynchronized::class, MessageKnownSinceListener::class);
$context->registerEventListener(SynchronizationEvent::class, AccountSynchronizedThreadUpdaterListener::class);
Expand Down
22 changes: 3 additions & 19 deletions lib/Contracts/IMailTransmission.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
namespace OCA\Mail\Contracts;

use OCA\Mail\Account;
use OCA\Mail\Db\Alias;
use OCA\Mail\Db\LocalMessage;
use OCA\Mail\Db\Mailbox;
use OCA\Mail\Db\Message;
Expand All @@ -37,27 +36,12 @@ interface IMailTransmission {
/**
* Send a new message or reply to an existing one
*
* @param NewMessageData $messageData
* @param string|null $repliedToMessageId
* @param Alias|null $alias
* @param Message|null $draft
*
* @throws SentMailboxNotSetException
* @throws ServiceException
*/
public function sendMessage(NewMessageData $messageData,
?string $repliedToMessageId = null,
?Alias $alias = null,
?Message $draft = null): void;

/**
* @param Account $account
* @param LocalMessage $message
* @throws ClientException
* @param LocalMessage $localMessage
* @throws SentMailboxNotSetException
* @throws ServiceException
* @return void
*/
public function sendLocalMessage(Account $account, LocalMessage $message): void;
public function sendMessage(Account $account, LocalMessage $localMessage): void;

/**
* @param Account $account
Expand Down
5 changes: 4 additions & 1 deletion lib/Controller/DraftsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ public function create(
array $cc = [],
array $bcc = [],
array $attachments = [],
bool $force = false,
?int $aliasId = null,
?string $inReplyToMessageId = null,
?int $smimeCertificateId = null,
Expand All @@ -121,6 +122,7 @@ public function create(
$message->setSendAt($sendAt);
$message->setSmimeSign($smimeSign);
$message->setSmimeEncrypt($smimeEncrypt);
$message->setForce($force);

if (!empty($smimeCertificateId)) {
$smimeCertificate = $this->smimeService->findCertificate($smimeCertificateId, $this->userId);
Expand Down Expand Up @@ -165,14 +167,14 @@ public function update(int $id,
array $cc = [],
array $bcc = [],
array $attachments = [],
bool $force = false,
?int $aliasId = null,
?string $inReplyToMessageId = null,
?int $smimeCertificateId = null,
?int $sendAt = null): JsonResponse {
$message = $this->service->getMessage($id, $this->userId);
$account = $this->accountService->find($this->userId, $accountId);


$message->setType(LocalMessage::TYPE_DRAFT);
$message->setAccountId($accountId);
$message->setAliasId($aliasId);
Expand All @@ -186,6 +188,7 @@ public function update(int $id,
$message->setUpdatedAt($this->timeFactory->getTime());
$message->setSmimeSign($smimeSign);
$message->setSmimeEncrypt($smimeEncrypt);
$message->setForce($force);

if (!empty($smimeCertificateId)) {
$smimeCertificate = $this->smimeService->findCertificate($smimeCertificateId, $this->userId);
Expand Down
11 changes: 8 additions & 3 deletions lib/Controller/OutboxController.php
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ public function create(
array $cc = [],
array $bcc = [],
array $attachments = [],
bool $force,
?int $draftId = null,
?int $aliasId = null,
?string $inReplyToMessageId = null,
Expand All @@ -139,6 +140,7 @@ public function create(
$message->setSendAt($sendAt);
$message->setSmimeSign($smimeSign);
$message->setSmimeEncrypt($smimeEncrypt);
$message->setForce($force);

if (!empty($smimeCertificateId)) {
$smimeCertificate = $this->smimeService->findCertificate($smimeCertificateId, $this->userId);
Expand All @@ -163,7 +165,7 @@ public function createFromDraft(DraftsService $draftsService, int $id, ?int $sen

$outboxMessage = $this->service->convertDraft($draftMessage, $sendAt);

return JsonResponse::success(
return JsonResponse::success(
$outboxMessage,
Http::STATUS_CREATED,
);
Expand Down Expand Up @@ -198,17 +200,20 @@ public function update(
bool $isHtml,
bool $smimeSign,
bool $smimeEncrypt,
bool $failed = false,
array $to = [],
array $cc = [],
array $bcc = [],
array $attachments = [],
bool $force,
?int $aliasId = null,
?string $inReplyToMessageId = null,
?int $smimeCertificateId = null,
?int $sendAt = null
): JsonResponse {
$message = $this->service->getMessage($id, $this->userId);
if ($message->getStatus() === LocalMessage::STATUS_IMAP_SENT_MAILBOX_FAIL || $message->getStatus() === LocalMessage::STATUS_PROCESSED) {
return JsonResponse::error('Cannot modify already sent message', Http::STATUS_FORBIDDEN, [$message]);
}
$account = $this->accountService->find($this->userId, $accountId);

$message->setAccountId($accountId);
Expand All @@ -217,11 +222,11 @@ public function update(
$message->setBody($body);
$message->setEditorBody($editorBody);
$message->setHtml($isHtml);
$message->setFailed($failed);
$message->setInReplyToMessageId($inReplyToMessageId);
$message->setSendAt($sendAt);
$message->setSmimeSign($smimeSign);
$message->setSmimeEncrypt($smimeEncrypt);
$message->setForce($force);

if (!empty($smimeCertificateId)) {
$smimeCertificate = $this->smimeService->findCertificate($smimeCertificateId, $this->userId);
Expand Down
39 changes: 38 additions & 1 deletion lib/Db/LocalMessage.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,32 @@
* @method setSmimeCertificateId(?int $smimeCertificateId)
* @method bool|null getSmimeEncrypt()
* @method setSmimeEncrypt (bool $smimeEncryt)
* @method int|null getStatus();
* @method setStatus(?int $status);
* @method string|null getRaw()
* @method setRaw(string|null $raw)
* @method bool getForce()
* @method setForce(bool $force)
*/
class LocalMessage extends Entity implements JsonSerializable {
public const TYPE_OUTGOING = 0;
public const TYPE_DRAFT = 1;

public const STATUS_RAW = 0;
public const STATUS_NO_SENT_MAILBOX = 1;
public const STATUS_SMIME_SIGN_NO_CERT_ID = 2;
public const STATUS_SMIME_SIGN_CERT = 3;
public const STATUS_SMIME_SIGN_FAIL = 4;
public const STATUS_SMIME_ENCRYPT_NO_CERT_ID = 5;
public const STATUS_SMIME_ENCRYPT_CERT = 6;
public const STATUS_SMIME_ENCRYT_FAIL = 7;
public const STATUS_TOO_MANY_RECIPIENTS = 8;
public const STATUS_RATELIMIT = 9;
public const STATUS_SMPT_SEND_FAIL = 10;
public const STATUS_IMAP_SENT_MAILBOX_FAIL = 11;
public const STATUS_PROCESSED = 12;
/**
* @var int
* @var int<1,12>
* @psalm-var self::TYPE_*
*/
protected $type;
Expand Down Expand Up @@ -116,6 +135,18 @@ class LocalMessage extends Entity implements JsonSerializable {
/** @var bool|null */
protected $smimeEncrypt;

/**
* @var int|null
* @psalm-var int-mask-of<self::STATUS_*>
*/
protected $status;

/** @var string|null */
protected $raw;

/** @var bool */
protected $force;

public function __construct() {
$this->addType('type', 'integer');
$this->addType('accountId', 'integer');
Expand All @@ -127,6 +158,9 @@ public function __construct() {
$this->addType('smimeSign', 'boolean');
$this->addType('smimeCertificateId', 'integer');
$this->addType('smimeEncrypt', 'boolean');
$this->addType('status', 'integer');
$this->addType('force', 'boolean');

}

#[ReturnTypeWillChange]
Expand Down Expand Up @@ -168,6 +202,9 @@ public function jsonSerialize() {
'smimeCertificateId' => $this->getSmimeCertificateId(),
'smimeSign' => $this->getSmimeSign() === true,
'smimeEncrypt' => $this->getSmimeEncrypt() === true,
'status' => $this->getStatus(),
'raw' => $this->getRaw(),
'force' => $this->getForce(),
];
}

Expand Down
7 changes: 2 additions & 5 deletions lib/Db/LocalMessageMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ public function getAllForUser(string $userId, int $type = LocalMessage::TYPE_OUT
->join('a', $this->getTableName(), 'm', $qb->expr()->eq('m.account_id', 'a.id'))
->where(
$qb->expr()->eq('a.user_id', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR), IQueryBuilder::PARAM_STR),
$qb->expr()->eq('m.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT)
$qb->expr()->eq('m.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT),
$qb->expr()->notIn('m.status', $qb->createNamedParameter([LocalMessage::STATUS_PROCESSED, LocalMessage::STATUS_IMAP_SENT_MAILBOX_FAIL], IQueryBuilder::PARAM_INT_ARRAY), IQueryBuilder::PARAM_INT_ARRAY)
);
$rows = $qb->executeQuery();

Expand Down Expand Up @@ -134,10 +135,6 @@ public function findDue(int $time, int $type = LocalMessage::TYPE_OUTGOING): arr
$qb->expr()->isNotNull('send_at'),
$qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT),
$qb->expr()->lte('send_at', $qb->createNamedParameter($time, IQueryBuilder::PARAM_INT), IQueryBuilder::PARAM_INT),
$qb->expr()->orX(
$qb->expr()->isNull('failed'),
$qb->expr()->eq('failed', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL), IQueryBuilder::PARAM_BOOL),
)
)
->orderBy('send_at', 'asc');
$messages = $this->findEntities($select);
Expand Down
95 changes: 0 additions & 95 deletions lib/Events/BeforeMessageSentEvent.php

This file was deleted.