From cd807938c4b226f13ada5f858ae389f6f73870fe Mon Sep 17 00:00:00 2001 From: Gene Hawkins Date: Mon, 8 Sep 2025 20:51:00 -0500 Subject: [PATCH 01/12] Added Languages --- localization/ar.inc | 5 +++++ localization/ar_SA.inc | 5 +++++ localization/bg_BG.inc | 5 +++++ localization/cs_CZ.inc | 5 +++++ localization/da_DK.inc | 5 +++++ localization/de_CH.inc | 5 +++++ localization/de_DE.inc | 7 +++---- localization/el_GR.inc | 5 +++++ localization/en_CA.inc | 5 +++++ localization/en_GB.inc | 5 +++++ localization/es_419.inc | 5 +++++ localization/es_AR.inc | 5 +++++ localization/es_ES.inc | 5 +++++ localization/et_EE.inc | 5 +++++ localization/fi_FI.inc | 5 +++++ localization/fr_FR.inc | 7 +++---- localization/he_IL.inc | 5 +++++ localization/hu_HU.inc | 5 +++++ localization/id_ID.inc | 5 +++++ localization/it_IT.inc | 5 +++++ localization/ja_JP.inc | 5 +++++ localization/ko_KR.inc | 5 +++++ localization/lt_LT.inc | 5 +++++ localization/lv_LV.inc | 5 +++++ localization/nl_BE.inc | 5 +++++ localization/nl_NL.inc | 7 +++---- localization/nn_NO.inc | 5 +++++ localization/pl_PL.inc | 5 +++++ localization/pt_BR.inc | 5 +++++ localization/pt_PT.inc | 5 +++++ localization/ro_RO.inc | 5 +++++ localization/ru_RU.inc | 7 +++---- localization/sk_SK.inc | 5 +++++ localization/sl_SI.inc | 5 +++++ localization/sv_SE.inc | 5 +++++ localization/tr_TR.inc | 5 +++++ localization/uk_UA.inc | 5 +++++ localization/vi_VN.inc | 5 +++++ localization/zh_CN.inc | 5 +++++ localization/zh_TW.inc | 5 +++++ 40 files changed, 192 insertions(+), 16 deletions(-) create mode 100644 localization/ar.inc create mode 100644 localization/ar_SA.inc create mode 100644 localization/bg_BG.inc create mode 100644 localization/cs_CZ.inc create mode 100644 localization/da_DK.inc create mode 100644 localization/de_CH.inc create mode 100644 localization/el_GR.inc create mode 100644 localization/en_CA.inc create mode 100644 localization/en_GB.inc create mode 100644 localization/es_419.inc create mode 100644 localization/es_AR.inc create mode 100644 localization/es_ES.inc create mode 100644 localization/et_EE.inc create mode 100644 localization/fi_FI.inc create mode 100644 localization/he_IL.inc create mode 100644 localization/hu_HU.inc create mode 100644 localization/id_ID.inc create mode 100644 localization/it_IT.inc create mode 100644 localization/ja_JP.inc create mode 100644 localization/ko_KR.inc create mode 100644 localization/lt_LT.inc create mode 100644 localization/lv_LV.inc create mode 100644 localization/nl_BE.inc create mode 100644 localization/nn_NO.inc create mode 100644 localization/pl_PL.inc create mode 100644 localization/pt_BR.inc create mode 100644 localization/pt_PT.inc create mode 100644 localization/ro_RO.inc create mode 100644 localization/sk_SK.inc create mode 100644 localization/sl_SI.inc create mode 100644 localization/sv_SE.inc create mode 100644 localization/tr_TR.inc create mode 100644 localization/uk_UA.inc create mode 100644 localization/vi_VN.inc create mode 100644 localization/zh_CN.inc create mode 100644 localization/zh_TW.inc diff --git a/localization/ar.inc b/localization/ar.inc new file mode 100644 index 0000000..12dede9 --- /dev/null +++ b/localization/ar.inc @@ -0,0 +1,5 @@ + diff --git a/localization/ar_SA.inc b/localization/ar_SA.inc new file mode 100644 index 0000000..12dede9 --- /dev/null +++ b/localization/ar_SA.inc @@ -0,0 +1,5 @@ + diff --git a/localization/bg_BG.inc b/localization/bg_BG.inc new file mode 100644 index 0000000..4b4da6f --- /dev/null +++ b/localization/bg_BG.inc @@ -0,0 +1,5 @@ + diff --git a/localization/cs_CZ.inc b/localization/cs_CZ.inc new file mode 100644 index 0000000..cc9e6ee --- /dev/null +++ b/localization/cs_CZ.inc @@ -0,0 +1,5 @@ + diff --git a/localization/da_DK.inc b/localization/da_DK.inc new file mode 100644 index 0000000..45cfec8 --- /dev/null +++ b/localization/da_DK.inc @@ -0,0 +1,5 @@ + diff --git a/localization/de_CH.inc b/localization/de_CH.inc new file mode 100644 index 0000000..9f17640 --- /dev/null +++ b/localization/de_CH.inc @@ -0,0 +1,5 @@ + diff --git a/localization/de_DE.inc b/localization/de_DE.inc index 01a9013..9f17640 100644 --- a/localization/de_DE.inc +++ b/localization/de_DE.inc @@ -1,6 +1,5 @@ diff --git a/localization/el_GR.inc b/localization/el_GR.inc new file mode 100644 index 0000000..c99bcdf --- /dev/null +++ b/localization/el_GR.inc @@ -0,0 +1,5 @@ + diff --git a/localization/en_CA.inc b/localization/en_CA.inc new file mode 100644 index 0000000..b1f3b89 --- /dev/null +++ b/localization/en_CA.inc @@ -0,0 +1,5 @@ + diff --git a/localization/en_GB.inc b/localization/en_GB.inc new file mode 100644 index 0000000..b1f3b89 --- /dev/null +++ b/localization/en_GB.inc @@ -0,0 +1,5 @@ + diff --git a/localization/es_419.inc b/localization/es_419.inc new file mode 100644 index 0000000..80e6de7 --- /dev/null +++ b/localization/es_419.inc @@ -0,0 +1,5 @@ + diff --git a/localization/es_AR.inc b/localization/es_AR.inc new file mode 100644 index 0000000..80e6de7 --- /dev/null +++ b/localization/es_AR.inc @@ -0,0 +1,5 @@ + diff --git a/localization/es_ES.inc b/localization/es_ES.inc new file mode 100644 index 0000000..80e6de7 --- /dev/null +++ b/localization/es_ES.inc @@ -0,0 +1,5 @@ + diff --git a/localization/et_EE.inc b/localization/et_EE.inc new file mode 100644 index 0000000..595dc12 --- /dev/null +++ b/localization/et_EE.inc @@ -0,0 +1,5 @@ + diff --git a/localization/fi_FI.inc b/localization/fi_FI.inc new file mode 100644 index 0000000..51d217b --- /dev/null +++ b/localization/fi_FI.inc @@ -0,0 +1,5 @@ + diff --git a/localization/fr_FR.inc b/localization/fr_FR.inc index e745b90..11f5ce3 100644 --- a/localization/fr_FR.inc +++ b/localization/fr_FR.inc @@ -1,6 +1,5 @@ diff --git a/localization/he_IL.inc b/localization/he_IL.inc new file mode 100644 index 0000000..d509f81 --- /dev/null +++ b/localization/he_IL.inc @@ -0,0 +1,5 @@ + diff --git a/localization/hu_HU.inc b/localization/hu_HU.inc new file mode 100644 index 0000000..eeb3ff0 --- /dev/null +++ b/localization/hu_HU.inc @@ -0,0 +1,5 @@ + diff --git a/localization/id_ID.inc b/localization/id_ID.inc new file mode 100644 index 0000000..28ba802 --- /dev/null +++ b/localization/id_ID.inc @@ -0,0 +1,5 @@ + diff --git a/localization/it_IT.inc b/localization/it_IT.inc new file mode 100644 index 0000000..a710698 --- /dev/null +++ b/localization/it_IT.inc @@ -0,0 +1,5 @@ + diff --git a/localization/ja_JP.inc b/localization/ja_JP.inc new file mode 100644 index 0000000..5397c88 --- /dev/null +++ b/localization/ja_JP.inc @@ -0,0 +1,5 @@ + diff --git a/localization/ko_KR.inc b/localization/ko_KR.inc new file mode 100644 index 0000000..a00715b --- /dev/null +++ b/localization/ko_KR.inc @@ -0,0 +1,5 @@ + diff --git a/localization/lt_LT.inc b/localization/lt_LT.inc new file mode 100644 index 0000000..6cc5c26 --- /dev/null +++ b/localization/lt_LT.inc @@ -0,0 +1,5 @@ + diff --git a/localization/lv_LV.inc b/localization/lv_LV.inc new file mode 100644 index 0000000..c16654a --- /dev/null +++ b/localization/lv_LV.inc @@ -0,0 +1,5 @@ + diff --git a/localization/nl_BE.inc b/localization/nl_BE.inc new file mode 100644 index 0000000..44399da --- /dev/null +++ b/localization/nl_BE.inc @@ -0,0 +1,5 @@ + diff --git a/localization/nl_NL.inc b/localization/nl_NL.inc index e4aa53d..44399da 100644 --- a/localization/nl_NL.inc +++ b/localization/nl_NL.inc @@ -1,6 +1,5 @@ diff --git a/localization/nn_NO.inc b/localization/nn_NO.inc new file mode 100644 index 0000000..ec10e1a --- /dev/null +++ b/localization/nn_NO.inc @@ -0,0 +1,5 @@ + diff --git a/localization/pl_PL.inc b/localization/pl_PL.inc new file mode 100644 index 0000000..dde1ad2 --- /dev/null +++ b/localization/pl_PL.inc @@ -0,0 +1,5 @@ + diff --git a/localization/pt_BR.inc b/localization/pt_BR.inc new file mode 100644 index 0000000..1cd514f --- /dev/null +++ b/localization/pt_BR.inc @@ -0,0 +1,5 @@ + diff --git a/localization/pt_PT.inc b/localization/pt_PT.inc new file mode 100644 index 0000000..1cd514f --- /dev/null +++ b/localization/pt_PT.inc @@ -0,0 +1,5 @@ + diff --git a/localization/ro_RO.inc b/localization/ro_RO.inc new file mode 100644 index 0000000..81f5ec9 --- /dev/null +++ b/localization/ro_RO.inc @@ -0,0 +1,5 @@ + diff --git a/localization/ru_RU.inc b/localization/ru_RU.inc index bd33eaa..7a84236 100644 --- a/localization/ru_RU.inc +++ b/localization/ru_RU.inc @@ -1,6 +1,5 @@ diff --git a/localization/sk_SK.inc b/localization/sk_SK.inc new file mode 100644 index 0000000..e12e4bf --- /dev/null +++ b/localization/sk_SK.inc @@ -0,0 +1,5 @@ + diff --git a/localization/sl_SI.inc b/localization/sl_SI.inc new file mode 100644 index 0000000..f830fe2 --- /dev/null +++ b/localization/sl_SI.inc @@ -0,0 +1,5 @@ + diff --git a/localization/sv_SE.inc b/localization/sv_SE.inc new file mode 100644 index 0000000..7dc94d6 --- /dev/null +++ b/localization/sv_SE.inc @@ -0,0 +1,5 @@ + diff --git a/localization/tr_TR.inc b/localization/tr_TR.inc new file mode 100644 index 0000000..4ba652d --- /dev/null +++ b/localization/tr_TR.inc @@ -0,0 +1,5 @@ + diff --git a/localization/uk_UA.inc b/localization/uk_UA.inc new file mode 100644 index 0000000..5735354 --- /dev/null +++ b/localization/uk_UA.inc @@ -0,0 +1,5 @@ + diff --git a/localization/vi_VN.inc b/localization/vi_VN.inc new file mode 100644 index 0000000..dabe7d1 --- /dev/null +++ b/localization/vi_VN.inc @@ -0,0 +1,5 @@ + diff --git a/localization/zh_CN.inc b/localization/zh_CN.inc new file mode 100644 index 0000000..f9f66f9 --- /dev/null +++ b/localization/zh_CN.inc @@ -0,0 +1,5 @@ + diff --git a/localization/zh_TW.inc b/localization/zh_TW.inc new file mode 100644 index 0000000..f9f66f9 --- /dev/null +++ b/localization/zh_TW.inc @@ -0,0 +1,5 @@ + From f1f6305d7358cdc94a15b8e3678dcfcc5a837171 Mon Sep 17 00:00:00 2001 From: Gene Hawkins Date: Tue, 9 Sep 2025 15:30:31 -0500 Subject: [PATCH 02/12] Update localization/pt_BR.inc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Maurício Meneghini Fauth --- localization/pt_BR.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/localization/pt_BR.inc b/localization/pt_BR.inc index 1cd514f..20583b6 100644 --- a/localization/pt_BR.inc +++ b/localization/pt_BR.inc @@ -1,5 +1,5 @@ From a77c4aab90579f55368a961780d236846cdd9dda Mon Sep 17 00:00:00 2001 From: Gene Hawkins Date: Tue, 9 Sep 2025 15:30:37 -0500 Subject: [PATCH 03/12] Update localization/pt_PT.inc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Maurício Meneghini Fauth --- localization/pt_PT.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/pt_PT.inc b/localization/pt_PT.inc index 1cd514f..9913f80 100644 --- a/localization/pt_PT.inc +++ b/localization/pt_PT.inc @@ -1,5 +1,5 @@ From 73989534c61c48471ea26c580670781635193415 Mon Sep 17 00:00:00 2001 From: Gene Hawkins Date: Tue, 9 Sep 2025 15:30:49 -0500 Subject: [PATCH 04/12] Update localization/fr_FR.inc Co-authored-by: William Desportes --- localization/fr_FR.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/fr_FR.inc b/localization/fr_FR.inc index 11f5ce3..c3811c4 100644 --- a/localization/fr_FR.inc +++ b/localization/fr_FR.inc @@ -1,5 +1,5 @@ From 925748b4f68772d87c5747b96ae33b30f406a854 Mon Sep 17 00:00:00 2001 From: Gene Hawkins Date: Tue, 9 Sep 2025 15:30:59 -0500 Subject: [PATCH 05/12] Update localization/fr_FR.inc Co-authored-by: William Desportes --- localization/fr_FR.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/fr_FR.inc b/localization/fr_FR.inc index c3811c4..81f4622 100644 --- a/localization/fr_FR.inc +++ b/localization/fr_FR.inc @@ -1,5 +1,5 @@ From 2faa71c8f4e3526eb928004144149ddbf55eca7e Mon Sep 17 00:00:00 2001 From: William Desportes Date: Fri, 12 Sep 2025 09:55:32 +0200 Subject: [PATCH 06/12] Update localization/ro_RO.inc Co-authored-by: Liviu-Mihail Concioiu --- localization/ro_RO.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/ro_RO.inc b/localization/ro_RO.inc index 81f5ec9..80556ad 100644 --- a/localization/ro_RO.inc +++ b/localization/ro_RO.inc @@ -1,5 +1,5 @@ From 72f034b1ad017c4c7574f66a16b4ea076462117d Mon Sep 17 00:00:00 2001 From: William Desportes Date: Fri, 12 Sep 2025 09:56:32 +0200 Subject: [PATCH 07/12] Update localization/ar.inc Co-authored-by: Fawzi Essam --- localization/ar.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/ar.inc b/localization/ar.inc index 12dede9..5892a61 100644 --- a/localization/ar.inc +++ b/localization/ar.inc @@ -1,5 +1,5 @@ From ce093106ffa3a00615b95289709830d02616dfbd Mon Sep 17 00:00:00 2001 From: William Desportes Date: Fri, 12 Sep 2025 09:56:41 +0200 Subject: [PATCH 08/12] Update localization/ar_SA.inc Co-authored-by: Fawzi Essam --- localization/ar_SA.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/ar_SA.inc b/localization/ar_SA.inc index 12dede9..b21a5ad 100644 --- a/localization/ar_SA.inc +++ b/localization/ar_SA.inc @@ -1,5 +1,5 @@ From 6c45a46a8d95fe4d051025e0c11a16d9359cb83f Mon Sep 17 00:00:00 2001 From: William Desportes Date: Fri, 12 Sep 2025 09:57:06 +0200 Subject: [PATCH 09/12] Update localization/fr_FR.inc --- localization/fr_FR.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/fr_FR.inc b/localization/fr_FR.inc index 81f4622..00d3584 100644 --- a/localization/fr_FR.inc +++ b/localization/fr_FR.inc @@ -1,5 +1,5 @@ From 92bdc6a8a2237fc72f4b3105723566635e95ed78 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Fri, 12 Sep 2025 09:57:23 +0200 Subject: [PATCH 10/12] Update localization/fr_FR.inc --- localization/fr_FR.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/fr_FR.inc b/localization/fr_FR.inc index 00d3584..9be8061 100644 --- a/localization/fr_FR.inc +++ b/localization/fr_FR.inc @@ -1,5 +1,5 @@ From 26f59881d31e05387abb62f65e88706856b619aa Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 20 Sep 2025 10:33:42 +0200 Subject: [PATCH 11/12] Update localization/en_GB.inc Co-authored-by: Fawzi Essam --- localization/en_GB.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/localization/en_GB.inc b/localization/en_GB.inc index b1f3b89..04ea2b0 100644 --- a/localization/en_GB.inc +++ b/localization/en_GB.inc @@ -1,5 +1,5 @@ From 9fc8a0ab0b0a164bbc65a359d50b627a0bec7d8e Mon Sep 17 00:00:00 2001 From: Gene Hawkins Date: Fri, 17 Apr 2026 07:39:27 -0500 Subject: [PATCH 12/12] RC1.7 Updates --- test/TlsIconTest.php | 205 +++++++++++------------------------------- test/rcmail.php | 14 +++ test/rcube_plugin.php | 6 ++ tls_icon.php | 51 ++++++++++- 4 files changed, 119 insertions(+), 157 deletions(-) diff --git a/test/TlsIconTest.php b/test/TlsIconTest.php index 3cbc732..3ae90d2 100644 --- a/test/TlsIconTest.php +++ b/test/TlsIconTest.php @@ -11,27 +11,12 @@ final class TlsIconTest extends TestCase { - - /** @var string */ - private $strUnEnCrypted = ''; - - /** @var string */ - private $strCryptedTlsv12 = ''; - - /** @var string */ - private $strCryptedTlsv12WithCipher = ''; - - /** @var string */ - private $strInternal = ''; - - /** @var string */ - private $strSendmailCryptedTlsv13WithCipherNoVerify = ''; - - /** @var string */ - private $strSendmailCryptedTlsv12WithCipherVerify = ''; - - /** @var string */ - private $strStalwartCryptedTlsv13WithCipher = ''; + private function assertSubjectContainsIcon($headersProcessed, $title) + { + $value = $headersProcessed['output']['subject']['value']; + $this->assertStringContainsString('src="data:image/svg+xml;charset=UTF-8,', $value); + $this->assertStringContainsString('title="' . $title . '"', $value); + } public function testInstance() { @@ -65,6 +50,7 @@ public function testMessageHeadersNothing() public function testMessageHeadersNoMatching() { $o = new tls_icon(); + $o->init(); $headersProcessed = $o->message_headers([ 'output' => [ 'subject' => [ @@ -77,11 +63,19 @@ public function testMessageHeadersNoMatching() ] ] ]); - $this->assertEquals([ + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'Message received over an unencrypted connection!'); + } + + public function testMessageHeadersNoMatchingWithUrlbaseWithoutTrailingSlash() + { + $o = new tls_icon(); + $o->urlbase = 'plugins/tls_icon'; + $o->init(); + $headersProcessed = $o->message_headers([ 'output' => [ 'subject' => [ - 'value' => 'Sent to you' . $this->strUnEnCrypted, - 'html' => 1, + 'value' => 'Sent to you', ], ], 'headers' => (object)[ @@ -89,12 +83,15 @@ public function testMessageHeadersNoMatching() 'received' => 'my header', ] ] - ], $headersProcessed); + ]); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'Message received over an unencrypted connection!'); } - public function testMessageHeadersTlsWithCipher() + public function testMessageHeadersNoMatchingUsesAbsolutePluginAssetUrl() { $o = new tls_icon(); + $o->init(); $headersProcessed = $o->message_headers([ 'output' => [ 'subject' => [ @@ -103,18 +100,20 @@ public function testMessageHeadersTlsWithCipher() ], 'headers' => (object)[ 'others' => [ - 'received' => 'from smtp.github.com (out-21.smtp.github.com [192.30.252.204]) - (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) - by mail.example.org (Postfix) with ESMTPS id 46B4C497C2 - for ; Sat, 9 Jul 2022 14:03:01 +0000 (UTC)', + 'received' => 'my header', ] ] ]); - $this->assertEquals([ + $this->assertStringContainsString('src="data:image/svg+xml;charset=UTF-8,', $headersProcessed['output']['subject']['value']); + } + + public function testMessageHeadersTlsWithCipher() + { + $o = new tls_icon(); + $headersProcessed = $o->message_headers([ 'output' => [ 'subject' => [ - 'value' => 'Sent to you' . $this->strCryptedTlsv12WithCipher, - 'html' => 1, + 'value' => 'Sent to you', ], ], 'headers' => (object)[ @@ -125,7 +124,9 @@ public function testMessageHeadersTlsWithCipher() for ; Sat, 9 Jul 2022 14:03:01 +0000 (UTC)', ] ] - ], $headersProcessed); + ]); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)'); } public function testMessageHeadersTls() @@ -146,22 +147,8 @@ public function testMessageHeadersTls() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strCryptedTlsv12, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => 'from smtp.github.com (out-21.smtp.github.com [192.30.252.204]) - (using TLSv1.2) (No client certificate requested) - by mail.example.org (Postfix) with ESMTPS id 46B4C497C2 - for ; Sat, 9 Jul 2022 14:03:01 +0000 (UTC)', - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.2'); } public function testMessageHeadersInternal() @@ -180,20 +167,8 @@ public function testMessageHeadersInternal() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strInternal, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => 'by aaa.bbb.ccc (Postfix, from userid 0) - id A70248414D5; Sun, 26 Apr 2020 16:49:01 +0200 (CEST)', - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'Mail was internal'); } public function testMessageHeadersMultiFromWithConfig() @@ -220,19 +195,8 @@ public function testMessageHeadersMultiFromWithConfig() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strCryptedTlsv12WithCipher, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => $inputHeaders, - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)'); } public function testMessageHeadersMultiFromWithBadConfig() @@ -259,19 +223,8 @@ public function testMessageHeadersMultiFromWithBadConfig() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strUnEnCrypted, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => $inputHeaders, - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'Message received over an unencrypted connection!'); } public function testSendmailTLS13NoVerify() @@ -292,22 +245,8 @@ public function testSendmailTLS13NoVerify() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strSendmailCryptedTlsv13WithCipherNoVerify, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => 'from 69-171-232-143.mail-mail.facebook.com (69-171-232-143.mail-mail.facebook.com [69.171.232.143]) - by mail.aegee.org (8.17.1/8.17.1) with ESMTPS id 2BI73F8b1489360 - (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO) - for ; Sun, 18 Dec 2022 07:03:16 GMT', - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO'); } public function testSendmailTLS12WithVerify() @@ -328,22 +267,8 @@ public function testSendmailTLS12WithVerify() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strSendmailCryptedTlsv12WithCipherVerify, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => 'from smtp.github.com (out-18.smtp.github.com [192.30.252.201]) - by mail.aegee.org (8.17.1/8.17.1) with ESMTPS id 2BGMf4uY685293 - (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) - for ; Fri, 16 Dec 2022 22:41:05 GMT', - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK'); } public function testSendmailTLS13MultipleRecipients() @@ -364,22 +289,8 @@ public function testSendmailTLS13MultipleRecipients() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strSendmailCryptedTlsv13WithCipherNoVerify, - 'html' => 1, - ], - ], - 'headers' => (object)[ - 'others' => [ - 'received' => 'from mout.kundenserver.de (mout.kundenserver.de [212.227.126.134]) - by mail.aegee.org (8.17.1/8.17.1) with ESMTPS id 2BLGrgYw3602565 - (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); - Wed, 21 Dec 2022 16:53:42 GMT', - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO'); } public function testStalwartTls() @@ -400,21 +311,7 @@ public function testStalwartTls() ] ] ]); - $this->assertEquals([ - 'output' => [ - 'subject' => [ - 'value' => 'Sent to you' . $this->strStalwartCryptedTlsv13WithCipher, - 'html' => 1, - ], - ], - 'headers' => (object) [ - 'others' => [ - 'received' => 'from mail-yw1-f174.google.com (mail-yw1-f174.google.com [209.85.128.174] (AS15169 Google LLC, US)) - (using TLSv1.3 with cipher TLS13_AES_256_GCM_SHA384) - by mail.example.org (Stalwart SMTP) with ESMTPS id 36DAF29F3A02098; - Mon, 16 Jun 2025 13:33:03 +0000', - ] - ] - ], $headersProcessed); + $this->assertSame(1, $headersProcessed['output']['subject']['html']); + $this->assertSubjectContainsIcon($headersProcessed, 'TLSv1.3 with cipher TLS13_AES_256_GCM_SHA384'); } } diff --git a/test/rcmail.php b/test/rcmail.php index c3e8052..b70412d 100644 --- a/test/rcmail.php +++ b/test/rcmail.php @@ -30,6 +30,11 @@ class rcmail */ public $config; + /** + * @var rcmail_output + */ + public $output; + /** * @var self|null */ @@ -38,6 +43,7 @@ class rcmail public function __construct() { $this->config = new rcmail_config(); + $this->output = new rcmail_output(); } public static function get_instance() { @@ -48,3 +54,11 @@ public static function get_instance() { return static::$instance; } } + +class rcmail_output +{ + public function abs_url($path) + { + return '/' . ltrim($path, '/'); + } +} diff --git a/test/rcube_plugin.php b/test/rcube_plugin.php index d931491..7084d04 100644 --- a/test/rcube_plugin.php +++ b/test/rcube_plugin.php @@ -5,6 +5,12 @@ */ class rcube_plugin { + public $urlbase = 'plugins/tls_icon/'; + + public function url($path) { + return rtrim($this->urlbase, '/') . '/' . ltrim($path, '/'); + } + public function gettext($label) { global $labels; require_once __DIR__ . '/../localization/en_US.inc'; diff --git a/tls_icon.php b/tls_icon.php index 40a4b6f..db6fd7f 100644 --- a/tls_icon.php +++ b/tls_icon.php @@ -10,6 +10,51 @@ class tls_icon extends rcube_plugin private $icon_img; private $rcmail; + private function asset_url($file) + { + $file = ltrim($file, '/'); + $url = ''; + + if (method_exists($this, 'url')) { + $url = $this->url($file); + } elseif (!empty($this->urlbase) && is_string($this->urlbase)) { + $url = rtrim($this->urlbase, '/') . '/' . $file; + } else { + $url = 'plugins/tls_icon/' . $file; + } + + if (preg_match('/^(?:[a-z][a-z0-9+.-]*:|\\/)/i', $url)) { + return $url; + } + + if ($this->rcmail && isset($this->rcmail->output) && method_exists($this->rcmail->output, 'abs_url')) { + return $this->rcmail->output->abs_url($url); + } + + return $url; + } + + private function icon_tag($file, $title) + { + return ''; + } + + private function icon_src($file) + { + $file = ltrim($file, '/'); + $path = __DIR__ . '/' . $file; + + if (is_readable($path) && preg_match('/\.svg$/i', $file)) { + $svg = @file_get_contents($path); + + if (is_string($svg) && $svg !== '') { + return 'data:image/svg+xml;charset=UTF-8,' . rawurlencode($svg); + } + } + + return $this->asset_url($file); + } + function init() { $this->rcmail = rcmail::get_instance(); @@ -62,12 +107,12 @@ public function message_headers($p) if (preg_match_all(tls_icon::POSTFIX_TLS_REGEX, $Received, $items, PREG_PATTERN_ORDER) || preg_match_all(tls_icon::SENDMAIL_TLS_REGEX, $Received, $items, PREG_PATTERN_ORDER)) { $data = $items[1][0]; - $this->icon_img .= ''; + $this->icon_img .= $this->icon_tag('lock.svg', htmlentities($data)); } elseif (preg_match_all(tls_icon::POSTFIX_LOCAL_REGEX, $Received, $items, PREG_PATTERN_ORDER)) { - $this->icon_img .= ''; + $this->icon_img .= $this->icon_tag('blue_lock.svg', $this->gettext('internal')); } else { // TODO: Mails received from localhost but without TLS are currently flagged insecure - $this->icon_img .= ''; + $this->icon_img .= $this->icon_tag('unlock.svg', $this->gettext('unencrypted')); } }