From 803113568f7131ff1d9df7773fbb59ddd80c19cc Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Sun, 13 Feb 2022 12:58:01 +0100 Subject: [PATCH 01/29] Resolve #228 --- dev/Model/Message.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 29eb0c23e..8b2e65b0a 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -402,7 +402,6 @@ export class MessageModel extends AbstractModel { oAttachment.isInline(found); oAttachment.isLinked(found || result.foundContentLocationUrls.includes(oAttachment.contentLocation)); }); - this.hasAttachments(oAttachments.hasVisible()); body.innerHTML = result.html; @@ -472,6 +471,7 @@ export class MessageModel extends AbstractModel { } initView() { + this.hasAttachments(this.attachments().hasVisible()); // init BlockquoteSwitcher this.body.querySelectorAll('blockquote:not(.rl-bq-switcher)').forEach(node => { if (node.textContent.trim() && !node.parentNode.closest('blockquote')) { From 9d8325d5a805c1d8ef032778f15909edcc65b4bf Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Sun, 13 Feb 2022 20:01:21 +0100 Subject: [PATCH 02/29] Improved "View in separate window" with theme colors --- dev/Html/PreviewMessage.html | 38 +++++++++++------------------------- dev/Model/Message.js | 25 +++++++++++------------- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/dev/Html/PreviewMessage.html b/dev/Html/PreviewMessage.html index 7632cf6fe..a9bbb736c 100644 --- a/dev/Html/PreviewMessage.html +++ b/dev/Html/PreviewMessage.html @@ -1,31 +1,24 @@
- -]*><\/p>/i, '') .replace(/]*>/i, '') .replace(/<\?xml [^>]*\?>/i, '') .trim(); @@ -137,7 +136,8 @@ export const setAttribute = (name, value) => oElement.setAttribute(name, value), delAttribute = name => oElement.removeAttribute(name); - if (['HEAD','STYLE','SVG','SCRIPT','TITLE','INPUT','BUTTON','TEXTAREA','SELECT'].includes(name) + // \MailSo\Base\HtmlUtils::ClearTags() + if (disallowedTags.includes(name) || 'none' == oStyle.display || 'hidden' == oStyle.visibility // || (oStyle.lineHeight && 1 > parseFloat(oStyle.lineHeight) @@ -148,6 +148,11 @@ export const oElement.remove(); return; } +// if (['CENTER','FORM'].includes(name)) { + if ('FORM' === name) { + replaceWithChildren(oElement); + return; + } if ('BODY' === name) { forEachObjectEntry(tasks, (name, cb) => { From 973cb83ba023de1dcbe662194972e496e43dc603 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Mon, 14 Feb 2022 11:48:23 +0100 Subject: [PATCH 07/29] Resolve #230 --- dev/Common/Html.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/Common/Html.js b/dev/Common/Html.js index 44b707cdb..a7d27c073 100644 --- a/dev/Common/Html.js +++ b/dev/Common/Html.js @@ -325,7 +325,7 @@ export const setAttribute('data-x-style-broken-urls', JSON.stringify(urls.broken)); } - if (11 < pInt(oStyle.fontSize)) { + if (11 > pInt(oStyle.fontSize)) { oStyle.removeProperty('font-size'); } From af959e363186913acff2db9c845236cbafa59093 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Mon, 14 Feb 2022 12:27:43 +0100 Subject: [PATCH 08/29] Resolve #187 (found the real problem, comments in comments) --- dev/Common/Html.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dev/Common/Html.js b/dev/Common/Html.js index a7d27c073..6d2372353 100644 --- a/dev/Common/Html.js +++ b/dev/Common/Html.js @@ -116,8 +116,6 @@ export const .replace(/(
]*>)([\s\S]*?)(<\/pre>)/gi, aMatches => {
return (aMatches[1] + aMatches[2].trim() + aMatches[3].trim()).replace(/\r?\n/g, '
');
})
- // \MailSo\Base\HtmlUtils::ClearComments()
- .replace(//g, '')
// GetDomFromText
.replace(' ', '')
.replace('', '')
@@ -128,6 +126,13 @@ export const
.trim();
html = '';
+ // \MailSo\Base\HtmlUtils::ClearComments()
+ // https://github.com/the-djmaze/snappymail/issues/187
+ const nodeIterator = document.createNodeIterator(tpl.content, NodeFilter.SHOW_COMMENT);
+ while (nodeIterator.nextNode()) {
+ nodeIterator.referenceNode.remove();
+ }
+
tpl.content.querySelectorAll('*').forEach(oElement => {
const name = oElement.tagName,
oStyle = oElement.style,
@@ -172,11 +177,6 @@ export const
else if ('A' === name) {
value = oElement.href;
- // https://github.com/the-djmaze/snappymail/issues/187 can't have block element inside
- if (!value || oElement.querySelector('td,div,p,li')) {
- replaceWithChildren(oElement);
- return;
- }
value = stripTracking(value);
if (!/^([a-z]+):/i.test(value) && '//' !== value.slice(0, 2)) {
setAttribute('data-x-broken-href', value);
From b405b45158610b6efc17cd11032a3c398726147a Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Mon, 14 Feb 2022 12:56:57 +0100
Subject: [PATCH 09/29] Resolve #205 only when 'Language' setting is empty
---
snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php
index 332e3f3ab..0cd30f777 100644
--- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php
+++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions.php
@@ -848,11 +848,13 @@ class Actions
$aResult['ReplySameFolder'] = (bool)$oSettingsLocal->GetConf('ReplySameFolder', $aResult['ReplySameFolder']);
}
+ if ($oConfig->Get('login', 'determine_user_language', true)) {
+ $sLanguage = $this->ValidateLanguage($UserLanguageRaw, $sLanguage, false);
+ }
+
if ($oSettings instanceof Settings) {
if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) {
- $sLanguage = (string)$oSettings->GetConf('Language',
- $oConfig->Get('login', 'determine_user_language', true) ? $UserLanguageRaw : $sLanguage
- );
+ $sLanguage = (string) $oSettings->GetConf('Language', $sLanguage);
}
$aResult['EditorDefaultType'] = (string)$oSettings->GetConf('EditorDefaultType', $aResult['EditorDefaultType']);
From 6c71f25f5050321e52c196635df11b3aa402d5f8 Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Mon, 14 Feb 2022 13:06:00 +0100
Subject: [PATCH 10/29] Resolve #124
---
.../0.0.0/app/libraries/MailSo/Imap/Commands/Folders.php | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Folders.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Folders.php
index d791ba5f2..4a538d744 100644
--- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Folders.php
+++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Folders.php
@@ -51,6 +51,14 @@ trait Folders
array($this->EscapeFolderName($sFolderName)));
// $this->FolderCheck();
// $this->FolderUnselect();
+
+ // Will this workaround solve Dovecot issue #124 ?
+ try {
+ $this->FolderRename($sFolderName, "{$sFolderName}-dummy");
+ $this->FolderRename("{$sFolderName}-dummy", $sFolderName);
+ } catch (\Throwable $e) {
+ }
+
return $this;
}
From 5e9c83c1a84d3df63e41d976b2132136b180bced Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Mon, 14 Feb 2022 14:58:35 +0100
Subject: [PATCH 11/29] Added option to application.ini for CSP reporting
---
.../v/0.0.0/app/libraries/RainLoop/Config/Application.php | 1 +
snappymail/v/0.0.0/app/libraries/RainLoop/Service.php | 2 ++
snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php | 7 ++++++-
3 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php
index 4a8509608..285500be8 100644
--- a/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php
+++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Config/Application.php
@@ -181,6 +181,7 @@ class Application extends \RainLoop\Config\AbstractConfig
'admin_panel_host' => array(''),
'admin_panel_key' => array('admin'),
'content_security_policy' => array(''),
+ 'csp_report' => array(false),
'encrypt_cipher' => array($sCipher)
),
diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php
index fcd24d520..f7c1b51be 100644
--- a/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php
+++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Service.php
@@ -241,7 +241,9 @@ abstract class Service
private static function setCSP(string $sScriptNonce = null) : void
{
$CSP = new \SnappyMail\HTTP\CSP(\trim(Api::Config()->Get('security', 'content_security_policy', '')));
+ $CSP->report = Api::Config()->Get('security', 'csp_report', false);
$CSP->report_only = Api::Config()->Get('debug', 'enable', false); // '0.0.0' === APP_VERSION
+
// Allow https: due to remote images in e-mails or use proxy
if (!Api::Config()->Get('security', 'use_local_proxy_for_external_images', '')) {
$CSP->img[] = 'https:';
diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php b/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php
index 221a51a40..6deebe9af 100644
--- a/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php
+++ b/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php
@@ -15,6 +15,8 @@ class CSP
$img = ["'self'", 'data:'],
$style = ["'self'", "'unsafe-inline'"],
$frame = [],
+
+ $report = false,
$report_to = [],
$report_only = false;
@@ -49,8 +51,11 @@ class CSP
if ($this->frame) {
$params[] = 'frame-src ' . \implode(' ', $this->frame);
}
+
// Deprecated
- $params[] = 'report-uri ./?/CspReport';
+ if ($this->report) {
+ $params[] = 'report-uri ./?/CspReport';
+ }
return \implode('; ', $params);
}
From 27cfd1ee8300e6b08af76099ee100c488dd3a3bb Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Mon, 14 Feb 2022 15:01:42 +0100
Subject: [PATCH 12/29] Cleanup CSP header
---
snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php b/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php
index 6deebe9af..1b9ad019a 100644
--- a/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php
+++ b/snappymail/v/0.0.0/app/libraries/snappymail/http/csp.php
@@ -34,10 +34,7 @@ class CSP
function __toString() : string
{
$params = [
- 'default-src ' . \implode(' ', $this->default),
- 'script-src ' . \implode(' ', $this->script),
- 'img-src ' . \implode(' ', $this->img),
- 'style-src ' . \implode(' ', $this->style),
+ 'default-src ' . \implode(' ', $this->default)
];
if ($this->script) {
$params[] = 'script-src ' . \implode(' ', $this->script);
From 5c229336287c5ad212d22bdbcc0598ea7cfc03c1 Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Mon, 14 Feb 2022 15:39:47 +0100
Subject: [PATCH 13/29] Small restructure
---
.../v/0.0.0/app/libraries/MailSo/Imap/Commands/Quota.php | 2 +-
snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Quota.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Quota.php
index 8fe235e71..de5305a07 100644
--- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Quota.php
+++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Commands/Quota.php
@@ -46,13 +46,13 @@ trait Quota
: null;
}
+ // * QUOTA "User quota" (STORAGE 1284645 2097152)\r\n
private function getQuotaResult(\MailSo\Imap\ResponseCollection $oResponseCollection) : array
{
$aReturn = array(0, 0);
foreach ($oResponseCollection as $oResponse) {
if (Enumerations\ResponseType::UNTAGGED === $oResponse->ResponseType
&& 'QUOTA' === $oResponse->StatusOrIndex
- && \is_array($oResponse->ResponseList)
&& isset($oResponse->ResponseList[3])
&& \is_array($oResponse->ResponseList[3])
&& 2 < \count($oResponse->ResponseList[3])
diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php
index 6704d72ea..f68f5bb6d 100644
--- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php
+++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php
@@ -51,7 +51,6 @@ trait User
{
$sEmail = \MailSo\Base\Utils::Trim($this->GetActionParam('Email', ''));
$sPassword = $this->GetActionParam('Password', '');
- $sLanguage = $this->GetActionParam('Language', '');
$bSignMe = !empty($this->GetActionParam('SignMe', 0));
$oAccount = null;
@@ -63,7 +62,8 @@ trait User
$this->SetAuthToken($oAccount);
- if ($oAccount && \strlen($sLanguage))
+ $sLanguage = $this->GetActionParam('Language', '');
+ if ($oAccount && $sLanguage)
{
$oSettings = $this->SettingsProvider()->Load($oAccount);
if ($oSettings)
From 88c16f5c40c6ecced248632b1e07d6bf952c523b Mon Sep 17 00:00:00 2001
From: the-djmaze <>
Date: Mon, 14 Feb 2022 17:37:58 +0100
Subject: [PATCH 14/29] Cleanup some CSS
---
dev/Styles/Main.less | 2 +-
dev/Styles/User/Contacts.less | 1 -
dev/Styles/User/FolderList.less | 1 -
dev/Styles/User/MessageList.less | 1 -
dev/Styles/User/SquireUI.less | 1 -
dev/Styles/_BootstrapFix.less | 5 -----
dev/Styles/_FontasticToBoot.less | 1 -
.../templates/Views/Admin/AdminSettingsContacts.html | 8 +-------
.../templates/Views/Admin/AdminSettingsDomains.html | 6 ++----
.../app/templates/Views/User/PopupsSieveScript.html | 2 +-
.../app/templates/Views/User/SettingsAccounts.html | 4 ++--
.../app/templates/Views/User/SettingsFilters.html | 2 +-
.../app/templates/Views/User/SettingsFolderItem.html | 2 +-
.../app/templates/Views/User/SettingsOpenPGP.html | 8 ++++----
vendors/bootstrap/less/button-groups.less | 12 ------------
vendors/bootstrap/less/buttons.less | 7 +++----
vendors/bootstrap/less/close.less | 2 +-
vendors/bootstrap/less/code.less | 6 ------
vendors/bootstrap/less/forms.less | 1 -
vendors/bootstrap/less/type.less | 3 ---
vendors/fontastic/styles.css | 2 --
21 files changed, 17 insertions(+), 60 deletions(-)
diff --git a/dev/Styles/Main.less b/dev/Styles/Main.less
index 5c44d72e7..a1568c47a 100644
--- a/dev/Styles/Main.less
+++ b/dev/Styles/Main.less
@@ -12,7 +12,7 @@ html, body {
body {
-webkit-touch-callout: none;
-
+ font-size: @baseFontSize;
position: fixed;
top: 0;
left: 0;
diff --git a/dev/Styles/User/Contacts.less b/dev/Styles/User/Contacts.less
index a14f54deb..620cf5b2f 100644
--- a/dev/Styles/User/Contacts.less
+++ b/dev/Styles/User/Contacts.less
@@ -64,7 +64,6 @@
.listClear {
text-align: center;
padding: 10px;
- font-size: 14px;
line-height: 13px;
box-shadow: inset 0 -1px 0 #ccc;
}
diff --git a/dev/Styles/User/FolderList.less b/dev/Styles/User/FolderList.less
index 92b322453..97d8372bf 100644
--- a/dev/Styles/User/FolderList.less
+++ b/dev/Styles/User/FolderList.less
@@ -74,7 +74,6 @@
background-color: transparent;
vertical-align: middle;
color: var(--folders-disabled-color, #666);
- font-size: 14px;
border-left: 3px solid transparent;
padding: 0 2em 0 @folderItemPadding;
diff --git a/dev/Styles/User/MessageList.less b/dev/Styles/User/MessageList.less
index ca9742e31..d1e7312f2 100644
--- a/dev/Styles/User/MessageList.less
+++ b/dev/Styles/User/MessageList.less
@@ -115,7 +115,6 @@ html.rl-no-preview-pane {
.listClear {
text-align: center;
padding: 10px;
- font-size: 14px;
line-height: 13px;
}
diff --git a/dev/Styles/User/SquireUI.less b/dev/Styles/User/SquireUI.less
index 9425a7659..ee4976d5f 100644
--- a/dev/Styles/User/SquireUI.less
+++ b/dev/Styles/User/SquireUI.less
@@ -100,7 +100,6 @@
blockquote p {
margin: 0 0 10px;
- font-size: 14px;
line-height: 20px;
}
diff --git a/dev/Styles/_BootstrapFix.less b/dev/Styles/_BootstrapFix.less
index 0827a9847..e2c0b51d1 100644
--- a/dev/Styles/_BootstrapFix.less
+++ b/dev/Styles/_BootstrapFix.less
@@ -15,11 +15,6 @@ summary.legend {
cursor: pointer;
}
-.btn-small.btn-small-small {
- font-size: 11px;
- line-height: 11px;
-}
-
.btn.btn-thin {
padding: 4px 9px;
}
diff --git a/dev/Styles/_FontasticToBoot.less b/dev/Styles/_FontasticToBoot.less
index dc4518231..92a7645b3 100644
--- a/dev/Styles/_FontasticToBoot.less
+++ b/dev/Styles/_FontasticToBoot.less
@@ -9,7 +9,6 @@
[class*=" icon-"] {
display: inline-block;
width: 1em;
- height: 1em;
vertical-align: text-top;
.disabled &,
diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html
index 0063622a0..87ee6052b 100644
--- a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html
+++ b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html
@@ -39,13 +39,7 @@
-
-
-host=127.0.0.1;port=3306;dbname=snappymail
-host=127.0.0.1;port=5432;dbname=snappymail
-
-
+ data-bind="value: pdoDsn, saveTrigger: pdoDsnTrigger" placeholder="mysql:host=127.0.0.1;port=3306;dbname=snappymail"/>
diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsDomains.html b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsDomains.html
index 8fd3f7626..764474de2 100644
--- a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsDomains.html
+++ b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsDomains.html
@@ -7,9 +7,7 @@
-
-
-
+