Fix RFC 9051 IMAP4rev2 keywords and $ReadReceipt should be $MDNSent

This commit is contained in:
the-djmaze 2022-05-31 17:12:29 +02:00
parent eb61563db4
commit 1e61171f9c
6 changed files with 68 additions and 44 deletions

View file

@ -307,11 +307,19 @@ export class MessageModel extends AbstractModel {
hasFlaggedSubMessage: this.hasFlaggedSubMessage()
}, (key, value) => value && classes.push(key));
this.flags().forEach(value => {
'\\' !== value[0] && classes.push('flag-'+value);
'\\' !== value[0] && '$forwarded' !== value && classes.push('flag-'+value);
});
return classes.join(' ');
}
/**
* @return array
* https://datatracker.ietf.org/doc/html/rfc5788
*/
keywords() {
return this.flags().filter(value => '\\' !== value[0]);
}
/**
* @returns {string}
*/

View file

@ -566,20 +566,20 @@ export class MailMessageView extends AbstractViewRight {
readReceipt() {
let oMessage = currentMessage()
if (oMessage.readReceipt()) {
Remote.request('SendReadReceiptMessage', null, {
Remote.request('SendReadReceiptMessage', iError => {
if (!iError) {
oMessage.flags.push('$mdnsent');
// oMessage.flags.valueHasMutated();
MessageFlagsCache.store(oMessage);
MessagelistUserStore.reloadFlagsAndCachedMessage();
}
}, {
MessageFolder: oMessage.folder,
MessageUid: oMessage.uid,
ReadReceipt: oMessage.readReceipt(),
Subject: i18n('READ_RECEIPT/SUBJECT', { SUBJECT: oMessage.subject() }),
Text: i18n('READ_RECEIPT/BODY', { 'READ-RECEIPT': AccountUserStore.email() })
});
oMessage.flags.push('$mdnsent');
// oMessage.flags.valueHasMutated();
MessageFlagsCache.store(oMessage);
MessagelistUserStore.reloadFlagsAndCachedMessage();
}
}

View file

@ -18,10 +18,17 @@ namespace MailSo\Imap\Enumerations;
*/
abstract class MessageFlag
{
// const RECENT = '\\Recent'; // IMAP4rev2 deprecated
const SEEN = '\\Seen';
const DELETED = '\\Deleted';
const FLAGGED = '\\Flagged';
const ANSWERED = '\\Answered';
const DRAFT = '\\Draft';
const
// RECENT = '\\Recent', // IMAP4rev2 deprecated
SEEN = '\\Seen',
DELETED = '\\Deleted',
FLAGGED = '\\Flagged',
ANSWERED = '\\Answered',
DRAFT = '\\Draft',
// https://datatracker.ietf.org/doc/html/rfc9051#section-2.3.2
FORWARDED = '$Forwarded',
MDNSENT = '$MDNSent',
JUNK = '$Junk',
NOTJUNK = '$NotJunk',
PHISHING = '$Phishing';
}

View file

@ -187,16 +187,10 @@ trait Messages
{
case 'reply':
case 'reply-all':
$this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid),
MessageFlag::ANSWERED);
$this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), MessageFlag::ANSWERED);
break;
case 'forward':
$sForwardedFlag = $this->Config()->Get('labs', 'imap_forwarded_flag', '');
if (\strlen($sForwardedFlag))
{
$this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid),
$sForwardedFlag);
}
$this->MailClient()->MessageSetFlag($sDraftInfoFolder, new SequenceSet($iDraftInfoUid), MessageFlag::FORWARDED);
break;
}
}
@ -351,22 +345,18 @@ trait Messages
$mResult = true;
$sReadReceiptFlag = $this->Config()->Get('labs', 'imap_read_receipt_flag', '');
if (!empty($sReadReceiptFlag))
$sFolderFullName = $this->GetActionParam('MessageFolder', '');
$iUid = (int) $this->GetActionParam('MessageUid', 0);
$this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $iUid), '1');
if (\strlen($sFolderFullName) && 0 < $iUid)
{
$sFolderFullName = $this->GetActionParam('MessageFolder', '');
$iUid = (int) $this->GetActionParam('MessageUid', 0);
$this->Cacher($oAccount)->Set(\RainLoop\KeyPathHelper::ReadReceiptCache($oAccount->Email(), $sFolderFullName, $iUid), '1');
if (\strlen($sFolderFullName) && 0 < $iUid)
try
{
try
{
$this->MailClient()->MessageSetFlag($sFolderFullName, new SequenceSet($iUid), $sReadReceiptFlag, true, true);
}
catch (\Throwable $oException) {}
$this->MailClient()->MessageSetFlag($sFolderFullName, new SequenceSet($iUid), MessageFlag::MDNSENT, true, true);
}
catch (\Throwable $oException) {}
}
}
}
@ -523,11 +513,10 @@ trait Messages
$sFromFolder = $this->GetActionParam('FromFolder', '');
$sToFolder = $this->GetActionParam('ToFolder', '');
$bMarkAsRead = !empty($this->GetActionParam('MarkAsRead', '0'));
$oUids = new SequenceSet(\explode(',', (string) $this->GetActionParam('Uids', '')));
if ($bMarkAsRead)
if (!empty($this->GetActionParam('MarkAsRead', '0')))
{
try
{
@ -539,6 +528,25 @@ trait Messages
}
}
$sLearning = $this->GetActionParam('Learning', '');
if ($sLearning)
{
try
{
if ('SPAM' === $sLearning) {
$this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::JUNK);
$this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::NOTJUNK, false);
} else if ('HAM' === $sLearning) {
$this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::NOTJUNK);
$this->MailClient()->MessageSetFlag($sFromFolder, $oUids, MessageFlag::JUNK, false);
}
}
catch (\Throwable $oException)
{
unset($oException);
}
}
try
{
$this->MailClient()->MessageMove($sFromFolder, $sToFolder, $oUids,

View file

@ -194,10 +194,12 @@ trait Response
'FileName' => (\strlen($sSubject) ? \MailSo\Base\Utils::ClearXss($sSubject) : 'message-'.$mResult['Uid']) . '.eml'
));
$sForwardedFlag = \strtolower($this->Config()->Get('labs', 'imap_forwarded_flag', ''));
$sReadReceiptFlag = \strtolower($this->Config()->Get('labs', 'imap_read_receipt_flag', ''));
\strlen($sForwardedFlag) && \in_array($sForwardedFlag, $mResult['Flags']) && \array_push($mResult['Flags'], '$forwarded');
\strlen($sReadReceiptFlag) && \in_array($sReadReceiptFlag, $mResult['Flags']) && \array_push($mResult['Flags'], '$mdnsent');
// https://datatracker.ietf.org/doc/html/rfc5788#section-3.4.1
$key = \array_search('$readreceipt', $mResult['Flags']);
if (false !== $key) {
$mResult['Flags'][$key] = '$mdnsent';
}
$mResult['Flags'] = \array_unique($mResult['Flags']);
if ('Message' === $sParent)
@ -220,6 +222,7 @@ trait Response
if (\strlen($mResult['ReadReceipt']) && !\in_array('$forwarded', $mResult['Flags']))
{
// \in_array('$mdnsent', $mResult['Flags'])
if (\strlen($mResult['ReadReceipt']))
{
try

View file

@ -355,8 +355,6 @@ Enables caching in the system'),
'use_imap_thread' => array(true),
'use_imap_move' => array(false),
'use_imap_expunge_all_on_delete' => array(false),
'imap_forwarded_flag' => array('$Forwarded'),
'imap_read_receipt_flag' => array('$ReadReceipt'),
'imap_body_text_limit' => array(555000),
'imap_message_list_fast_simple_search' => array(true),
'imap_message_list_count_limit_trigger' => array(0),