From 464e766fccba49d2eb0fed39a21a1923a1b026d5 Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Thu, 13 Jan 2022 12:00:12 +0100
Subject: [PATCH] Put OpenPGP check outside "plain". This allows also for
checking HTML messages (but errors for now)
---
dev/Model/Message.js | 2 +-
dev/Stores/User/Message.js | 94 ++++++++++----------------------
dev/Stores/User/Pgp.js | 39 ++++++-------
dev/Styles/User/MessageView.less | 38 ++++++-------
4 files changed, 64 insertions(+), 109 deletions(-)
diff --git a/dev/Model/Message.js b/dev/Model/Message.js
index cdfaf7ba2..5ffeac263 100644
--- a/dev/Model/Message.js
+++ b/dev/Model/Message.js
@@ -460,7 +460,7 @@ export class MessageModel extends AbstractModel {
}
showExternalImages() {
- if (this.body && this.body.rlHasImages) {
+ if (this.body && this.hasImages()) {
this.hasImages(false);
this.body.rlHasImages = false;
diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js
index bdc70d461..ca3e5a00b 100644
--- a/dev/Stores/User/Message.js
+++ b/dev/Stores/User/Message.js
@@ -3,7 +3,7 @@ import { koComputable } from 'External/ko';
import { Scope, Notification } from 'Common/Enums';
import { MessageSetAction } from 'Common/EnumsUser';
-import { doc, $htmlCL, createElement, elementById } from 'Common/Globals';
+import { doc, $htmlCL, elementById } from 'Common/Globals';
import { arrayLength, pInt, pString, addObservablesTo, addComputablesTo, addSubscribablesTo } from 'Common/Utils';
import { plainToHtml } from 'Common/UtilsUser';
@@ -358,33 +358,6 @@ export const MessageUserStore = new class {
}
}
- /**
- * @param {Object} messageTextBody
- */
- initBlockquoteSwitcher(messageTextBody) {
- messageTextBody && messageTextBody.querySelectorAll('blockquote:not(.rl-bq-switcher)').forEach(node => {
- if (node.textContent.trim() && !node.parentNode.closest('blockquote')) {
- let h = node.clientHeight || getRealHeight(node);
- if (0 === h || 100 < h) {
- const el = Element.fromHTML('•••');
- node.classList.add('rl-bq-switcher','hidden-bq');
- node.before(el);
- el.addEventListener('click', () => node.classList.toggle('hidden-bq'));
- }
- }
- });
- }
-
- /**
- * @param {Object} messageTextBody
- * @param {Object} message
- */
- initOpenPgpControls(messageTextBody, message) {
- messageTextBody && messageTextBody.querySelectorAll('.b-plain-openpgp:not(.inited)').forEach(node =>
- PgpUserStore.initMessageBodyControls(node, message)
- );
- }
-
setMessage(data, cached, oMessage) {
let isNew = false,
json = data && data.Result,
@@ -423,18 +396,14 @@ export const MessageUserStore = new class {
addRequestedMessage(message.folder, message.uid);
if (messagesDom) {
- let body = null,
- id = 'rl-msg-' + message.hash.replace(/[^a-zA-Z0-9]/g, '');
-
- const textBody = elementById(id);
- if (textBody) {
- message.body = textBody;
+ let id = 'rl-msg-' + message.hash.replace(/[^a-zA-Z0-9]/g, ''),
+ body = elementById(id);
+ if (body) {
+ message.body = body;
message.fetchDataFromDom();
- messagesDom.append(textBody);
} else {
let isHtml = !!json.Html,
- plain = '',
- resultHtml = '
';
+ resultHtml = '';
if (isHtml) {
resultHtml = json.Html.toString().replace(/font-size:\s*[0-9]px/g,'font-size:11px');
if (SettingsUserStore.removeColors()) {
@@ -442,30 +411,16 @@ export const MessageUserStore = new class {
}
} else if (json.Plain) {
resultHtml = findEmailAndLinks(plainToHtml(json.Plain.toString()));
-
- if ((message.isPgpSigned() || message.isPgpEncrypted()) && PgpUserStore.capaOpenPGP()) {
- plain = pString(json.Plain);
- const pre = createElement('pre');
- if (message.isPgpSigned()) {
- pre.className = 'b-plain-openpgp signed';
- pre.textContent = plain;
- } else if (message.isPgpEncrypted()) {
- pre.className = 'b-plain-openpgp encrypted';
- pre.textContent = plain;
- } else {
- pre.innerHTML = resultHtml;
- }
- resultHtml = pre.outerHTML;
- } else {
- resultHtml = '' + resultHtml + '
';
- }
}
// Strip utm_* tracking
resultHtml = resultHtml.replace(/(\\?|&|&)utm_[a-z]+=[a-z0-9_-]*/si, '$1');
body = Element.fromHTML(''
+ + (isHtml ? 'html' : 'plain')
+ + (message.isPgpSigned() ? ' openpgp-signed' : '')
+ + (message.isPgpEncrypted() ? ' openpgp-encrypted' : '')
+ + '">'
+ resultHtml
+ '
');
@@ -482,11 +437,7 @@ export const MessageUserStore = new class {
body.rlHasImages = !!json.HasExternals;
message.body = body;
-
- message.isHtml(isHtml);
- message.hasImages(body.rlHasImages);
-
- messagesDom.append(body);
+ message.fetchDataFromDom();
if (json.HasInternals) {
message.showInternalImages();
@@ -497,18 +448,29 @@ export const MessageUserStore = new class {
}
this.purgeMessageBodyCache();
+
+ PgpUserStore.initMessageBodyControls(body, message);
+
+ // init BlockquoteSwitcher
+ body.querySelectorAll('blockquote:not(.rl-bq-switcher)').forEach(node => {
+ if (node.textContent.trim() && !node.parentNode.closest('blockquote')) {
+ let h = node.clientHeight || getRealHeight(node);
+ if (0 === h || 100 < h) {
+ const el = Element.fromHTML('•••');
+ node.classList.add('rl-bq-switcher','hidden-bq');
+ node.before(el);
+ el.addEventListener('click', () => node.classList.toggle('hidden-bq'));
+ }
+ }
+ });
}
+ messagesDom.append(body);
+
oMessage || this.messageActiveDom(message.body);
oMessage || this.hideMessageBodies();
- if (body) {
- this.initOpenPgpControls(body, message);
-
- this.initBlockquoteSwitcher(body);
- }
-
oMessage || (message.body.hidden = false);
oMessage && message.viewPopupMessage();
}
diff --git a/dev/Stores/User/Pgp.js b/dev/Stores/User/Pgp.js
index 435f16a2d..70b0665d2 100644
--- a/dev/Stores/User/Pgp.js
+++ b/dev/Stores/User/Pgp.js
@@ -2,7 +2,6 @@ import ko from 'ko';
import { i18n } from 'Common/Translator';
import { isArray, arrayLength, pString, addComputablesTo } from 'Common/Utils';
-import { createElement } from 'Common/Globals';
import { AccountUserStore } from 'Stores/User/Account';
@@ -341,30 +340,24 @@ export const PgpUserStore = new class {
* @param {MessageModel} rainLoopMessage
*/
initMessageBodyControls(dom, rainLoopMessage) {
- const cl = dom && dom.classList;
- if (!cl.contains('inited')) {
- cl.add('inited');
-
- const encrypted = cl.contains('encrypted'),
- signed = cl.contains('signed'),
- recipients = rainLoopMessage ? rainLoopMessage.getEmails(['from', 'to', 'cc']) : [];
-
- let verControl = null;
-
- if (encrypted || signed) {
- const domText = dom.textContent;
-
+ const cl = dom.classList,
+ signed = cl.contains('openpgp-signed'),
+ encrypted = cl.contains('openpgp-encrypted');
+ if ((encrypted || signed) && !dom.phpInited) {
+ dom.phpInited = 1;
+ const
+ domText = dom.textContent,
+ recipients = rainLoopMessage ? rainLoopMessage.getEmails(['from', 'to', 'cc']) : [],
verControl = Element.fromHTML('🔒
');
- if (encrypted) {
- verControl.title = i18n('MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC');
- verControl.addEventListener('click', domControlEncryptedClickHelper(this, dom, domText, recipients));
- } else {
- verControl.title = i18n('MESSAGE/PGP_SIGNED_MESSAGE_DESC');
- verControl.addEventListener('click', domControlSignedClickHelper(this, dom, domText));
- }
-
- dom.before(verControl, createElement('div'));
+ if (encrypted) {
+ verControl.title = i18n('MESSAGE/PGP_ENCRYPTED_MESSAGE_DESC');
+ verControl.addEventListener('click', domControlEncryptedClickHelper(this, dom, domText, recipients));
+ } else {
+ verControl.title = i18n('MESSAGE/PGP_SIGNED_MESSAGE_DESC');
+ verControl.addEventListener('click', domControlSignedClickHelper(this, dom, domText));
}
+
+ dom.prepend(verControl);
}
}
};
diff --git a/dev/Styles/User/MessageView.less b/dev/Styles/User/MessageView.less
index 0300c5f91..06955d4f4 100644
--- a/dev/Styles/User/MessageView.less
+++ b/dev/Styles/User/MessageView.less
@@ -387,7 +387,7 @@ html.rl-no-preview-pane {
&.plain {
padding: 15px;
- /*white-space: pre-wrap;*/
+ white-space: pre-wrap;
font-family: var(--fontMono);
pre {
@@ -398,22 +398,6 @@ html.rl-no-preview-pane {
word-break: normal;
}
- pre.b-plain-openpgp {
- display: inline-block;
- padding: 6px 10px;
- border: 1px dashed #666;
- word-break: break-all;
-
- &.success {
- border-color: green;
- background-color: rgba(0, 255, 0, 0.03);
- }
- &.error {
- border-color: red;
- background-color: rgba(255, 0, 0, 0.03);
- }
- }
-
blockquote {
border-left: 2px solid blue;
color: blue;
@@ -430,11 +414,28 @@ html.rl-no-preview-pane {
}
}
+/*
+ &.openpgp-signed,
+ &.openpgp-encrypted {
+ border: 1px dashed #FA0;
+
+ &.success {
+ border-color: green;
+ background-color: rgba(0, 255, 0, 0.03);
+ }
+ &.error {
+ border-color: red;
+ background-color: rgba(255, 0, 0, 0.03);
+ }
+ }
+*/
.b-openpgp-control {
- display: inline-block;
+ color: #FA0;
cursor: pointer;
+ display: block;
opacity: 0.5;
+ margin: 15px;
&:hover {
opacity: 1;
@@ -442,7 +443,6 @@ html.rl-no-preview-pane {
&.success {
color: green;
- cursor: help;
opacity: 1;
}