Hello community,

here is the log from the commit of package enigmail for openSUSE:Factory 
checked in at 2017-12-22 12:20:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/enigmail (Old)
 and      /work/SRC/openSUSE:Factory/.enigmail.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "enigmail"

Fri Dec 22 12:20:52 2017 rev:19 rq:559105 version:1.9.9

Changes:
--------
--- /work/SRC/openSUSE:Factory/enigmail/enigmail.changes        2017-10-05 
12:07:05.246501668 +0200
+++ /work/SRC/openSUSE:Factory/.enigmail.new/enigmail.changes   2017-12-22 
12:21:31.411941850 +0100
@@ -1,0 +2,12 @@
+Wed Dec 20 14:13:36 UTC 2017 - [email protected]
+
+- enigmail 1.9.9, fixing multiple vulnerabilities (boo#1073858):
+  * Enigmail could be coerced to use a malicious PGP public key
+    with a corresponding secret key controlled by an attacker
+  * Enigmail could have replayed encrypted content in partially
+    encrypted e-mails, allowing a plaintext leak
+  * Enigmail could be tricked into displaying incorrect signature
+    verification results
+  * Specially crafted content may cause denial of service
+
+-------------------------------------------------------------------

Old:
----
  enigmail-1.9.8.3.tar.gz
  enigmail-1.9.8.3.tar.gz.asc

New:
----
  enigmail-1.9.9.tar.gz
  enigmail-1.9.9.tar.gz.asc

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ enigmail.spec ++++++
--- /var/tmp/diff_new_pack.Mkr1rV/_old  2017-12-22 12:21:32.623882757 +0100
+++ /var/tmp/diff_new_pack.Mkr1rV/_new  2017-12-22 12:21:32.627882562 +0100
@@ -18,7 +18,7 @@
 
 
 Name:           enigmail
-Version:        1.9.8.3
+Version:        1.9.9
 Release:        0
 Summary:        OpenPGP addon for Thunderbird and SeaMonkey
 License:        MPL-2.0

++++++ enigmail-1.9.8.3.tar.gz -> enigmail-1.9.9.tar.gz ++++++
++++ 1662 lines of diff (skipped)
++++    retrying with extended exclude list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/Makefile new/enigmail/Makefile
--- old/enigmail/Makefile       2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/Makefile       2017-12-09 16:36:07.000000000 +0100
@@ -3,7 +3,7 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 XPI_MODULE     = enigmail
-XPI_MODULE_VERS = 1.9.8.3
+XPI_MODULE_VERS = 1.9.9
 
 DEPTH          = .
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/configure.ac new/enigmail/configure.ac
--- old/enigmail/configure.ac   2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/configure.ac   2017-12-09 16:36:07.000000000 +0100
@@ -2,7 +2,7 @@
 AC_PREREQ(2.61)
 min_automake_version="1.10"
 
-AC_INIT([enigmail],[1.9.8.3], [https://www.enigmail.net])
+AC_INIT([enigmail],[1.9.9], [https://www.enigmail.net])
 
 
 AC_PATH_PROG(PYTHON, "python2")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/ar/enigmail.properties 
new/enigmail/lang/ar/enigmail.properties
--- old/enigmail/lang/ar/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/ar/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -324,3 +324,5 @@
 addUidDlg.nameMinLengthError=ينبغي أن يتألف الاسم من خمسة محارف على الأقل
 addUidDlg.invalidEmailError=ينبغي أن تضع عنوان بريد صحيح
 addUidDlg.commentError=غير مسموح بالأقواس المربعة في التعليق
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/bg/enigmail.properties 
new/enigmail/lang/bg/enigmail.properties
--- old/enigmail/lang/bg/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/bg/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -346,3 +346,5 @@
 addUidDlg.commentError=Скобите не са позволени в коментарите
 errorType.SecurityProtocol=Протоколът за сигурност, използван от уеб услугата 
е неизвестен.
 filter.decryptCopy.label=Създайте декриптирано копие (Enigmail)
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/ca/enigmail.properties 
new/enigmail/lang/ca/enigmail.properties
--- old/enigmail/lang/ca/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/ca/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -338,3 +338,5 @@
 addUidDlg.nameMinLengthError=El nom ha de tenir 5 caràcters com a mínim
 addUidDlg.invalidEmailError=Heu d'indicar una adreça de correu vàlida
 addUidDlg.commentError=No es permeten claudàtors en els comentaris
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/cs/enigmail.properties 
new/enigmail/lang/cs/enigmail.properties
--- old/enigmail/lang/cs/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/cs/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -353,3 +353,5 @@
 errorType.SecurityCertificate=Certifikát zabezpečení předložený webové službě 
není platný.
 errorType.SecurityProtocol=Bezpečnostní protokol používaný webovou službou 
není znám.
 errorType.Network=Došlo k chybě sítě.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/de/enigmail.properties 
new/enigmail/lang/de/enigmail.properties
--- old/enigmail/lang/de/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/de/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Ihr Schlüssel %1$S läuft in weniger als %2$S Tagen 
ab.\n\nEs wird empfohlen, dass Sie ein neues Schlüsselpaar erzeugen und die 
entsprechenden E-Mail-Konten so einstellen, dass die neuen Schlüssel benutzt 
werden.
 expiry.keysExpireSoon=Die folgenden Ihrer Schlüssel laufen in weniger als %1$S 
Tagen ab: %2$S.\n\nEs wird empfohlen, dass Sie neue Schlüssel erzeugen und die 
entsprechenden E-Mail-Konten so einstellen, dass die neuen Schlüssel benutzt 
werden.
+msgCompose.partiallyEncrypted.short=Vorsicht: teilweise verschlüsselte Email - 
Sie könnten sensitive Informationen preisgeben.
+msgCompose.partiallyEncrypted.long=Die Nachricht welche Sie bearbeiten wurde 
teilweise verschlüsselt, d.h. sie enthält verschlüsselte und unverschlüsselte 
Teile. Einige verschlüsselte Teile der Nachricht können sogar unsichtbar 
sein.\n\nWenn der Absender der Nachricht nicht in der Lage war diese zu 
entschlüsseln, ist es wahrscheinlich, dass die Nachricht in einen harmlosen 
unverschlüsselten Text verpackt wurde, und Sie beim Antworten unbewusst die 
verschlüsselte Information preisgeben.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/el/enigmail.properties 
new/enigmail/lang/el/enigmail.properties
--- old/enigmail/lang/el/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/el/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -353,3 +353,5 @@
 errorType.SecurityCertificate=Το πιστοποιητικό ασφαλείας της υπηρεσίας web 
είναι άκυρο.
 errorType.SecurityProtocol=Το πρωτόκολλο ασφάλειας που χρησιμοποιείται από την 
υπηρεσία web είναι άγνωστο.
 errorType.Network=Προέκυψε πρόβλημα δικτύου.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/es-ES/enigmail.properties 
new/enigmail/lang/es-ES/enigmail.properties
--- old/enigmail/lang/es-ES/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/es-ES/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Su clave %1$S caducará en menos de %2$S días.\n\nLe 
recomendamos que cree un nuevo par de claves y configure las cuentas 
correspondientes para que usen la nueva clave.
 expiry.keysExpireSoon=Las siguientes de sus claves caducarán en menos de %1$S 
días:\n%2$S. Le recomendamos que cree nuevas claves y configure sus cuentas 
para que usen las nuevas claves.
+msgCompose.partiallyEncrypted.short=Tenga cuidado de no filtrar información 
sensible - correo parcialmente cifrado.
+msgCompose.partiallyEncrypted.long=El mensaje que está editando fue cifrado 
parcialmente. Es decir, el mensaje contiene partes cifradas y no cifradas. 
Algunas partes cifradas del mensaje puede que incluso no sean visibles para 
usted.\n\nSi el remitente en un principio no pudo descifrar las partes del 
mensaje, es probable que haya recibido el correo acompañado con algún texto no 
cifrado sólo para provocar que revele la información cifrada.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/fi/enigmail.properties 
new/enigmail/lang/fi/enigmail.properties
--- old/enigmail/lang/fi/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/fi/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -319,3 +319,5 @@
 # Strings in enigmailSetupWizard
 passphrase.min8keys=Salasanan tulee olla ainakin 8-kirjainta pitkä.
 setupWizard.reallyCancel=Peruutetaanko Enigmail:n ohjattu asennus?
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/fr/enigmail.properties 
new/enigmail/lang/fr/enigmail.properties
--- old/enigmail/lang/fr/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/fr/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Votre clef %1$S expirera dans moins de %2$S 
jours.\n\nNous vous recommandons de créer une nouvelle paire de clefs et de 
configurer les comptes correspondants pour utiliser la nouvelle clef.
 expiry.keysExpireSoon=Vos clefs suivantes expireront dans moins de %1$S jours 
: %2$S\n\nNous vous recommandons de créer de nouvelles clefs et de configurer 
les comptes correspondants pour utiliser les nouvelles clefs.
+msgCompose.partiallyEncrypted.short=Attention à la fuite d'informations 
sensibles - message chiffré partiellement.
+msgCompose.partiallyEncrypted.long=Le message que vous êtes en train d'éditer 
n'a été que partiellement chiffré. Cela veut dire qu'il contient à la fois des 
parties chiffrées et non chiffrées. Ces dernières pourraient même être rendues 
invisibles pour vous.\n\nSi l'expéditeur n'a pas été en mesure de déchiffrer le 
message original, il y a fort à parier qu'il vous a renvoyé ce message dans le 
seul but de vous faire déchiffrer les parties restantes à votre insu, lui 
révélant des informations potentiellement sensibles.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/gd/enigmail.properties 
new/enigmail/lang/gd/enigmail.properties
--- old/enigmail/lang/gd/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/gd/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Falbhaidh an ùine air an iuchair %1$S agad ro %2$S 
là(ithean).\n\nMholamaid gun cruthaich thu càraid iuchrach ùr ’s gun rèitich 
thu na cunntasan a fhreagras rithe ach an cleachd iad an iuchair ùr.
 expiry.keysExpireSoon=Falbhaidh an ùine air na h-iuchraichean seo agad ro %1$S 
là(ithean):\n%2$S. Mholamaid gun cruthaich thu iuchraichean ùra ’s gun rèitich 
thu na cunntasan agad ach an cleachd iad na h-iuchraichean ùra.
+msgCompose.partiallyEncrypted.short=Thoir an aire nach foillsich thu 
fiosrachadh dìomhair gun fhiosta – chan eil ach pàirt dhen phost-d seo 
crioptaichte.
+msgCompose.partiallyEncrypted.long=Chaidh pàirt dhen theachdaireachd a tha thu 
a’ deasachadh a chrioptachadh. Is ciall dha seo gu bheil an dà chuid susbaint 
chrioptaichte is gun chrioptachadh ’na broinn. Dh’fhaoidte nach fhaic thu pàirt 
dhen t-susbaint chrioptaichte idir.\n\nMura deach leis an t-seòladair fhèin a 
h-uile pàirt dhen teachdaireachd a dhì-chrioptachadh, tha sinn an dùil nach d’ 
fhuair thu am post-d seo le teacsa gun chrioptachadh innte ach ag amas gum 
foillsich thu am fiosrachadh crioptaichte dhaibh-san.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/gl/enigmail.properties 
new/enigmail/lang/gl/enigmail.properties
--- old/enigmail/lang/gl/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/gl/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=A súa chave %1$S caducará en menos de %2$S 
days.\n\nRecomendámoslle crear unha nova parella de chaves e configurar as 
correspondentes contas para usar esta nova chave.
 expiry.keysExpireSoon=As súas chaves seguintes caducarán en menos de %1$S 
días:\n%2$S. Recomendámoslle que cree novas chaves e configure as súas contas 
para usalas.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/hr/enigmail.properties 
new/enigmail/lang/hr/enigmail.properties
--- old/enigmail/lang/hr/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/hr/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Vaš ključ %1$S ističe za manje od %2$S 
dana.\n\nPreporučamo da stvorite novi par ključeva i postavite račune tako da 
ih koriste.
 expiry.keysExpireSoon=Sljedeći Vaši ključevi ističu za manje od %1$S 
dana:\n%2$S. Preporučamo da stvorite nove ključeve i konfigurirate račune tako 
da ih koriste.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/hu/enigmail.properties 
new/enigmail/lang/hu/enigmail.properties
--- old/enigmail/lang/hu/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/hu/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=A következő kulcs lejár %1$S nap múlva:\n%2$S. Készítse 
el az új kulcsot és a postafiókját állítsa át az új kulcs használatára.
 expiry.keysExpireSoon=A következő kulcsok lejárnak %1$S nap múlva:\n%2$S. 
Készítse el az új kulcsokat és a postafiókját állítsa át az új kulcsok 
használatára.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/it/enigmail.properties 
new/enigmail/lang/it/enigmail.properties
--- old/enigmail/lang/it/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/it/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=La chiave %1$S scadrà in meno di %2$S giorni.\n\nTi 
consigliamo di creare una nuova coppia di chiavi e configurare gli account 
corrispondenti per usare la nuova chiave.
 expiry.keysExpireSoon=Le seguenti chiavi scadranno in meno di %1$S 
giorni:\n%2$S. Ti consigliamo di creare delle nuove chiavi e configurare i tuoi 
account per usare le nuove chiavi.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/ja/enigmail.properties 
new/enigmail/lang/ja/enigmail.properties
--- old/enigmail/lang/ja/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/ja/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=あなたの鍵 %1$S は %2$S 
日以内に期限切れとなります\n\n新しい鍵ペアを作成し、アカウント設定を適切に更新することを推奨します
 expiry.keysExpireSoon=以下の鍵は %1$S 
日以内に期限切れとなります:\n%2$S\n\n新しい鍵ペアを作成し、アカウント設定を適切に更新することを推奨します
+msgCompose.partiallyEncrypted.short=機微情報の漏洩に注意してください - 部分的に暗号化されたメッセージです
+msgCompose.partiallyEncrypted.long=あなたが編集しているメッセージは部分的にしか暗号化されていません。つまり、暗号化されていない部分と暗号化されている部分が混在しています。暗号化されている部分には、あなたにも復号できない部分が含まれているかもしれません\n\n送信者が当初のメッセージを復号できなかった場合、あなたが受信したメッセージには暗号化されていない部分が含まれることがあります。そこから、暗号化されている部分の内容を推測できてしまう可能性があります
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/ko/enigmail.dtd new/enigmail/lang/ko/enigmail.dtd
--- old/enigmail/lang/ko/enigmail.dtd   2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/lang/ko/enigmail.dtd   2017-12-09 16:36:07.000000000 +0100
@@ -577,7 +577,7 @@
 <!ENTITY enigmail.setupWiz.pgKeyCreate.descSec2 "여러분의 
<html:b>비밀키(비밀열쇠)</html:b>는<html:b>여러분 자신이</html:b> 암호메일을 복호화할 때나 이메일에 서명할 때 
사용합니다.
 비밀열쇠를 다른 사람에게 보내지 마십시오.
 비밀키를 안전하게 사용하기 위해 다음 대화상자에서 두번 암호문구을 입력해야 합니다.">
-<!ENTITY enigmail.setupWiz.pgKeyCreate.descPass "여러분의 <html:b>암호문구/html:b>은 
여러분의 비밀열쇠를 지키는 패스워드입니다. 여러분의 비밀열쇠를 다른 사람이 무단으로 사용하는 것을 방지 합니다.">
+<!ENTITY enigmail.setupWiz.pgKeyCreate.descPass "여러분의 <html:b>암호문구</html:b>은 
여러분의 비밀열쇠를 지키는 패스워드입니다. 여러분의 비밀열쇠를 다른 사람이 무단으로 사용하는 것을 방지 합니다.">
 <!ENTITY enigmail.setupWiz.pgKeyCreate.passContain "암호문구는 문자와 숫자, 구둣점을 포함하여 
8자로 만들어야 합니다. 하지만  움라우트나 일부 언어에만 있는 독특한 문자를 사용해서는 <html:b>절대로 안</html:b>됩니다. ">
 <!ENTITY enigmail.setupWiz.pgKeyCreate.passRepeat "패스프레이즈를 한번더 입력해서 확인해주십시오">
 <!ENTITY enigmail.setupWiz.pgKeyCreate.passQuality "암호문장의 품질:">
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/ko/enigmail.properties 
new/enigmail/lang/ko/enigmail.properties
--- old/enigmail/lang/ko/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/ko/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon= 사용하는 열쇠 %1$S 의 유효기간이 %2$S 일 이내에 만료됩니다..\n\n열쇠 한쌍을 새로 
생성한 다음 관련 계정에 새 열쇠를 이용하기를 권합니다.
 expiry.keysExpireSoon=%2$S열쇠 유효기간이  %1$S 일 이내에 만료됩니다. \n열쇠 한쌍을 새로 생성한 다음 관련 
계정에 새 열쇠를 이용하기를 권합니다.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/lt/enigmail.properties 
new/enigmail/lang/lt/enigmail.properties
--- old/enigmail/lang/lt/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/lt/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -405,3 +405,5 @@
 #strings in exportSettingsWizard.js
 cannotWriteToFile=Nepavyksta išsaugoti į failą "%S". Prašome pasirinkti kitą 
failą.
 dataExportError=Jūsų duomenų eksportavimo metu įvyko klaida.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/nb-NO/enigmail.properties 
new/enigmail/lang/nb-NO/enigmail.properties
--- old/enigmail/lang/nb-NO/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/nb-NO/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Din nøkkel %1$S utløper om mindre enn %2$S dager. \n 
\nVi anbefaler at du lager et nytt nøkkelpar og konfigurerer de aktuelle 
kontoene til å benytte den nye nøkkelen.
 expiry.keysExpireSoon=De følgende nøklene dine utløper om mindre enn %1$S 
dager:  %2$S. Vi anbefaler at du lager nye nøkler og konfigurerer kontoene dine 
til å bruke de nye nøklene.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/nl/enigmail.properties 
new/enigmail/lang/nl/enigmail.properties
--- old/enigmail/lang/nl/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/nl/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Uw sleutel %1$S zal binnen %2$S dagen vervallen.\n\nHet 
wordt aanbevolen een nieuw sleutelpaar aan te maken en de overeenkomende 
accounts in te stellen om deze nieuwe sleutel te gebruiken.
 expiry.keysExpireSoon=De volgende sleutels zullen binnen %1$S dagen 
vervallen:\n%2$S. Het wordt aanbevolen nieuwe sleutels aan te maken en de 
overeenkomende accounts in te stellen om deze nieuwe sleutels te gebruiken.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/pl/enigmail.properties 
new/enigmail/lang/pl/enigmail.properties
--- old/enigmail/lang/pl/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/pl/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -433,3 +433,5 @@
 filter.decryptMove.label=Odszyfrować stałe (Enigmail)
 filter.decryptCopy.label=Tworzenie kopii szyfrowanego (Enigmail)
 saveLogFile.title=Zapisz plik dziennika
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/pt-BR/enigmail.properties 
new/enigmail/lang/pt-BR/enigmail.properties
--- old/enigmail/lang/pt-BR/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/pt-BR/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -397,3 +397,5 @@
 filter.folderRequired=Você deve selecionar o diretório desejado
 filter.decryptCopy.label=Criar uma Copia decriptada (Enigmail)
 saveLogFile.title=Salvar Arquivo de Log
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/pt-PT/enigmail.properties 
new/enigmail/lang/pt-PT/enigmail.properties
--- old/enigmail/lang/pt-PT/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/pt-PT/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=A sua chave %1$S expira em menos de %2$S 
dias.\n\nRecomenda-se que crie um novo par de chaves e configure as contas 
correspondentes para usarem a nova chave.
 expiry.keysExpireSoon=As suas chaves que se seguem expiram em menos de %1$S 
dias:\n%2$S. Recomenda-se que crie novas chaves e configure as suas contas para 
usarem as novas chaves.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/ru/enigmail.properties 
new/enigmail/lang/ru/enigmail.properties
--- old/enigmail/lang/ru/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/ru/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Срок действия ключа «%1S» истекает менее чем через %2$S 
дней.\n\nРекомендуется создать новую пару ключей и настроить соответствующий 
аккаунт для их использования.
 expiry.keysExpireSoon=Срок действия следующих ключей истекает менее чем через 
%1$S дней:\n%2$S. Рекомендуется создать новые пары ключей и настроить аккаунты 
для их использования.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/sk/enigmail.properties 
new/enigmail/lang/sk/enigmail.properties
--- old/enigmail/lang/sk/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/sk/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -368,3 +368,5 @@
 errorType.SecurityCertificate=Bezpečnostný certifikát webovej služby nie je 
platný.
 errorType.SecurityProtocol=Bezpečnostný protokol používaný webovou službou je 
neznámy.
 errorType.Network=Vyskytol sa problém so sieťovým pripojením.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/sl/enigmail.properties 
new/enigmail/lang/sl/enigmail.properties
--- old/enigmail/lang/sl/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/sl/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Vaš ključ %1$S bo potekle čez %2$S dni.\n\nPriporočamo, 
da ustvarite nov par ključev in ustrezne račune nastavite za njihovo uporabo.
 expiry.keysExpireSoon=Naslednji ključi bodo v manj kot %1$S-ih dneh 
potekli:\n%2$S. Priporočamo, da ustvarite nove in svoje račune nastavite za 
njihovo uporabo.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/sq/enigmail.properties 
new/enigmail/lang/sq/enigmail.properties
--- old/enigmail/lang/sq/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/sq/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Kyçi juaj %1$S do të skadojë në më pak se %2$S 
ditë.\n\nKëshillojmë që të krijoni një dyshe të re kyçesh dhe të formësoni 
llogaritë përkatëse për përdorim të kyçit të ri.
 expiry.keysExpireSoon=Kyçet tuaj vijues do të skadojnë në më pak se %1$S 
ditë:\n%2$S. Këshillojmë që të krijoni kyçe të rinj dhe të formësoni llogaritë 
tuaja për përdorim të kyçeve të rinj.
+msgCompose.partiallyEncrypted.short=Kini mendjen te rrjedhje informacionesh 
konfidenciale - email i fshehtëzuar pjesërisht.
+msgCompose.partiallyEncrypted.long=Mesazhi që po përpunoni qe pjesërisht i 
fshehtëzuar. Domethënë,, mesazhi përmban pjesë të fshehtëzuara dhe pjesë jo të 
fshehtëzuara. Disa pjesë të fshehtëzuara të mesazhit mund të jenë të padukshme 
madje edhe për ju.\n\nNëse dërguesi s’qe në gjendje të shfshehtëzonte pjesë të 
mesazhit fillimisht, ka gjasa që morët vetëm email-n me ca tekst të 
pafshehtëzuar rreth e qark, me qëllim që t’ju lejojë të zbuloni informacionin e 
fshehtëzuar.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/sv-SE/enigmail.properties 
new/enigmail/lang/sv-SE/enigmail.properties
--- old/enigmail/lang/sv-SE/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/sv-SE/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Din nyckel %1$S kommer att upphöra inom mindre än %2$S 
dagar.\n\nVi rekommenderar att du skapar ett nytt nyckelpar och konfigurerar 
motsvarande konton att använda den nya nyckeln.
 expiry.keysExpireSoon=Följande nycklar kommer att upphöra inom mindre än %1$S 
dagar: \n%2$S. Vi rekommenderar att du skapar nya nycklar och konfigurerar dina 
konton för att använda de nya nycklarna.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/tr/enigmail.properties 
new/enigmail/lang/tr/enigmail.properties
--- old/enigmail/lang/tr/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/tr/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -313,3 +313,5 @@
 addUidDlg.nameMinLengthError=İsmin en az 5 karakter olması gerekiyor
 addUidDlg.invalidEmailError=Doğru bir mail adresi belirtmelisiniz
 addUidDlg.commentError=Yorumlarda köşeli ayraç kullanımına izin verilmiyor
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/vi/enigmail.properties 
new/enigmail/lang/vi/enigmail.properties
--- old/enigmail/lang/vi/enigmail.properties    2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/vi/enigmail.properties    2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=Khoá %1$S của bạn sẽ hết hạn trong %2$S ngày.\n\nChúng 
tôi khuyên bạn tạo một cặp khoá mới và cấu hình tài khoản tương ứng để sử dụng 
chúng.
 expiry.keysExpireSoon=Những khoá sau của bạn sẽ hết hạn trong %1$S 
ngày:\n%2$S. Chúng tôi khuyên bạn tạo khoá mới và cấu hình các tài khoản tương 
ứng để sử dụng chúng.
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/zh-CN/enigmail.properties 
new/enigmail/lang/zh-CN/enigmail.properties
--- old/enigmail/lang/zh-CN/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/zh-CN/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -512,3 +512,5 @@
 #strings in expiry.jsm
 expiry.keyExpiresSoon=你的密钥%1$S将在%2$S内过期。\n\n推荐重新生成密钥并使用新密钥配置相应的账户。
 expiry.keysExpireSoon=你的以下密钥将在%1$S天内过期:\n%2$S。推荐重新生成密钥并使用新密钥配置相应的账户。
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/lang/zh-TW/enigmail.properties 
new/enigmail/lang/zh-TW/enigmail.properties
--- old/enigmail/lang/zh-TW/enigmail.properties 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/lang/zh-TW/enigmail.properties 2017-12-09 16:36:07.000000000 
+0100
@@ -423,3 +423,5 @@
 converter.decryptBody.failed=無法解密主旨為「%S」的訊息。\n\n您想要使用不同的密語再試一次,或是跳過該訊息?
 
converter.decryptAtt.failed=無法解密主旨為「%2$S」訊息的附件「%1$S」。\n\n您想要使用不同的密語再試一次,或是跳過該訊息?
 saveLogFile.title=儲存紀錄檔
+# msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information 
- partially encrypted email.
+# msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/Makefile new/enigmail/package/Makefile
--- old/enigmail/package/Makefile       2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/Makefile       2017-12-09 16:36:07.000000000 +0100
@@ -66,9 +66,10 @@
            pipeConsole.jsm \
            prefs.jsm \
            promise.jsm \
+           rng.jsm \
            rules.jsm \
            streams.jsm \
-                                        system.jsm \
+          system.jsm \
            time.jsm \
            timer.jsm \
            trust.jsm \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/armor.jsm new/enigmail/package/armor.jsm
--- old/enigmail/package/armor.jsm      2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/armor.jsm      2017-12-09 16:36:07.000000000 +0100
@@ -103,7 +103,7 @@
     var blockHeader = text.substr(beginIndex, offset - beginIndex + 1);
 
     var blockRegex = new RegExp("^" + indentStr +
-      "-----BEGIN PGP (.*)-----\\s*\\r?\\n");
+      "-----BEGIN PGP (.{1,30})-----\\s*\\r?\\n");
 
     var matches = blockHeader.match(blockRegex);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/decryptPermanently.jsm 
new/enigmail/package/decryptPermanently.jsm
--- old/enigmail/package/decryptPermanently.jsm 2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/package/decryptPermanently.jsm 2017-12-09 16:36:07.000000000 
+0100
@@ -380,7 +380,7 @@
         self.readAttachment(attachment, strippedName).then(
           function(o) {
             var attachmentHead = o.data.substr(0, 30);
-            if (attachmentHead.match(/\-\-\-\-\-BEGIN PGP \w+ KEY 
BLOCK\-\-\-\-\-/)) {
+            if (attachmentHead.match(/\-\-\-\-\-BEGIN PGP \w{5,10} KEY 
BLOCK\-\-\-\-\-/)) {
               // attachment appears to be a PGP key file, we just go-a-head
               resolve(o);
               return;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/decryption.jsm new/enigmail/package/decryption.jsm
--- old/enigmail/package/decryption.jsm 2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/decryption.jsm 2017-12-09 16:36:07.000000000 +0100
@@ -697,7 +697,7 @@
     EnigmailLog.DEBUG("enigmail.js: Enigmail.decryptAttachment: parent=" + 
parent + ", outFileName=" + outFile.path + "\n");
 
     var attachmentHead = byteData.substr(0, 200);
-    if (attachmentHead.match(/\-\-\-\-\-BEGIN PGP \w+ KEY BLOCK\-\-\-\-\-/)) {
+    if (attachmentHead.match(/\-\-\-\-\-BEGIN PGP \w{5,10} KEY 
BLOCK\-\-\-\-\-/)) {
       // attachment appears to be a PGP key file
 
       if (EnigmailDialog.confirmDlg(parent, 
EnigmailLocale.getString("attachmentPgpKey", [displayName]),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/funcs.jsm new/enigmail/package/funcs.jsm
--- old/enigmail/package/funcs.jsm      2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/funcs.jsm      2017-12-09 16:36:07.000000000 +0100
@@ -26,45 +26,55 @@
 
 var gTxtConverter = null;
 
-const EnigmailFuncsRegexTwoAddr = new RegExp("<[^>,]*>[^,<]*<[^>,]*>");
-const EnigmailFuncsRegexExtractPureEmail = new 
RegExp("(^|,)[^,]*<([^>]+)>[^,]*", "g");
-
 const EnigmailFuncs = {
   /**
    * get a list of plain email addresses without name or surrounding <>
-   * @mailAddrs |string| - address-list as specified in RFC 2822, 3.4
-   *                       separated by ","
+   * @param mailAddrs |string| - address-list encdoded in Unicode as specified 
in RFC 2822, 3.4
+   *                             separated by , or ;
    *
-   * @return |string|    - list of pure email addresses separated by ","
+   * @return |string|          - list of pure email addresses separated by ","
    */
-  stripEmail: function(mailAddrs) {
-    //EnigmailLog.DEBUG("funcs.jsm: stripEmail(): mailAddrs=" + mailAddrs + 
"\n");
+  stripEmail: function(mailAddresses) {
+    // EnigmailLog.DEBUG("funcs.jsm: stripEmail(): mailAddresses=" + 
mailAddresses + "\n");
+
+    const SIMPLE = "[^<>,]+"; // RegExp for a simple email address (e.g. [email protected])
+    const COMPLEX = "[^<>,]*<[^<>, ]+>"; // RegExp for an address containing 
<...> (e.g. Name <[email protected]>)
+    const MatchAddr = new RegExp("^(" + SIMPLE + "|" + COMPLEX + ")(," + 
SIMPLE + "|," + COMPLEX + ")*$");
 
-    var qStart, qEnd;
-    while ((qStart = mailAddrs.indexOf('"')) != -1) {
+    let mailAddrs = mailAddresses;
+
+    let qStart, qEnd;
+    while ((qStart = mailAddrs.indexOf('"')) >= 0) {
       qEnd = mailAddrs.indexOf('"', qStart + 1);
-      if (qEnd == -1) {
-        EnigmailLog.ERROR("funcs.jsm: stripEmail: Unmatched quote in mail 
address: " + mailAddrs + "\n");
+      if (qEnd < 0) {
+        EnigmailLog.ERROR("funcs.jsm: stripEmail: Unmatched quote in mail 
address: '" + mailAddresses + "'\n");
         throw Components.results.NS_ERROR_FAILURE;
       }
 
       mailAddrs = mailAddrs.substring(0, qStart) + mailAddrs.substring(qEnd + 
1);
     }
 
-    // Eliminate all whitespace, just to be safe
-    mailAddrs = mailAddrs.replace(/\s+/g, "");
+    // replace any ";" by ","; remove leading/trailing ","
+    mailAddrs = mailAddrs.replace(/[,;]+/g, ",").replace(/^,/, 
"").replace(/,$/, "");
+
+    if (mailAddrs.length === 0) return "";
 
-    // having two <..> <..> in one email is an error
-    if (mailAddrs.match(EnigmailFuncsRegexTwoAddr)) {
-      EnigmailLog.ERROR("funcs.jsm: stripEmail: Two <..> entries in mail 
address: " + mailAddrs + "\n");
+    // having two <..> <..> in one email, or things like <[email protected],><[email protected]> is an 
error
+    if (mailAddrs.search(MatchAddr) < 0) {
+      EnigmailLog.ERROR("funcs.jsm: stripEmail: Invalid <..> brackets in mail 
address: '" + mailAddresses + "'\n");
       throw Components.results.NS_ERROR_FAILURE;
     }
 
-    // Extract pure e-mail address list (stripping out angle brackets)
-    mailAddrs = mailAddrs.replace(EnigmailFuncsRegexExtractPureEmail, "$1$2");
+    // We know that the "," and the < > are at the right places, thus we can 
split by ","
+    let addrList = mailAddrs.split(/,/);
 
-    // remove empty email addresses (including removing all ';')
-    mailAddrs = mailAddrs.replace(/[,;]+/g, ",").replace(/^,/, 
"").replace(/,$/, "");
+    for (let i in addrList) {
+      // Extract pure e-mail address list (strip out anything before angle 
brackets and any whitespace)
+      addrList[i] = addrList[i].replace(/^([^<>]*<)([^<>]+)(>)$/, 
"$2").replace(/\s/g, "");
+    }
+
+    // remove repeated, trailing and leading "," (again, as there may be empty 
addresses)
+    mailAddrs = addrList.join(",").replace(/,,/g, ",").replace(/^,/, 
"").replace(/,$/, "");
 
     return mailAddrs;
   },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/gpgAgent.jsm new/enigmail/package/gpgAgent.jsm
--- old/enigmail/package/gpgAgent.jsm   2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/gpgAgent.jsm   2017-12-09 16:36:07.000000000 +0100
@@ -467,14 +467,33 @@
 
       if ((!agentPath) && EnigmailOS.isWin32) {
         // Look up in Windows Registry
+        const installDir = ["Software\\GNU\\GNUPG", "Software\\GNUPG"];
         try {
-          let gpgPath = 
EnigmailOS.getWinRegistryString("Software\\GNU\\GNUPG", "Install Directory", 
nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE);
-          agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, 
EnigmailOS.isDosLike());
+          for (let i = 0; i < installDir.length && !agentPath; i++) {
+            let gpgPath = EnigmailOS.getWinRegistryString(installDir[i], 
"Install Directory", nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE);
+
+            agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, 
EnigmailOS.isDosLike());
+            if (!agentPath) {
+              gpgPath += "\\bin";
+              agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, 
EnigmailOS.isDosLike());
+            }
+          }
         }
         catch (ex) {}
 
         if (!agentPath) {
-          let gpgPath = "C:\\Program Files\\GnuPG\\pub";
+          // try to determine the default PATH from the registry
+          // (that's how gpg4win sets up the path)
+          try {
+            let winPath = 
EnigmailOS.getWinRegistryString("SYSTEM\\CurrentControlSet\\Control\\Session 
Manager\\Environment", "Path", nsIWindowsRegKey.ROOT_KEY_LOCAL_MACHINE);
+            agentPath = EnigmailFiles.resolvePath(agentName, winPath, 
EnigmailOS.isDosLike());
+          }
+          catch (ex) {}
+        }
+
+        if (!agentPath) {
+          // default for gpg4win 3.0
+          let gpgPath = "C:\\Program Files\\GnuPG\\bin;C:\\Program Files 
(x86)\\GnuPG\\bin";
           agentPath = EnigmailFiles.resolvePath(agentName, gpgPath, 
EnigmailOS.isDosLike());
         }
       }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/install.rdf new/enigmail/package/install.rdf
--- old/enigmail/package/install.rdf    2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/install.rdf    2017-12-09 16:36:07.000000000 +0100
@@ -5,7 +5,7 @@
 
   <Description about="urn:mozilla:install-manifest">
     <em:id>{847b3a00-7ab1-11d4-8f02-006008948af5}</em:id>
-    <em:version>1.9.8.3</em:version>
+    <em:version>1.9.9</em:version>
     <em:type>2</em:type> <!-- type = extension -->
     <em:unpack>true</em:unpack>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/installGnuPG.jsm new/enigmail/package/installGnuPG.jsm
--- old/enigmail/package/installGnuPG.jsm       2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/package/installGnuPG.jsm       2017-12-09 16:36:07.000000000 
+0100
@@ -50,8 +50,7 @@
 const NS_LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1";
 const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1";
 
-const queryUrl = "https://www.enigmail.net/service/getGnupdDownload.svc";;
-
+const queryUrl = "https://www.enigmail.net/service/getGnupgDownload.svc";;
 
 function toHexString(charCode) {
   return ("0" + charCode.toString(16)).slice(-2);
@@ -382,7 +381,7 @@
 
     var ch = Components.classes["@mozilla.org/security/hash;1"]
       .createInstance(Components.interfaces.nsICryptoHash);
-    ch.init(ch.SHA1);
+    ch.init(ch.SHA256);
     const PR_UINT32_MAX = 0xffffffff; // read entire file
     ch.updateFromStream(istream, PR_UINT32_MAX);
     var gotHash = ch.finish(false);
@@ -411,18 +410,32 @@
       // "this" is set by the calling XMLHttpRequest
       if (typeof(this.responseXML) == "object") {
         EnigmailLog.DEBUG("installGnuPG.jsm: getDownloadUrl.reqListener: got: 
" + this.responseText + "\n");
-        if (!this.responseXML) {
+        if (!this.responseText) {
           onError({
             type: "Network"
           });
           return;
         }
-        let doc = this.responseXML.firstChild;
-        self.url = unescape(doc.getAttribute("url"));
-        self.hash = sanitizeHash(doc.getAttribute("hash"));
-        self.command = sanitizeFileName(doc.getAttribute("command"));
-        self.mount = sanitizeFileName(doc.getAttribute("mount"));
-        deferred.resolve();
+
+        if (typeof(this.responseText) == "string") {
+          EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: got: 
" + this.responseText + "\n");
+
+          try {
+            let doc = JSON.parse(this.responseText);
+            self.url = doc.url;
+            self.hash = sanitizeHash(doc.hash);
+            self.command = doc.command;
+            self.mount = sanitizeFileName(doc.mountPath);
+            deferred.resolve();
+          }
+          catch (ex) {
+            EnigmailLog.DEBUG("installPep.jsm: getDownloadUrl.reqListener: 
exception: " + ex.toString() + "\n");
+
+            onError({
+              type: "Network"
+            });
+          }
+        }
       }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/mime.jsm new/enigmail/package/mime.jsm
--- old/enigmail/package/mime.jsm       2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/mime.jsm       2017-12-09 16:36:07.000000000 +0100
@@ -15,6 +15,8 @@
 
 Components.utils.import("resource://gre/modules/jsmime.jsm"); /*global jsmime: 
false*/
 Components.utils.import("resource://enigmail/data.jsm"); /*global 
EnigmailData: false */
+Components.utils.import("resource://enigmail/rng.jsm"); /*global EnigmailRNG: 
false */
+Components.utils.import("resource://enigmail/streams.jsm"); /*global 
EnigmailStreams: false */
 
 const EnigmailMime = {
   /***
@@ -24,13 +26,7 @@
    * @return: string of 33 random characters and digits
    */
   createBoundary: function() {
-    let b = "";
-    let r = 0;
-    for (let i = 0; i < 33; i++) {
-      r = Math.floor(Math.random() * 58);
-      b += String.fromCharCode((r < 10 ? 48 : (r < 34 ? 55 : 63)) + r);
-    }
-    return b;
+    return EnigmailRNG.generateRandomString(33);
   },
 
   /***
@@ -289,5 +285,153 @@
       endPos: endPos,
       securityLevel: 0
     };
-  }
+  },
+
+  /**
+   * Get the part number from a URI spec (e.g. 
mailbox:///folder/xyz?part=1.2.3.5)
+   *
+   * @param spec: String - the URI spec to inspect
+   *
+   * @return String: the mime part number (or "" if none found)
+   */
+  getMimePartNumber: function(spec) {
+    let m = spec.match(/([\?&]part=)(\d+(\.\d+)*)/);
+
+    if (m && m.length >= 3) {
+      return m[2];
+    }
+
+    return "";
+  },
+
+  /**
+   * Parse a MIME message and return a tree structur of TreeObject
+   *
+   * @param url:         String   - the URL to load and parse
+   * @param getBody:     Boolean  - if true, delivers the body text of each 
MIME part
+   * @param callbackFunc Function - the callback function that is called 
asynchronously
+   *                                when parsing is complete.
+   *                                Function signature: 
callBackFunc(TreeObject)
+   *
+   * @return undefined
+   */
+  getMimeTreeFromUrl: function(url, getBody, callbackFunc) {
+    function onData(data) {
+      let tree = getMimeTree(data);
+      callbackFunc(tree);
+    }
+
+    let chan = EnigmailStreams.createChannel(url);
+    let bufferListener = EnigmailStreams.newStringStreamListener(onData);
+    chan.asyncOpen(bufferListener, null);
+  },
+
+  getMimeTree: getMimeTree
 };
+
+
+/**
+ * Parse a MIME message and return a tree structure of TreeObject.
+ *
+ * TreeObject contains the following main parts:
+ *     - partNum: String
+ *     - headers: Map, containing all headers.
+ *         Special headers for contentType and charset
+ *     - body: String, if getBody == true
+ *     - subParts: Array of TreeObject
+ *
+ * @param mimeStr: String  - a MIME structure to parse
+ * @param getBody: Boolean - if true, delivers the body text of each MIME part
+ *
+ * @return TreeObject, or NULL in case of failure
+ */
+function getMimeTree(mimeStr, getBody = false) {
+
+  let mimeTree = {
+      partNum: "",
+      headers: null,
+      body: "",
+      parent: null,
+      subParts: []
+    },
+    stack = [],
+    currentPart = "",
+    currPartNum = "";
+
+  const jsmimeEmitter = {
+
+    createPartObj: function(partNum, headers, parent) {
+      let ct;
+
+      if (headers.has("content-type")) {
+        ct = headers.contentType.type;
+        let it = headers.get("content-type").entries();
+        for (let i of it) {
+          ct += '; ' + i[0] + '="' + i[1] + '"';
+        }
+      }
+
+      return {
+        partNum: partNum,
+        headers: headers,
+        fullContentType: ct,
+        body: "",
+        parent: parent,
+        subParts: []
+      };
+    },
+
+    /** JSMime API **/
+    startMessage: function() {
+      currentPart = mimeTree;
+    },
+
+    endMessage: function() {},
+
+    startPart: function(partNum, headers) {
+      //dump("mime.jsm: jsmimeEmitter.startPart: partNum=" + partNum + "\n");
+      partNum = "1" + (partNum !== "" ? "." : "") + partNum;
+      let newPart = this.createPartObj(partNum, headers, currentPart);
+
+      if (partNum.indexOf(currPartNum) === 0) {
+        // found sub-part
+        currentPart.subParts.push(newPart);
+      }
+      else {
+        // found same or higher level
+        currentPart.subParts.push(newPart);
+      }
+      currPartNum = partNum;
+      currentPart = newPart;
+    },
+    endPart: function(partNum) {
+      //dump("mime.jsm: jsmimeEmitter.startPart: partNum=" + partNum + "\n");
+      currentPart = currentPart.parent;
+    },
+
+    deliverPartData: function(partNum, data) {
+      //dump("mime.jsm: jsmimeEmitter.deliverPartData: partNum=" + partNum + " 
/ " + typeof data + "\n");
+      if (typeof(data) === "string") {
+        currentPart.body += data;
+      }
+      else {
+        currentPart.body += EnigmailData.arrayBufferToString(data);
+      }
+    }
+  };
+
+  let opt = {
+    strformat: "unicode",
+    bodyformat: getBody ? "decode" : "none"
+  };
+
+
+  try {
+    let p = new jsmime.MimeParser(jsmimeEmitter, opt);
+    p.deliverData(mimeStr);
+    return mimeTree.subParts[0];
+  }
+  catch (ex) {
+    return null;
+  }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/mimeEncrypt.js new/enigmail/package/mimeEncrypt.js
--- old/enigmail/package/mimeEncrypt.js 2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/mimeEncrypt.js 2017-12-09 16:36:07.000000000 +0100
@@ -281,7 +281,7 @@
 
     if (this.cryptoMode == MIME_ENCRYPTED && this.enigSecurityInfo.sendFlags & 
Ci.nsIEnigmail.ENCRYPT_HEADERS) {
       w += 'Content-Type: text/rfc822-headers; protected-headers="v1"\r\n' +
-        'Content-Disposition: inline\r\n' +
+        'Content-Disposition: inline\r\n\r\n' +
         visibleHdr +
         "\r\n--" + this.encHeader + "\r\n";
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/prefs/enigmail.js new/enigmail/package/prefs/enigmail.js
--- old/enigmail/package/prefs/enigmail.js      2017-10-01 16:38:39.000000000 
+0200
+++ new/enigmail/package/prefs/enigmail.js      2017-12-09 16:36:07.000000000 
+0100
@@ -96,7 +96,7 @@
 
 
 // list of keyservers to use
-pref("extensions.enigmail.keyserver", "pool.sks-keyservers.net, 
keys.gnupg.net, pgp.mit.edu");
+pref("extensions.enigmail.keyserver", "hkps://hkps.pool.sks-keyservers.net, 
hkps://pgp.mit.edu");
 
 // auto select the first keyserver in the key server list
 pref("extensions.enigmail.autoKeyServerSelection", true);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/rng.jsm new/enigmail/package/rng.jsm
--- old/enigmail/package/rng.jsm        1970-01-01 01:00:00.000000000 +0100
+++ new/enigmail/package/rng.jsm        2017-12-09 16:36:07.000000000 +0100
@@ -0,0 +1,73 @@
+/*global Components: false */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+"use strict";
+
+const EXPORTED_SYMBOLS = ["EnigmailRNG"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+const SECURITY_RANDOM_GENERATOR = "@mozilla.org/security/random-generator;1";
+
+var appShellSvc = 
Cc["@mozilla.org/appshell/appShellService;1"].getService(Ci.nsIAppShellService);
+
+var window = appShellSvc.hiddenDOMWindow;
+var document = window.document;
+
+/**
+ * Create a string of random characters of the set A-Z a-z 0-9 with numChars 
length,
+ * using the browser crypto API that gets cryptographically strong random 
values
+ *
+ * @param numChar: Number - the length of the string to return
+ *
+ * @return String
+ */
+function generateRandomString(numChars) {
+
+  // Map of characters that are allowed to be returned
+  const charMap = new Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", 
"K", "L", "M",
+    "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
+    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
+    "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
+    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9");
+
+  const charMapLength = charMap.length; // 62 for the set A-Z a-z 0-9
+
+  let randNumArray = new Uint16Array(numChars);
+  window.crypto.getRandomValues(randNumArray);
+
+  let randomString = "";
+
+  for (let i = 0; i < numChars; i++) {
+    // compute the modulo to get numbers between 0 and (charMapLength - 1)
+    // Uint16 range 65536 modulo 62 is only 2, this minimal statistical 
imbalance is acceptable
+    let modulo = randNumArray[i] % charMapLength;
+
+    randomString += charMap[modulo];
+  }
+
+  return randomString;
+}
+
+
+/**
+ * Generates a random UInt32 for use in randomising key selection and wait 
times between refreshing keys.
+ *
+ * @return random UInt32
+ */
+function generateRandomUint32() {
+  let randomNumber = new Uint32Array(1);
+  window.crypto.getRandomValues(randomNumber);
+  return randomNumber[0];
+}
+
+const EnigmailRNG = {
+  generateRandomUint32: generateRandomUint32,
+  generateRandomString: generateRandomString
+};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/package/streams.jsm new/enigmail/package/streams.jsm
--- old/enigmail/package/streams.jsm    2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/package/streams.jsm    2017-12-09 16:36:07.000000000 +0100
@@ -17,12 +17,37 @@
 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global XPCOMUtils: false 
*/
 Cu.import("resource://enigmail/log.jsm"); /*global EnigmailLog: false */
 Cu.import("resource://enigmail/timer.jsm"); /*global EnigmailTimer: false */
+Cu.import("resource://gre/modules/Services.jsm"); /* global Services: false */
 
 const NS_STRING_INPUT_STREAM_CONTRACTID = 
"@mozilla.org/io/string-input-stream;1";
 const NS_INPUT_STREAM_CHNL_CONTRACTID = 
"@mozilla.org/network/input-stream-channel;1";
+const IOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
 
 const EnigmailStreams = {
   /**
+   * Create a new channel from a URL.
+   *
+   * @param url: String - URL specification
+   *
+   * @return: channel
+   */
+  createChannel: function(url) {
+    let ioServ = Cc[IOSERVICE_CONTRACTID].getService(Ci.nsIIOService);
+
+    let channel;
+    if ("newChannel2" in ioServ) {
+      // TB >= 48
+      let loadingPrincipal = 
Services.scriptSecurityManager.getSystemPrincipal();
+      channel = ioServ.newChannel2(url, null, null, null, loadingPrincipal, 
null, 0, Ci.nsIContentPolicy.TYPE_DOCUMENT);
+    }
+    else {
+      channel = ioServ.newChannel(url, null, null);
+    }
+
+    return channel;
+  },
+
+  /**
    * create an nsIStreamListener object to read String data from an 
nsIInputStream
    *
    * @onStopCallback: Function - function(data) that is called when the stream 
has stopped
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/ui/content/enigmailMessengerOverlay.js 
new/enigmail/ui/content/enigmailMessengerOverlay.js
--- old/enigmail/ui/content/enigmailMessengerOverlay.js 2017-10-01 
16:38:39.000000000 +0200
+++ new/enigmail/ui/content/enigmailMessengerOverlay.js 2017-12-09 
16:36:07.000000000 +0100
@@ -10,15 +10,6 @@
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
-try {
-  // TB with omnijar
-  Components.utils.import("resource:///modules/gloda/mimemsg.js"); /* global 
MsgHdrToMimeMessage: false */
-}
-catch (ex) {
-  // "old style" TB
-  Components.utils.import("resource://app/modules/gloda/mimemsg.js");
-}
-
 /* global EnigmailData: false, EnigmailApp: false, EnigmailDialog: false, 
EnigmailTimer: false, EnigmailWindows: false, EnigmailTime: false */
 /* global EnigmailLocale: false, EnigmailLog: false, XPCOMUtils: false, 
EnigmailPrefs: false */
 
@@ -54,6 +45,7 @@
 Components.utils.import("resource://enigmail/expiry.jsm"); /*global 
EnigmailExpiry: false */
 Components.utils.import("resource://enigmail/uris.jsm"); /*global 
EnigmailURIs: false */
 Components.utils.import("resource://enigmail/protocolHandler.jsm"); /*global 
EnigmailProtocolHandler: false */
+Components.utils.import("resource://enigmail/mime.jsm"); /*global 
EnigmailMime: false */
 
 if (!Enigmail) var Enigmail = {};
 
@@ -75,7 +67,7 @@
   savedHeaders: null,
   removeListener: false,
   enableExperiments: false,
-  headersList: ["content-type", "content-transfer-encoding",
+  headersList: ["content-transfer-encoding",
     "x-enigmail-version", "x-pgp-encoding-format"
   ],
   buggyExchangeEmailContent: null, // for HACK for MS-EXCHANGE-Server Problem
@@ -506,6 +498,8 @@
   messageDecrypt: function(event, isAuto) {
     EnigmailLog.DEBUG("enigmailMessengerOverlay.js: messageDecrypt: " + event 
+ "\n");
 
+    this.mimeParts = null;
+
     var cbObj = {
       event: event,
       isAuto: isAuto
@@ -527,11 +521,10 @@
     }
 
     try {
-      if (gFolderDisplay.selectedMessageIsNews) throw "dummy"; // workaround 
for broken NNTP support in Gloda
-      MsgHdrToMimeMessage(gFolderDisplay.selectedMessage, cbObj, 
Enigmail.msg.msgDecryptMimeCb, true, {
-        examineEncryptedParts: true,
-        partsOnDemand: false
-      });
+      EnigmailMime.getMimeTreeFromUrl(this.getCurrentMsgUrl().spec, false,
+        function _cb(mimeMsg) {
+          Enigmail.msg.messageDecryptCb(event, isAuto, mimeMsg);
+        });
     }
     catch (ex) {
       EnigmailLog.DEBUG("enigmailMessengerOverlay.js: enigMessageDecrypt: 
cannot use MsgHdrToMimeMessage\n");
@@ -539,63 +532,28 @@
     }
   },
 
-
-  msgDecryptMimeCb: function(msg, mimeMsg) {
-    // MsgHdrToMimeMessage is not on the main thread which may lead to 
problems with
-    // accessing DOM and debugging
-
-    let event = this.event;
-    let isAuto = this.isAuto;
-
-    EnigmailTimer.setTimeout(
-      function _f() {
-        let enigmailSvc = Enigmail.getEnigmailSvc();
-        if (!enigmailSvc) return;
-
-        Enigmail.msg.messageDecryptCb(event, isAuto, mimeMsg);
-      }, 0);
-  },
-
   /***
    * walk through the (sub-) mime tree and determine PGP/MIME encrypted and 
signed message parts
    *
-   * @mimePart: parent object to walk through
-   * @resultObj: object containing two arrays. The resultObj must be 
pre-initialized by the caller
-   *               - encrypted
-   *               - signed
+   * @param mimePart:  parent object to walk through
+   * @param resultObj: object containing two arrays. The resultObj must be 
pre-initialized by the caller
+   *                    - encrypted
+   *                    - signed
    */
   enumerateMimeParts: function(mimePart, resultObj) {
-    EnigmailLog.DEBUG("enumerateMimeParts: partName=\"" + mimePart.partName + 
"\"\n");
-    EnigmailLog.DEBUG("                    " + 
mimePart.headers["content-type"] + "\n");
-    EnigmailLog.DEBUG("                    " + mimePart + "\n");
-    if (mimePart.parts) {
-      EnigmailLog.DEBUG("                    " + mimePart.parts.length + " 
subparts\n");
-    }
-    else {
-      EnigmailLog.DEBUG("                    0 subparts\n");
-    }
+    EnigmailLog.DEBUG("enumerateMimeParts: partNum=\"" + mimePart.partNum + 
"\"\n");
+    EnigmailLog.DEBUG("                    " + mimePart.fullContentType + 
"\n");
+    EnigmailLog.DEBUG("                    " + mimePart.subParts.length + " 
subparts\n");
 
     try {
-      if (typeof(mimePart.contentType) == "string" &&
-        mimePart.contentType == "multipart/fake-container") {
-        // workaround for wrong content type of signed message
-        let signedPart = mimePart.parts[1];
-        if (typeof(signedPart.headers["content-type"][0]) == "string") {
-          if 
(signedPart.headers["content-type"][0].search(/application\/pgp-signature/i) >= 
0) {
-            resultObj.signed.push(signedPart.partName.replace(/\.[0-9]+$/, 
""));
-            EnigmailLog.DEBUG("enumerateMimeParts: found signed subpart " + 
resultObj.signed + "\n");
-          }
-        }
-      }
-
-      var ct = mimePart.headers["content-type"][0];
+      var ct = mimePart.fullContentType;
       if (typeof(ct) == "string") {
         ct = ct.replace(/[\r\n]/g, " ");
         if (ct.search(/multipart\/signed.*application\/pgp-signature/i) >= 0) {
-          resultObj.signed.push(mimePart.partName);
+          resultObj.signed.push(mimePart.partNum);
         }
         else if (ct.search(/application\/pgp-encrypted/i) >= 0)
-          resultObj.encrypted.push(mimePart.partName);
+          resultObj.encrypted.push(mimePart.partNum);
       }
     }
     catch (ex) {
@@ -603,8 +561,8 @@
     }
 
     var i;
-    for (i in mimePart.parts) {
-      this.enumerateMimeParts(mimePart.parts[i], resultObj);
+    for (i in mimePart.subParts) {
+      this.enumerateMimeParts(mimePart.subParts[i], resultObj);
     }
   },
 
@@ -613,11 +571,10 @@
 
     this.buggyExchangeEmailContent = null; // reinit HACK for 
MS-EXCHANGE-Server Problem
 
-    var enigmailSvc;
-    try {
-      var showHeaders = 0;
-      var contentType = "";
+    let enigmailSvc;
+    let contentType = "";
 
+    try {
       if (!mimeMsg) {
         EnigmailLog.DEBUG("enigmailMessengerOverlay.js: messageDecryptCb: 
mimeMsg is null\n");
         try {
@@ -627,28 +584,48 @@
           contentType = "text/plain";
         }
         mimeMsg = {
+          partNum: "1",
           headers: {
-            'content-type': [contentType]
+            has: function() {
+              return false;
+            },
+            contentType: {
+              type: contentType,
+              mediatype: "",
+              subtype: ""
+            }
           },
-          contentType: contentType,
-          partName: "1",
-          parts: []
+          fullContentType: contentType,
+          body: "",
+          parent: null,
+          subParts: []
         };
       }
 
       // Copy selected headers
       Enigmail.msg.savedHeaders = {};
 
+      if (!mimeMsg.fullContentType) {
+        mimeMsg.fullContentType = "text/plain";
+      }
+      this.mimeParts = mimeMsg;
+
+      Enigmail.msg.savedHeaders["content-type"] = mimeMsg.fullContentType;
+
       for (var index = 0; index < Enigmail.msg.headersList.length; index++) {
         var headerName = Enigmail.msg.headersList[index];
         var headerValue = "";
 
-        if (mimeMsg.headers[headerName]) {
-          headerValue = mimeMsg.headers[headerName].toString();
+        if (mimeMsg.headers.has(headerName)) {
+          let h = mimeMsg.headers.get(headerName);
+          if (Array.isArray(h)) {
+            headerValue = h.join("");
+          }
+          else
+            headerValue = h;
         }
-
         Enigmail.msg.savedHeaders[headerName] = headerValue;
-        EnigmailLog.DEBUG("enigmailMessengerOverlay.js: header " + headerName 
+ ": " + headerValue + "\n");
+        EnigmailLog.DEBUG("enigmailMessengerOverlay.js: header " + headerName 
+ ": '" + headerValue + "'\n");
       }
 
       var msgSigned = null;
@@ -658,7 +635,7 @@
         signed: []
       };
 
-      if (mimeMsg.parts) {
+      if (mimeMsg.subParts.length > 0) {
         this.enumerateMimeParts(mimeMsg, resultObj);
         EnigmailLog.DEBUG("enigmailMessengerOverlay.js: embedded objects: " + 
resultObj.encrypted.join(", ") + " / " + resultObj.signed.join(", ") + "\n");
 
@@ -671,15 +648,15 @@
 
         try {
 
-          if (mimeMsg.parts && mimeMsg.parts.length && mimeMsg.parts.length == 
1 &&
-            mimeMsg.headers["x-mailer"][0].indexOf("ZimbraWebClient") >= 0 &&
-            
mimeMsg.parts[0].parts[0].headers["content-type"][0].indexOf("text/plain") >= 0 
&&
-            
mimeMsg.parts[0].headers["content-type"][0].indexOf("multipart/mixed") >= 0 &&
-            mimeMsg.parts[0].parts[0].body.indexOf("Version: OpenPGP.js") >= 0 
&&
-            
mimeMsg.parts[0].parts[1].headers["content-type"][0].indexOf("application/pgp-encrypted")
 >= 0) {
-            this.messageParse(!event, false, 
Enigmail.msg.savedHeaders["content-transfer-encoding"], 
this.getCurrentMsgUriSpec());
+          if (mimeMsg.subParts.length > 1 &&
+            mimeMsg.headers.has("x-mailer") && 
mimeMsg.headers.get("x-mailer")[0].indexOf("ZimbraWebClient") >= 0 &&
+            mimeMsg.subParts[0].fullContentType.indexOf("text/plain") >= 0 &&
+            mimeMsg.fullContentType.indexOf("multipart/mixed") >= 0 &&
+            
mimeMsg.subParts[1].fullContentType.indexOf("application/pgp-encrypted") >= 0) {
+            this.messageParse(event, false, 
Enigmail.msg.savedHeaders["content-transfer-encoding"], 
this.getCurrentMsgUriSpec());
             return;
           }
+
         }
         catch (ex) {}
 
@@ -696,16 +673,15 @@
         // iPGMail produces a similar broken structure, see here:
         //   - 
https://sourceforge.net/p/enigmail/forum/support/thread/afc9c246/#5de7
 
-        if (mimeMsg.parts && mimeMsg.parts.length && mimeMsg.parts.length == 1 
&&
-          mimeMsg.parts[0].parts && mimeMsg.parts[0].parts.length && 
mimeMsg.parts[0].parts.length == 3 &&
-          
mimeMsg.parts[0].headers["content-type"][0].indexOf("multipart/mixed") >= 0 &&
-          
mimeMsg.parts[0].parts[0].headers["content-type"][0].search(/multipart\/encrypted/i)
 < 0 &&
-          
mimeMsg.parts[0].parts[0].headers["content-type"][0].search(/text\/(plain|html)/i)
 >= 0 &&
-          
mimeMsg.parts[0].parts[1].headers["content-type"][0].indexOf("application/pgp-encrypted")
 >= 0) {
-          if 
(mimeMsg.parts[0].parts[1].headers["content-type"][0].search(/multipart\/encrypted/i)
 < 0 &&
-            
mimeMsg.parts[0].parts[1].headers["content-type"][0].search(/PGP\/?MIME 
Versions? Identification/i) >= 0 &&
-            
mimeMsg.parts[0].parts[2].headers["content-type"][0].indexOf("application/octet-stream")
 >= 0 &&
-            
mimeMsg.parts[0].parts[2].headers["content-type"][0].indexOf("encrypted.asc") 
>= 0) {
+        if (mimeMsg.subParts.length == 3 &&
+          mimeMsg.fullContentType.search(/multipart\/mixed/i) >= 0 &&
+          mimeMsg.subParts[0].fullContentType.search(/multipart\/encrypted/i) 
< 0 &&
+          mimeMsg.subParts[0].fullContentType.search(/text\/(plain|html)/i) >= 
0 &&
+          
mimeMsg.subParts[1].fullContentType.search(/application\/pgp-encrypted/i) >= 0) 
{
+          if 
(mimeMsg.subParts[1].fullContentType.search(/multipart\/encrypted/i) < 0 &&
+            mimeMsg.subParts[1].fullContentType.search(/PGP\/?MIME Versions? 
Identification/i) >= 0 &&
+            
mimeMsg.subParts[2].fullContentType.search(/application\/octet-stream/i) >= 0 &&
+            mimeMsg.subParts[2].fullContentType.search(/encrypted.asc/i) >= 0) 
{
             this.buggyMailType = "exchange";
           }
           else {
@@ -1443,8 +1419,8 @@
     if (!hyperlink)
       return text;
 
-    // Hyperlink email addresses
-    var addrs = text.match(/\b[A-Za-z0-9_+\-\.]+@[A-Za-z0-9\-\.]+\b/g);
+    // Hyperlink email addresses (we accept at most 1024 characters before and 
after the @)
+    var addrs = 
text.match(/\b[A-Za-z0-9_+.-]{1,1024}@[A-Za-z0-9.-]{1,1024}\b/g);
 
     var newText, offset, loc;
     if (addrs && addrs.length) {
@@ -1477,8 +1453,8 @@
       text = newText;
     }
 
-    // Hyperlink URLs
-    var urls = text.match(/\b(http|https|ftp):\S+\s/g);
+    // Hyperlink URLs (we don't accept URLS or more than 1024 characters 
length)
+    var urls = text.match(/\b(http|https|ftp):\S{1,1024}\s/g);
 
     if (urls && urls.length) {
       newText = "";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/ui/content/enigmailMsgComposeOverlay.js 
new/enigmail/ui/content/enigmailMsgComposeOverlay.js
--- old/enigmail/ui/content/enigmailMsgComposeOverlay.js        2017-10-01 
16:38:39.000000000 +0200
+++ new/enigmail/ui/content/enigmailMsgComposeOverlay.js        2017-12-09 
16:36:07.000000000 +0100
@@ -13,7 +13,7 @@
 /*global msgHdrToMimeMessage: false, MimeMessage: false, MimeContainer: false, 
UpdateAttachmentBucket: false, gContentChanged: true */
 /*global AddAttachments: false, AddAttachment: false, 
ChangeAttachmentBucketVisibility: false, GetResourceFromUri: false */
 /*global Recipients2CompFields: false, Attachments2CompFields: false, 
DetermineConvertibility: false, gWindowLocked: false */
-/*global CommandUpdate_MsgCompose: false, gSMFields: false */
+/*global CommandUpdate_MsgCompose: false, gSMFields: false, 
Sendlater3Composing: false*/
 
 Components.utils.import("resource://enigmail/glodaMime.jsm");
 Components.utils.import("resource://enigmail/core.jsm"); /*global 
EnigmailCore: false */
@@ -35,6 +35,7 @@
 Components.utils.import("resource://enigmail/constants.jsm"); /*global 
EnigmailConstants: false */
 Components.utils.import("resource://enigmail/passwords.jsm"); /*global 
EnigmailPassword: false */
 Components.utils.import("resource://enigmail/rules.jsm"); /*global 
EnigmailRules: false */
+Components.utils.import("resource://enigmail/mime.jsm"); /*global 
EnigmailMime: false */
 Components.utils.import("resource://enigmail/clipboard.jsm"); /*global 
EnigmailClipboard: false */
 
 try {
@@ -309,26 +310,87 @@
     this.finalSignDependsOnEncrypt = (this.getAccDefault("signIfEnc") || 
this.getAccDefault("signIfNotEnc"));
   },
 
+  /**
+   * Get a mail URL from a uriSpec
+   *
+   * @param uriSpec: String - URI of the desired message
+   *
+   * @return Object: nsIURL or nsIMsgMailNewsUrl object
+   */
+  getUrlFromUriSpec: function(uriSpec) {
+    try {
+      if (!uriSpec)
+        return null;
+
+      let messenger = 
Components.classes["@mozilla.org/messenger;1"].getService(Components.interfaces.nsIMessenger);
+      let msgService = messenger.messageServiceFromURI(uriSpec);
+
+      let urlObj = {};
+      msgService.GetUrlForUri(uriSpec, urlObj, null);
+
+      let url = urlObj.value;
+
+      if (url.scheme == "file") {
+        return url;
+      }
+      else {
+        return url.QueryInterface(Components.interfaces.nsIMsgMailNewsUrl);
+      }
+
+    }
+    catch (ex) {
+      return null;
+    }
+  },
+
+  getOriginalMsgUri: function() {
+    let draftId = gMsgCompose.compFields.draftId;
+    let msgUri = null;
+
+    if (typeof(draftId) == "string" && draftId.length > 0) {
+      // original message is draft
+      msgUri = draftId.replace(/\?.*$/, "");
+    }
+    else if (typeof(gMsgCompose.originalMsgURI) == "string" && 
gMsgCompose.originalMsgURI.length > 0) {
+      // original message is a "true" mail
+      msgUri = gMsgCompose.originalMsgURI;
+    }
+
+    return msgUri;
+  },
+
+  getMsgHdr: function(msgUri) {
+    if (!msgUri) {
+      msgUri = this.getOriginalMsgUri();
+    }
+    let messenger = 
Components.classes["@mozilla.org/messenger;1"].getService(Components.interfaces.nsIMessenger);
+    return messenger.messageServiceFromURI(msgUri).messageURIToMsgHdr(msgUri);
+  },
 
   getMsgProperties: function(msgUri, draft) {
     EnigmailLog.DEBUG("enigmailMessengerOverlay.js: 
Enigmail.msg.getMsgProperties:\n");
     const nsIEnigmail = Components.interfaces.nsIEnigmail;
 
-    var properties = 0;
+    let properties = 0;
+    let self = this;
+
     try {
-      var messenger = 
Components.classes["@mozilla.org/messenger;1"].getService(Components.interfaces.nsIMessenger);
-      var msgHdr = 
messenger.messageServiceFromURI(msgUri).messageURIToMsgHdr(msgUri);
+      let msgHdr = this.getMsgHdr(msgUri);
       if (msgHdr) {
+        let msgUrl = this.getUrlFromUriSpec(msgUri);
         properties = msgHdr.getUint32Property("enigmail");
-        if (draft) {
-          try {
-            msgHdrToMimeMessage(msgHdr, null, this.getMsgPropertiesCb, true, {
-              examineEncryptedParts: true
-            });
-          }
-          catch (ex) {
-            EnigmailLog.DEBUG("enigmailMessengerOverlay.js: 
Enigmail.msg.getMsgProperties: cannot use msgHdrToMimeMessage\n");
-          }
+        try {
+          EnigmailMime.getMimeTreeFromUrl(msgUrl.spec, false, function 
_cb(mimeMsg) {
+            if (draft) {
+              self.setDraftOptions(mimeMsg);
+            }
+            else {
+              self.checkMimeStructure(mimeMsg);
+            }
+          });
+        }
+        catch (ex) {
+          EnigmailLog.DEBUG("enigmailMessengerOverlay.js: 
Enigmail.msg.getMsgProperties: excetion in getMimeTreeFromUrl\n");
         }
       }
     }
@@ -343,8 +405,41 @@
     return properties;
   },
 
-  getMsgPropertiesCb: function(msg, mimeMsg) {
-    EnigmailLog.DEBUG("enigmailMsgComposeOverlay.js: 
Enigmail.msg.getMsgPropertiesCb\n");
+  checkMimeStructure: function(mimeMsg) {
+    EnigmailLog.DEBUG("enigmailMsgComposeOverlay.js: 
Enigmail.msg.checkMimeStructure\n");
+
+    if 
(mimeMsg.fullContentType.search(/^multipart\/encrypted.*protocol="?application\/pgp-encrypted?"/i)
 === 0) return;
+
+    function getEncryptedSubPart(mimeMsg) {
+      if 
(mimeMsg.fullContentType.search(/^multipart\/encrypted.*protocol="?application\/pgp-encrypted?"/i)
 === 0) return true;
+      if (mimeMsg.fullContentType.search(/^message\/rfc822/i) === 0) return 
false;
+
+      for (let i in mimeMsg.subParts) {
+        if (getEncryptedSubPart(mimeMsg.subParts[i])) return true;
+      }
+
+      return false;
+    }
+
+    for (let i in mimeMsg.subParts) {
+      if (getEncryptedSubPart(mimeMsg.subParts[i])) {
+        this.displayPartialEncryptedWarning();
+        return;
+      }
+    }
+  },
+
+  /**
+   * Display a warning message if we are replying to or forwarding
+   * a partially decrypted email
+   */
+  displayPartialEncryptedWarning: function() {
+
+    this.notifyUser(1, 
EnigmailLocale.getString("msgCompose.partiallyEncrypted.short"), 
"notifyPartialDecrypt", 
EnigmailLocale.getString("msgCompose.partiallyEncrypted.long"));
+  },
+
+  setDraftOptions: function(msg, mimeMsg) {
+    EnigmailLog.DEBUG("enigmailMsgComposeOverlay.js: 
Enigmail.msg.setDraftOptions\n");
 
     const nsIEnigmail = Components.interfaces.nsIEnigmail;
 
@@ -356,7 +451,7 @@
       return;
     }
 
-    EnigmailLog.DEBUG("enigmailMsgComposeOverlay.js: 
Enigmail.msg.getMsgPropertiesCb: draftStatus: " + stat + "\n");
+    EnigmailLog.DEBUG("enigmailMsgComposeOverlay.js: 
Enigmail.msg.setDraftOptions: draftStatus: " + stat + "\n");
 
     if (stat.substr(0, 1) == "N") {
       // new style drafts (Enigmail 1.7)
@@ -1078,7 +1173,6 @@
       case 'final-pgpmimeDefault':
       case 'final-pgpmimeYes':
       case 'final-pgpmimeNo':
-        // status bar buttons:
       case 'toggle-final-sign':
       case 'toggle-final-encrypt':
       case 'toggle-final-mime':
@@ -3966,6 +4060,7 @@
   decryptQuote: function(interactive) {
     EnigmailLog.DEBUG("enigmailMsgComposeOverlay.js: 
Enigmail.msg.decryptQuote: " + interactive + "\n");
     const nsIEnigmail = Components.interfaces.nsIEnigmail;
+    const CT = Components.interfaces.nsIMsgCompType;
 
     if (gWindowLocked || this.processed)
       return;
@@ -4165,6 +4260,36 @@
     if (tail)
       this.editorInsertText(tail);
 
+    if (statusFlagsObj.value & nsIEnigmail.DECRYPTION_OKAY) {
+      let hLines = (head.search(/[^\s>]/) < 0 ? 0 : 1);
+
+      if (hLines > 0) {
+        switch (gMsgCompose.type) {
+          case CT.Reply:
+          case CT.ReplyAll:
+          case CT.ReplyToSender:
+          case CT.ReplyToGroup:
+          case CT.ReplyToSenderAndGroup:
+          case CT.ReplyToList:
+            {
+              // if head contains at most 1 line of text, we assume it's the
+              // header above the quote (e.g. XYZ wrote:)
+
+              let h = head.split(/\r?\n/);
+              hLines = -1;
+
+              for (let i = 0; i < h.length; i++) {
+                if (h[i].search(/[^\s>]/) >= 0) hLines++;
+              }
+            }
+        }
+      }
+      if (hLines > 0 || tail.search(/[^\s>]/) >= 0) {
+        this.displayPartialEncryptedWarning();
+      }
+    }
+
+
     if (clipBoard.supportsSelectionClipboard()) {
       // restore the clipboard contents for selected text (X11)
       EnigmailClipboard.setClipboardContent(data, 
clipBoard.kSelectionClipboard);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/ui/content/enigmailMsgHdrViewOverlay.js 
new/enigmail/ui/content/enigmailMsgHdrViewOverlay.js
--- old/enigmail/ui/content/enigmailMsgHdrViewOverlay.js        2017-10-01 
16:38:39.000000000 +0200
+++ new/enigmail/ui/content/enigmailMsgHdrViewOverlay.js        2017-12-09 
16:36:07.000000000 +0100
@@ -30,6 +30,7 @@
 Components.utils.import("resource://enigmail/constants.jsm"); /*global 
EnigmailConstants: false */
 Components.utils.import("resource://enigmail/data.jsm"); /*global 
EnigmailData: false */
 Components.utils.import("resource://enigmail/clipboard.jsm"); /*global 
EnigmailClipboard: false */
+Components.utils.import("resource://enigmail/mime.jsm"); /*global 
EnigmailMime: false */
 
 if (!Enigmail) var Enigmail = {};
 
@@ -648,6 +649,7 @@
         try {
 
           Enigmail.hdrView.statusBarHide();
+          Enigmail.msg.mimeParts = null;
 
           EnigmailVerify.setMsgWindow(msgWindow, 
Enigmail.msg.getCurrentMsgUriSpec());
 
@@ -1077,29 +1079,52 @@
       },
 
       /**
+       * Determine if a given MIME part number is a multipart/related message 
or a child thereof
+       *
+       * @param mimePart:      Object - The MIME Part object to evaluate from 
the MIME tree
+       * @param searchPartNum: String - The part number to determine
+       */
+      isMultipartRelated: function(mimePart, searchPartNum) {
+        if (searchPartNum.indexOf(mimePart.partNum) == 0 && 
mimePart.partNum.length <= searchPartNum.length) {
+          if (mimePart.fullContentType.search(/^multipart\/related/i) === 0) 
return true;
+
+          for (let i in mimePart.subParts) {
+            if (this.isMultipartRelated(mimePart.subParts[i], searchPartNum)) 
return true;
+          }
+        }
+        return false;
+      },
+
+      /**
        * Determine if a given mime part number should be displayed.
        * Returns true if one of these conditions is true:
-       *  - this is the 1st crypto-mime part
-       *  - the mime part is earlier in the mime tree
-       *  - the mime part is the 1st child of an already displayed mime part
+       *  - this is the 1st displayed block of the message
+       *  - the message part displayed corresonds to the decrypted part
+       *
+       * @param mimePartNumber: String - the MIME part number that was 
decrypted/verified
+       * @param uriSpec:        String - the URI spec that is being displayed
        */
-      displaySubPart: function(mimePartNumber) {
+      displaySubPart: function(mimePartNumber, uriSpec) {
         if (!mimePartNumber) return true;
+        let part = EnigmailMime.getMimePartNumber(uriSpec);
+
+        if (part.length === 0) {
+          // only display header if 1st message part
+          if (mimePartNumber.search(/^1(\.1)*$/) < 0) return false;
+        }
+        else {
+          let r = EnigmailFuncs.compareMimePartLevel(mimePartNumber, part);
 
-        let securityInfo = Enigmail.msg.securityInfo;
-        if (mimePartNumber.length > 0 && securityInfo && 
securityInfo.encryptedMimePart && securityInfo.encryptedMimePart.length > 0) {
-          let c = 
EnigmailFuncs.compareMimePartLevel(securityInfo.encryptedMimePart, 
mimePartNumber);
-
-          if (c === -1) {
-            EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: displaySubPart: 
MIME part after already processed part\n");
-            return false;
+          // analyzed mime part is contained in viewed message part
+          if (r === 2) {
+            if (mimePartNumber.substr(part.length).search(/^\.1(\.1)*$/) < 0) 
return false;
           }
-          if (c === -2 && mimePartNumber !== securityInfo.encryptedMimePart + 
".1") {
-            EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: displaySubPart: 
MIME part not 1st child of parent\n");
-            return false;
+          else if (r !== 0) return false;
+
+          if (Enigmail.msg.mimeParts) {
+            if (this.isMultipartRelated(Enigmail.msg.mimeParts, 
mimePartNumber)) return false;
           }
         }
-
         return true;
       },
 
@@ -1112,7 +1137,11 @@
 
         if (this.isCurrentMessage(uri)) {
 
-          if (!this.displaySubPart(mimePartNumber)) return;
+          if (!this.displaySubPart(mimePartNumber, uriSpec)) return;
+          if (this.hasUnauthenticatedParts(mimePartNumber)) {
+            EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: 
updateSecurityStatus: found unauthenticated part\n");
+            statusFlags |= Components.interfaces.nsIEnigmail.PARTIALLY_PGP;
+          }
 
           Enigmail.hdrView.updateHdrIcons(exitCode, statusFlags, keyId, 
userId, sigDetails,
             errorMsg, blockSeparation, encToDetails,
@@ -1128,6 +1157,37 @@
         return;
       },
 
+      /**
+       * Determine if there are message parts that are not signed/encrypted
+       *
+       * @param mimePartNumber String - the MIME part number that was 
authenticated
+       *
+       * @return Boolean: true: there are siblings / false: no siblings
+       */
+      hasUnauthenticatedParts: function(mimePartNumber) {
+        function hasSiblings(mimePart, searchPartNum, parent) {
+          if (mimePart.partNum.indexOf(parent) == 0 && mimePart.partNum !== 
searchPartNum) return true;
+
+          for (let i in mimePart.subParts) {
+            if (hasSiblings(mimePart.subParts[i], searchPartNum, parent)) 
return true;
+          }
+
+          return false;
+        }
+
+        let parent = mimePartNumber.replace(/\.\d+$/, "");
+        if (mimePartNumber.search(/\./) < 0) {
+          parent = "";
+        }
+
+        if (mimePartNumber && Enigmail.msg.mimeParts) {
+          if (hasSiblings(Enigmail.msg.mimeParts, mimePartNumber, parent)) 
return true;
+        }
+
+        return false;
+      },
+
+
       modifyMessageHeaders: function(uri, headerData, mimePartNumber) {
         EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: 
EnigMimeHeaderSink.modifyMessageHeaders:\n");
         EnigmailLog.DEBUG("enigmailMsgHdrViewOverlay.js: headerData= " + 
headerData + ", mimePart=" + mimePartNumber + "\n");
@@ -1139,6 +1199,7 @@
           }
         }
 
+        let uriSpec = (uri ? uri.spec : null);
         let hdr;
         try {
           hdr = JSON.parse(headerData);
@@ -1155,7 +1216,7 @@
         if (typeof(hdr) !== "object") return;
         if (!this.isCurrentMessage(uri) || 
gFolderDisplay.selectedMessages.length !== 1) return;
 
-        if (!this.displaySubPart(mimePartNumber)) return;
+        if (!this.displaySubPart(mimePartNumber, uriSpec)) return;
 
         if ("subject" in hdr) {
           msg.subject = EnigmailData.convertFromUnicode(hdr.subject, "utf-8");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/ui/locale/en-US/enigmail.properties 
new/enigmail/ui/locale/en-US/enigmail.properties
--- old/enigmail/ui/locale/en-US/enigmail.properties    2017-10-01 
16:38:39.000000000 +0200
+++ new/enigmail/ui/locale/en-US/enigmail.properties    2017-12-09 
16:36:07.000000000 +0100
@@ -143,6 +143,8 @@
 errorKeyUnusable=The email address or key ID '%S' cannot be matched to a 
valid, not expired OpenPGP key.\nPlease ensure that you have a valid OpenPGP 
key, and that your account settings point to that key.
 errorOwnKeyUnusable=The key ID '%S' configured for the current identity does 
not yield a usable OpenPGP key.\n\nPlease ensure that you have a valid, not 
expired OpenPGP key and that your account settings point to that key.\nIf your 
key is not expired, then check if you did set Owner trust to full or ultimate.
 msgCompose.cannotSaveDraft=Error while saving draft
+msgCompose.partiallyEncrypted.short=Beware of leaking sensitive information - 
partially encrypted email.
+msgCompose.partiallyEncrypted.long=The message you are editing was partially 
encrypted. That is, the message contains unencrypted and encrypted parts. Some 
encrypted message parts may even be invisible to you.\n\nIf the sender was not 
able to decrpyt the message parts originally, it is likely that you only got 
the email with some surrounding unencrypted text in order to make you reveal 
the encrypted information.
 
 msgCompose.internalEncryptionError=Internal Error: promised encryption disabled
 msgCompose.internalError=An internal error has occurred.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude 
config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 
--exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh 
old/enigmail/util/genxpi new/enigmail/util/genxpi
--- old/enigmail/util/genxpi    2017-10-01 16:38:39.000000000 +0200
+++ new/enigmail/util/genxpi    2017-12-09 16:36:07.000000000 +0100
@@ -114,6 +114,7 @@
     modules/pipeConsole.jsm \
     modules/prefs.jsm \
     modules/promise.jsm \
+    modules/rng.jsm \
     modules/rules.jsm \
     modules/streams.jsm \
     modules/subprocess.jsm \



Reply via email to