Hello community,

here is the log from the commit of package enigmail for openSUSE:Factory 
checked in at 2020-01-04 19:21:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/enigmail (Old)
 and      /work/SRC/openSUSE:Factory/.enigmail.new.6675 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "enigmail"

Sat Jan  4 19:21:12 2020 rev:38 rq:760727 version:2.1.5

Changes:
--------
--- /work/SRC/openSUSE:Factory/enigmail/enigmail.changes        2019-12-16 
15:19:29.699160992 +0100
+++ /work/SRC/openSUSE:Factory/.enigmail.new.6675/enigmail.changes      
2020-01-04 19:21:16.253135367 +0100
@@ -1,0 +2,8 @@
+Fri Jan  3 11:46:40 UTC 2020 - Andreas Stieger <[email protected]>
+
+- enigmail 2.1.5:
+  * Security issue: unsigned MIME parts displayed as signed boo#1159973
+  * Ensure that upgrading GnuPG 2.0.x to 2.2.x upgrade converts keyring format
+  * Make Enigmail Compatible with Protected-Headers spec, draft 2
+
+-------------------------------------------------------------------

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

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

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

Other differences:
------------------
++++++ enigmail.spec ++++++
--- /var/tmp/diff_new_pack.pqyPoi/_old  2020-01-04 19:21:16.741135583 +0100
+++ /var/tmp/diff_new_pack.pqyPoi/_new  2020-01-04 19:21:16.745135584 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package enigmail
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany.
 # Copyright (c) 2014 Wolfgang Rosenauer <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
@@ -18,7 +18,7 @@
 
 
 Name:           enigmail
-Version:        2.1.4
+Version:        2.1.5
 Release:        0
 Summary:        OpenPGP addon for Mozilla Thunderbird
 License:        MPL-2.0
@@ -44,7 +44,7 @@
 
 %build
 %configure
-make %{?_smp_mflags}
+make # %{?_smp_mflags}
 
 %install
 # Thunderbird location

++++++ enigmail-2.1.4.tar.gz -> enigmail-2.1.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/build.sh new/enigmail/build.sh
--- old/enigmail/build.sh       2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/build.sh       1970-01-01 01:00:00.000000000 +0100
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-#
-# 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 https://mozilla.org/MPL/2.0/.
-#
-
-export TB_PATH=${TB_PATH:-`which thunderbird`}
-make clean
-make distclean
-./configure --with-tb-path=$TB_PATH
-make
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/configure new/enigmail/configure
--- old/enigmail/configure      2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/configure      2019-12-31 16:19:51.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for enigmail 2.1.4.
+# Generated by GNU Autoconf 2.69 for enigmail 2.1.5.
 #
 # Report bugs to <https://www.enigmail.net>.
 #
@@ -579,8 +579,8 @@
 # Identity of this package.
 PACKAGE_NAME='enigmail'
 PACKAGE_TARNAME='enigmail'
-PACKAGE_VERSION='2.1.4'
-PACKAGE_STRING='enigmail 2.1.4'
+PACKAGE_VERSION='2.1.5'
+PACKAGE_STRING='enigmail 2.1.5'
 PACKAGE_BUGREPORT='https://www.enigmail.net'
 PACKAGE_URL=''
 
@@ -1208,7 +1208,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures enigmail 2.1.4 to adapt to many kinds of systems.
+\`configure' configures enigmail 2.1.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1275,7 +1275,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of enigmail 2.1.4:";;
+     short | recursive ) echo "Configuration of enigmail 2.1.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1358,7 +1358,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-enigmail configure 2.1.4
+enigmail configure 2.1.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1375,7 +1375,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by enigmail $as_me 2.1.4, which was
+It was created by enigmail $as_me 2.1.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2615,7 +2615,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by enigmail $as_me 2.1.4, which was
+This file was extended by enigmail $as_me 2.1.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -2668,7 +2668,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-enigmail config.status 2.1.4
+enigmail config.status 2.1.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/configure.ac new/enigmail/configure.ac
--- old/enigmail/configure.ac   2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/configure.ac   2019-12-31 16:19:51.000000000 +0100
@@ -2,7 +2,7 @@
 AC_PREREQ(2.61)
 min_automake_version="1.10"
 
-AC_INIT([enigmail],[2.1.4], [https://www.enigmail.net])
+AC_INIT([enigmail],[2.1.5], [https://www.enigmail.net])
 
 
 AC_PATH_PROG(PYTHON, "python3")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/ca/enigmail.properties 
new/enigmail/lang/ca/enigmail.properties
--- old/enigmail/lang/ca/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/ca/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,4 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Baixant GnuPG
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/cs/enigmail.properties 
new/enigmail/lang/cs/enigmail.properties
--- old/enigmail/lang/cs/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/cs/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,7 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Stahování GnuPG
+updateGnuPG.startingInstaller=Spuštění instalačního programu. Prosím, 
postupujte podle kroků průvodce instalací GnuPG.
+updateGnuPG.downloadingGnuPG=Stahování GnuPG
+updateGnuPG.startingInstaller=Spuštění instalačního programu. Prosím, 
postupujte podle kroků průvodce instalací GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/de/enigmail.properties 
new/enigmail/lang/de/enigmail.properties
--- old/enigmail/lang/de/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/de/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=Die von Ihnen angegebene Datei ist keine reguläre 
Datei.
 importSettings.cancelWhileInProgress=Die Wiederherstellung läuft noch. Wollen 
Sie den Prozess wirklich abbrechen?
 importSettings.button.abortImport=&Prozess abbrechen
+updateGnuPG.importingKeys=Die Schlüssel werden in GnuPG importiert. Es kann 
sein, dass sie dabei (auch mehrfach) nach der Passphrase für Ihre Schlüssel 
gefragt werden.
+updateGnuPG.downloadingGnuPG=GnuPG wird heruntergeladen
+updateGnuPG.startingInstaller=Die GnuPG-Installation wird gestartet. Bitte 
folgen Sie dem GnuPG-Installations-Assistenten.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/el/enigmail.properties 
new/enigmail/lang/el/enigmail.properties
--- old/enigmail/lang/el/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/el/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Λήψη GnuPG
+updateGnuPG.startingInstaller=Ο εγκαταστάτης αρχίζει. Παρακαλώ ακολουθήστε τα 
βήματά του.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/es-ES/enigmail.properties 
new/enigmail/lang/es-ES/enigmail.properties
--- old/enigmail/lang/es-ES/enigmail.properties 2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/es-ES/enigmail.properties 2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=¡El fichero que ha especificado no es un fichero 
común!
 importSettings.cancelWhileInProgress=Restauración en marcha. ¿En verdad desea 
abortar el proceso?
 importSettings.button.abortImport=&Abortar proceso
+updateGnuPG.importingKeys=Importando claves en GnuPG. Puede que se le pidan 
las frases-contraseña de sus claves.
+updateGnuPG.downloadingGnuPG=Descargando GnuPG
+updateGnuPG.startingInstaller=Iniciando el instalador. Siga los pasos del 
asistente de instalación de GnuPG
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/fa/enigmail.properties 
new/enigmail/lang/fa/enigmail.properties
--- old/enigmail/lang/fa/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/fa/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=فایلی که شما مشخص کرده اید یک فایل عادی نمی باشد!
 importSettings.cancelWhileInProgress=بازیابی در حال انجام است. آیا واقعا می 
خواهید این رویه را لغو کنید؟
 importSettings.button.abortImport=&لغو رویه
+updateGnuPG.importingKeys=در حال وارد کردن کلید ها در GnuPG. ممکن است لازم 
باشد عبارت(های) عبور کلید (های) خود را وارد کنید.
+updateGnuPG.downloadingGnuPG=دانلود GnuPG
+updateGnuPG.startingInstaller=در حال شروع نصب کننده. لطفا قدم های ویزارد نصب 
کننده GnuPG را دنبال کنید.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/fr/enigmail.properties 
new/enigmail/lang/fr/enigmail.properties
--- old/enigmail/lang/fr/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/fr/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=Le fichier que vous avez indiqué n’est pas un 
fichier standard !
 importSettings.cancelWhileInProgress=La restauration est en cours. Voulez-vous 
vraiment abandonner le processus ?
 importSettings.button.abortImport=&Abandonner le processus
+updateGnuPG.importingKeys=Importation des clés dans GnuPG. Les phrases de 
passe de vos clés vous seront peut-être demandées.
+updateGnuPG.downloadingGnuPG=Téléchargement de GnuPG…
+updateGnuPG.startingInstaller=Démarrage du programme d’installation. Veuillez 
suivre les étapes de l’assistant d’installation GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/gd/enigmail.properties 
new/enigmail/lang/gd/enigmail.properties
--- old/enigmail/lang/gd/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/gd/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=Chan eil am faidhle a shònraich thu ’na fhaidhle 
àbhaisteach!
 importSettings.cancelWhileInProgress=Tha aiseag a’ dol air adhart. A bheil thu 
cinnteach gu bheil thu airson sgur dheth?
 importSettings.button.abortImport=&Sguir dhen phròiseas
+updateGnuPG.importingKeys=Ion-phortaich iuchraichean ann an GnuPG. Dh’fhaoidte 
gun dèid an abairt-fhaire airson iuchair no dhà iarraidh ort.
+updateGnuPG.downloadingGnuPG=A’ luchdadh a-nuas GnuPG…
+updateGnuPG.startingInstaller=A’ tòiseachadh an stàlaicheir. Lean air adhart 
leis na ceuman aig draoidh an stàlaicheir GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/gl/enigmail.properties 
new/enigmail/lang/gl/enigmail.properties
--- old/enigmail/lang/gl/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/gl/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Descargando GnuPG
+updateGnuPG.startingInstaller=Iniciando o instalador. Siga os pasos do 
asistente de instalación de GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/hr/enigmail.properties 
new/enigmail/lang/hr/enigmail.properties
--- old/enigmail/lang/hr/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/hr/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Preuzmi GnuPG
+updateGnuPG.startingInstaller=Pokrećem instaler. Molim Vas da pratite korake 
GnuPG instalacijskog čarobnjaka.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/hu/enigmail.properties 
new/enigmail/lang/hu/enigmail.properties
--- old/enigmail/lang/hu/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/hu/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 importSettings.errorNoFile=A megadott fájl nem egy hagyományos fájl.
 importSettings.cancelWhileInProgress=A visszaállítás folyamatban. Valóban 
megkívánja szakítani a folyamatot?
 importSettings.button.abortImport=Művelet megszakítás&a
+updateGnuPG.downloadingGnuPG=GnuPG letöltése…
+updateGnuPG.startingInstaller=Telepítő indítása. Telepítse a GnuPG programot a 
telepítővarázsló segítségével.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/it/enigmail.properties 
new/enigmail/lang/it/enigmail.properties
--- old/enigmail/lang/it/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/it/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 importSettings.errorNoFile=Il file specificato non è un file normale!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 importSettings.button.abortImport=&Interrompi processo
+updateGnuPG.downloadingGnuPG=Scaricamento di GnuPG in corso
+updateGnuPG.startingInstaller=Avvio dell'installazione. Segui i passi della 
procedura guidata di installazione di GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/ja/enigmail.properties 
new/enigmail/lang/ja/enigmail.properties
--- old/enigmail/lang/ja/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/ja/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=ファイルの形式が正常ではありません!
 importSettings.cancelWhileInProgress=復元中です。プロセスを中断しますか?
 importSettings.button.abortImport=プロセスを中断(&A)
+updateGnuPG.importingKeys=鍵を GnuPG にインポートしています。しばらくお待ちください. 
データをエクスポート中です。途中であなたの秘密鍵のパスフレーズを尋ねられるかもしれません。
+updateGnuPG.downloadingGnuPG=GnuPG をダウンロード
+updateGnuPG.startingInstaller=GnuPG のインストールを開始します。ウィザードに従ってください。
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/ko/enigmail.properties 
new/enigmail/lang/ko/enigmail.properties
--- old/enigmail/lang/ko/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/ko/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=GnuPG 다운로드중
+updateGnuPG.startingInstaller=설치관리자 개시. GnuPG설치 마법사를 따라 차례로 진행하세요.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/lt/enigmail.properties 
new/enigmail/lang/lt/enigmail.properties
--- old/enigmail/lang/lt/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/lt/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,9 @@
 importSettings.errorNoFile=Jūsų nurodytas failas nėra įprastas failas!
 importSettings.cancelWhileInProgress=Vyksta atkūrimas. Ar tikrai norite 
nutraukti procesą?
 importSettings.button.abortImport=&Nutraukti procesą
+updateGnuPG.importingKeys=Importuojami raktai į GnuPG. Jūsų gali būti 
paklausta jūsų rakto(-ų) slaptafrazės(-ių).
+updateGnuPG.importingKeys=Importuojami raktai į GnuPG. Jūsų gali būti 
paklausta jūsų rakto(-ų) slaptafrazės(-ių).
+updateGnuPG.downloadingGnuPG=Atsiunčiama GnuPG
+updateGnuPG.startingInstaller=Paleidžiama diegimo programa. Sekite GnuPG 
diegimo vediklio žingsnius.
+updateGnuPG.downloadingGnuPG=Atsiunčiama GnuPG
+updateGnuPG.startingInstaller=Paleidžiama diegimo programa. Sekite GnuPG 
diegimo vediklio žingsnius.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/nb/enigmail.properties 
new/enigmail/lang/nb/enigmail.properties
--- old/enigmail/lang/nb/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/nb/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Laster ned GnuPG
+updateGnuPG.startingInstaller=Starter installasjonen. Følg trinnene i 
GnuPG-installasjonsveilederen.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/nl/enigmail.properties 
new/enigmail/lang/nl/enigmail.properties
--- old/enigmail/lang/nl/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/nl/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=Het bestand dat u op heeft gegeven is geen normaal 
bestand!
 importSettings.cancelWhileInProgress=Bezig met herstellen. Wilt u het proces 
echt afbreken?
 importSettings.button.abortImport=Proces &afbreken
+updateGnuPG.importingKeys=Sleutels worden geïmporteerd in GnuPG. Mogelijk 
wordt om de wachtwoordzin(nen) van uw sleutel(s) gevraagd.
+updateGnuPG.downloadingGnuPG=GnuPG downloaden…
+updateGnuPG.startingInstaller=Het installatieprogramma wordt gestart. Volg de 
stappen van de GnuPG-installatiewizard.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/pl/enigmail.properties 
new/enigmail/lang/pl/enigmail.properties
--- old/enigmail/lang/pl/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/pl/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.importingKeys=Importowanie kluczy w GnuPG. Program może poprosić o 
hasła do twoich kluczy.
+updateGnuPG.downloadingGnuPG=Pobieranie GnuPG…
+updateGnuPG.startingInstaller=Uruchamianie instalatora. Wykonuj czynności 
sugerowane przez asystenta instalacji GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/pt-BR/enigmail.properties 
new/enigmail/lang/pt-BR/enigmail.properties
--- old/enigmail/lang/pt-BR/enigmail.properties 2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/pt-BR/enigmail.properties 2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Baixando o GNUPG ()
+updateGnuPG.startingInstaller=Iniciando a instalação. Siga os passos do 
assistente de instalação do GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/pt-PT/enigmail.properties 
new/enigmail/lang/pt-PT/enigmail.properties
--- old/enigmail/lang/pt-PT/enigmail.properties 2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/pt-PT/enigmail.properties 2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Transferindo o GnuPG
+updateGnuPG.startingInstaller=Iniciando o instalador. Por favor siga os passos 
do assistente para instalar o GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/ru/enigmail.properties 
new/enigmail/lang/ru/enigmail.properties
--- old/enigmail/lang/ru/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/ru/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Загрузка GnuPG
+updateGnuPG.startingInstaller=Запуск мастера. Следуйте инструкциям мастера 
установки GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/sk/enigmail.properties 
new/enigmail/lang/sk/enigmail.properties
--- old/enigmail/lang/sk/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/sk/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Sťahujem GnuPG
+updateGnuPG.startingInstaller=Spúštam inštaláciu. Prosím pokračujte krokmi 
GnuPG inštalačného pomocníka.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/sl/enigmail.properties 
new/enigmail/lang/sl/enigmail.properties
--- old/enigmail/lang/sl/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/sl/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=Prenašanje GnuPG …
+updateGnuPG.startingInstaller=Začenjanje namestilnika. Sledite korakom v 
čarovniku namestilnika GnuPG.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/sq/enigmail.properties 
new/enigmail/lang/sq/enigmail.properties
--- old/enigmail/lang/sq/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/sq/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=Kartela që treguat s’është kartelë e rregullt!
 importSettings.cancelWhileInProgress=Rimarrja është në punë e sipër. Doni 
vërtet të ndërpritet procesi?
 importSettings.button.abortImport=&Ndërprite procesin
+updateGnuPG.importingKeys=Po importohen kyça në GnuPG. Mund t'ju kërkohet 
frazëkalimi(et) për kyçin(et) tuaj.
+updateGnuPG.downloadingGnuPG=Po shkarkohet GnuPG-ja
+updateGnuPG.startingInstaller=Po niset instaluesi. Ju lutemi, ndiqni hapat e 
ndihmësit të instalimit të GnuPG-së.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/sv/enigmail.properties 
new/enigmail/lang/sv/enigmail.properties
--- old/enigmail/lang/sv/enigmail.properties    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/sv/enigmail.properties    2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=Filen du angav är inte en vanlig fil!
 importSettings.cancelWhileInProgress=Återställningen pågår. Vill du verkligen 
avbryta processen?
 importSettings.button.abortImport=&Avbryt process
+updateGnuPG.importingKeys=Importerar nycklar i GnuPG. Du kan bli tillfrågad om 
lösenfrasen för din nyckel.
+updateGnuPG.downloadingGnuPG=Hämta GnuPG
+updateGnuPG.startingInstaller=Startar installationsprogrammet. Följ stegen i 
GnuPG:s installationsguide.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/zh-CN/enigmail.properties 
new/enigmail/lang/zh-CN/enigmail.properties
--- old/enigmail/lang/zh-CN/enigmail.properties 2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/zh-CN/enigmail.properties 2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,5 @@
 # importSettings.errorNoFile=The file you specified is not a regular file!
 # importSettings.cancelWhileInProgress=Restoring is in progress. Do you really 
want to abort the process?
 # importSettings.button.abortImport=&Abort process
+updateGnuPG.downloadingGnuPG=正在下载 GnuPG…
+updateGnuPG.startingInstaller=正在启动安装程序。请遵循 GnuPG 安装程序的向导指示。
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/lang/zh-TW/enigmail.properties 
new/enigmail/lang/zh-TW/enigmail.properties
--- old/enigmail/lang/zh-TW/enigmail.properties 2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/lang/zh-TW/enigmail.properties 2019-12-31 16:19:51.000000000 
+0100
@@ -855,3 +855,6 @@
 importSettings.errorNoFile=你指定檔案不是正規檔案!
 importSettings.cancelWhileInProgress=正在回復中,確定要放棄回復嗎?
 importSettings.button.abortImport=&放棄回復
+updateGnuPG.importingKeys=正在匯入GnuPC的密鑰,這可能需要一點時間. 保存進度中。您可能會被要求提供您的密鑰的密碼短語。
+updateGnuPG.downloadingGnuPG=正在下載 GnuPG…
+updateGnuPG.startingInstaller=正在啟動安裝程式,請依照 GnuPG 安裝精靈的步驟執行。
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/autoSetup.jsm 
new/enigmail/package/autoSetup.jsm
--- old/enigmail/package/autoSetup.jsm  2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/autoSetup.jsm  2019-12-31 16:19:51.000000000 +0100
@@ -72,6 +72,23 @@
     return new Promise(async (resolve, reject) => {
       EnigmailLog.DEBUG("autoSetup.jsm: determinePreviousInstallType()\n");
 
+      let resolved = false;
+      const currDateInSeconds = getCurrentTime();
+
+      function doResolve(value) {
+        if (resolved) return;
+        resolved = true;
+        resolve(value);
+      }
+
+      // if after task runs for more than 3 minutes, then return whatever has 
been found (or not found) so far
+      EnigmailTimer.setTimeout(function _f() {
+        if (!resolved) {
+          EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: 
timeout after 3 minutes\n`);
+        }
+        doResolve(gDeterminedSetupType);
+      }, 3 * 60 * 1000); // 3 minutes
+
       try {
         let msgAccountManager = 
Cc["@mozilla.org/messenger/account-manager;1"].getService(nsIMsgAccountManager);
         let folderService = 
Cc["@mozilla.org/mail/folder-lookup;1"].getService(nsIFolderLookupService);
@@ -87,7 +104,7 @@
         // If no account, except Local Folders is configured
         if (accounts.length <= 1) {
           gDeterminedSetupType.value = EnigmailConstants.AUTOSETUP_NO_ACCOUNT;
-          resolve(gDeterminedSetupType);
+          doResolve(gDeterminedSetupType);
           return;
         }
 
@@ -145,12 +162,12 @@
               let mms = 
messenger.messageServiceFromURI(msgURI).QueryInterface(nsIMsgMessageService);
 
               let headerObj = await getStreamedHeaders(msgURI, mms);
-              let checkHeaderValues = await checkHeaders(headerObj, msgHeader, 
msgAuthor, account.defaultIdentity.email, msgFolder, returnMsgValue, 
msgHeaders);
+              if (headerObj) {
+                let checkHeaderValues = await checkHeaders(headerObj, 
msgHeader, msgAuthor, account.defaultIdentity.email, msgFolder, returnMsgValue, 
msgHeaders);
 
-              msgHeaders = checkHeaderValues.msgHeaders;
-              returnMsgValue = checkHeaderValues.returnMsgValue;
-
-              const currDateInSeconds = getCurrentTime();
+                msgHeaders = checkHeaderValues.msgHeaders;
+                returnMsgValue = checkHeaderValues.returnMsgValue;
+              }
               const diffSecond = currDateInSeconds - msgHeader.dateInSeconds;
 
               /**
@@ -168,7 +185,7 @@
         if (returnMsgValue.acSetupMessage) {
           EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: 
found AC-Setup message\n`);
           gDeterminedSetupType = returnMsgValue;
-          resolve(gDeterminedSetupType);
+          doResolve(gDeterminedSetupType);
         }
         else {
           EnigmailLog.DEBUG(`msgHeaders.length: ${msgHeaders.length}\n`);
@@ -212,7 +229,7 @@
 
           gDeterminedSetupType = returnMsgValue;
           EnigmailLog.DEBUG(`autoSetup.jsm: determinePreviousInstallType: 
found type: ${returnMsgValue.value}\n`);
-          resolve(returnMsgValue);
+          doResolve(returnMsgValue);
         }
       }
       catch (x) {
@@ -614,6 +631,16 @@
   return new Promise((resolve, reject) => {
     let headers = 
Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders);
     let headerObj = {};
+    let done = false;
+
+    EnigmailTimer.setTimeout(function _f() {
+      // Stream did not do anyting after 5 seconds, skip message
+      if (!done) {
+        EnigmailLog.DEBUG(`autoSetup.jsm: getStreamedHeaders: no response 
after 5 seconds\n`);
+        resolve(null);
+      }
+    }, 5000); // return after 5 seconds of inactivity
+
     try {
       mms.streamHeaders(msgURI, 
EnigmailStreams.newStringStreamListener(aRawString => {
         try {
@@ -645,9 +672,11 @@
           }
         }
         catch (e) {
+          done = true;
           reject({});
           EnigmailLog.DEBUG("autoSetup.jsm: getStreamedHeaders: Error: " + e + 
"\n");
         }
+        done = true;
         resolve(headerObj);
       }), null, false);
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/constants.jsm 
new/enigmail/package/constants.jsm
--- old/enigmail/package/constants.jsm  2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/constants.jsm  2019-12-31 16:19:51.000000000 +0100
@@ -162,5 +162,8 @@
   ADDON_INSTALL: 5, // The add-on is being installed.
   ADDON_UNINSTALL: 6, // The add-on is being uninstalled.
   ADDON_UPGRADE: 7, // The add-on is being upgraded.
-  ADDON_DOWNGRADE: 8 // The add-on is being downgraded.
+  ADDON_DOWNGRADE: 8, // The add-on is being downgraded.
+
+  /* Protected subject replacement as specified in Protected Headers Spec, 
draft 02*/
+  PROTECTED_SUBJECT: "..."
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/core.jsm 
new/enigmail/package/core.jsm
--- old/enigmail/package/core.jsm       2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/core.jsm       2019-12-31 16:19:51.000000000 +0100
@@ -47,6 +47,7 @@
 
 // Interfaces
 const nsIEnvironment = Ci.nsIEnvironment;
+const APP_STARTUP = 1;
 
 var gPreferredGpgPath = null;
 var gOverwriteEnvVar = [];
@@ -68,6 +69,7 @@
 
   startup: function(reason) {
     let self = this;
+    let observerFired = 0;
 
     let env = getEnvironment();
     initializeLogDirectory();
@@ -82,6 +84,21 @@
 
     this.factories = [];
 
+    function initService() {
+      if (observerFired > 0) return;
+
+      ++observerFired;
+      const configuredVersion = 
getEnigmailPrefs().getPref("configuredVersion");
+
+      if (configuredVersion && configuredVersion.length > 0) {
+        self.createInstance();
+        if (!gEnigmailService.initialized) {
+          // try to initialize Enigmail
+          gEnigmailService.initialize(null, getEnigmailApp().getVersion());
+        }
+      }
+    }
+
     function continueStartup(type) {
       logger.DEBUG(`core.jsm: startup.continueStartup(${type})\n`);
 
@@ -92,15 +109,11 @@
         self.factories.push(new Factory(getEnigmailProtocolHandler()));
         self.factories.push(new Factory(mimeEncrypt.Handler));
 
-        const configuredVersion = 
getEnigmailPrefs().getPref("configuredVersion");
-
-        if (configuredVersion && configuredVersion.length > 0) {
-          self.createInstance();
-          if (!gEnigmailService.initialized) {
-            // try to initialize Enigmail
-            gEnigmailService.initialize(null, getEnigmailApp().getVersion());
-          }
+        if (isPostbox() || reason !== APP_STARTUP) {
+          // Postbox or while not starting up
+          initService();
         }
+
       }
       catch (ex) {
         gEnigmailService = null;
@@ -108,6 +121,11 @@
       }
     }
 
+    if ((!isPostbox()) && reason === APP_STARTUP) {
+      // if TB starts up, observe "mail-tabs-session-restored"
+      Services.obs.addObserver(initService, "mail-tabs-session-restored", 
false);
+    }
+
     getEnigmailVerify().registerContentTypeHandler();
     getEnigmailWksMimeHandler().registerContentTypeHandler();
     getEnigmailFiltersWrapper().onStartup();
@@ -503,3 +521,10 @@
     Cm.unregisterFactory(this.component.prototype.classID, this);
   }
 }
+
+function isPostbox() {
+  const POSTBOX_ID = "[email protected]";
+  const XPCOM_APPINFO = "@mozilla.org/xre/app-info;1";
+
+  return Cc[XPCOM_APPINFO].getService(Ci.nsIXULAppInfo).ID == POSTBOX_ID;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/funcs.jsm 
new/enigmail/package/funcs.jsm
--- old/enigmail/package/funcs.jsm      2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/funcs.jsm      2019-12-31 16:19:51.000000000 +0100
@@ -269,18 +269,6 @@
     return res;
   },
 
-  /***
-   * Get the text for the encrypted subject (either configured by user or 
default)
-   */
-  getProtectedSubjectText: function() {
-    if (EnigmailPrefs.getPref("protectedSubjectText").length > 0) {
-      return 
EnigmailData.convertToUnicode(EnigmailPrefs.getPref("protectedSubjectText"), 
"utf-8");
-    }
-    else {
-      return "...";
-    }
-  },
-
   cloneObj: function(orig) {
     let newObj;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/gnupgUpdate.jsm 
new/enigmail/package/gnupgUpdate.jsm
--- old/enigmail/package/gnupgUpdate.jsm        2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/package/gnupgUpdate.jsm        2019-12-31 16:19:51.000000000 
+0100
@@ -13,10 +13,15 @@
 const InstallGnuPG = 
ChromeUtils.import("chrome://enigmail/content/modules/installGnuPG.jsm").InstallGnuPG;
 const EnigmailOS = 
ChromeUtils.import("chrome://enigmail/content/modules/os.jsm").EnigmailOS;
 const EnigmailGpg = 
ChromeUtils.import("chrome://enigmail/content/modules/gpg.jsm").EnigmailGpg;
+const EnigmailGpgAgent = 
ChromeUtils.import("chrome://enigmail/content/modules/gpgAgent.jsm").EnigmailGpgAgent;
 const EnigmailLog = 
ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog;
 const EnigmailVersioning = 
ChromeUtils.import("chrome://enigmail/content/modules/versioning.jsm").EnigmailVersioning;
 const EnigmailTimer = 
ChromeUtils.import("chrome://enigmail/content/modules/timer.jsm").EnigmailTimer;
 const EnigmailDialog = 
ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog;
+const EnigmailFiles = 
ChromeUtils.import("chrome://enigmail/content/modules/files.jsm").EnigmailFiles;
+const EnigmailOpenPGP = 
ChromeUtils.import("chrome://enigmail/content/modules/openpgp.jsm").EnigmailOpenPGP;
+const EnigmailKeyRing = 
ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing;
+const EnigmailLocale = 
ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale;
 
 var EnigmailGnuPGUpdate = {
   isUpdateAvailable: async function() {
@@ -71,7 +76,8 @@
         case "WINNT":
           return isGpg4WinInstalled();
       }
-    } catch (x) {}
+    }
+    catch (x) {}
 
     return false;
   },
@@ -99,6 +105,40 @@
         w.openGnuPGUpdate();
       }
     }, timeoutSec * 1000);
+  },
+
+  /**
+   * Is is required to upgrade the keyring from GnuPG 2.0 to 2.2
+   *
+   * @return {Boolean}: true if upgrade required
+   */
+  requireKeyRingUpgrade: function() {
+    return EnigmailVersioning.greaterThan("2.1", EnigmailGpg.agentVersion);
+  },
+
+  /**
+   * Perform Update of GnuPG.
+   *
+   * @param {Object} progressListener: same structure as InstallGnuPG 
progressListener
+   */
+  performUpdate: function(progressListener) {
+    InstallGnuPG.startInstaller(progressListener);
+  },
+
+  /**
+   * Trigger conversion of GnuPG 2.0 keyring to GnuPG 2.2.
+   *
+   * This is done by (re-)reading the secret keys, after the file 
gpg-v21-migrated was deleted.
+   */
+  triggerKeyringConversion: function() {
+    EnigmailLog.DEBUG(`gnupgUpdate.jsm: importKeysFromOldGnupg()\n`);
+
+    if (prepareKeyringConversion()) {
+      importKeysFromOldGnuPG();
+    }
+
+    EnigmailKeyRing.clearCache();
+    EnigmailKeyRing.getAllKeys();
   }
 };
 
@@ -118,9 +158,61 @@
   return (EnigmailGpg.agentPath.path.search(/^\/usr\/local\/gnupg-2.[12]\//) 
=== 0);
 }
 
+/**
+ * Prepare conversion of keyring
+ *
+ * @return {Boolean}: true - need to import keys / false: key import not needed
+ */
+function prepareKeyringConversion() {
+  // delete gpg-v21-migrated in GnuPG profile if existing
+  EnigmailLog.DEBUG(`gnupgUpdate.jsm: prepareKeyringConversion()\n`);
+  let homeDir = EnigmailGpgAgent.getGpgHomeDir();
+  let gpgHomeDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
+  EnigmailFiles.initPath(gpgHomeDir, homeDir);
+
+  try {
+    let gpgMigrationFile = gpgHomeDir.clone();
+    gpgMigrationFile.append("gpg-v21-migrated");
 
-function performUpdate() {
-  EnigmailDialog.info(null, "GnuPG will be downloaded in the background. Once 
complete, the setup process will start automatically");
+    if (gpgMigrationFile.exists()) {
+      gpgMigrationFile.remove(false);
+    }
+  }
+  catch (ex) {}
+
+  try {
+    // if pubring.kbx is present, then re-import all keys from pubring.gpg and 
secring.gpg
+    let pubring = gpgHomeDir.clone();
+    pubring.append("pubring.kbx");
 
-  InstallGnuPG.startInstaller(null);
+    if (pubring.exists()) {
+      return true;
+    }
+  }
+  catch(ex) {}
+
+  return false;
+}
+
+
+function importKeysFromOldGnuPG() {
+  EnigmailLog.DEBUG(`gnupgUpdate.jsm: importKeysFromOldGnuPG()\n`);
+
+  let homeDir = EnigmailGpgAgent.getGpgHomeDir();
+  let gpgHomeDir = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
+  EnigmailFiles.initPath(gpgHomeDir, homeDir);
+
+  let keyRing = gpgHomeDir.clone();
+  try {
+    keyRing.append("secring.gpg");
+    if (keyRing.exists()) EnigmailKeyRing.importKeyFromFile(keyRing);
+  }
+  catch (ex) {}
+
+  keyRing = gpgHomeDir.clone();
+  try {
+    keyRing.append("pubring.gpg");
+    if (keyRing.exists()) EnigmailKeyRing.importKeyFromFile(keyRing);
+  }
+  catch (ex) {}
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/keyRing.jsm 
new/enigmail/package/keyRing.jsm
--- old/enigmail/package/keyRing.jsm    2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/keyRing.jsm    2019-12-31 16:19:51.000000000 +0100
@@ -299,6 +299,9 @@
       EnigmailKeyRing.clearCache();
     }
 
+    if (errorMsgObj) {
+      errorMsgObj.value = res.errorMsg;
+    }
     return res.exitCode;
   },
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/mime.jsm 
new/enigmail/package/mime.jsm
--- old/enigmail/package/mime.jsm       2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/mime.jsm       2019-12-31 16:19:51.000000000 +0100
@@ -292,43 +292,7 @@
     headers.initialize(contentBody);
 
     let innerCt = headers.extractHeader("content-type", false) || "";
-
-    if (innerCt.search(/^text\/rfc822-headers/i) === 0) {
-
-      let charset = EnigmailMime.getCharset(innerCt);
-      let ctt = headers.extractHeader("content-transfer-encoding", false) || 
"";
-
-      // determine where the headers end and the MIME-subpart body starts
-      let bodyStartPos = contentBody.search(/\r?\n\s*\r?\n/) + 1;
-
-      if (bodyStartPos < 10) return null;
-
-      bodyStartPos += contentBody.substr(bodyStartPos).search(/^[A-Za-z]/m);
-
-      let ctBodyData = contentBody.substr(bodyStartPos);
-
-      if (ctt.search(/^base64/i) === 0) {
-        ctBodyData = EnigmailData.decodeBase64(ctBodyData) + "\n";
-      }
-      else if (ctt.search(/^quoted-printable/i) === 0) {
-        ctBodyData = EnigmailData.decodeQuotedPrintable(ctBodyData) + "\n";
-      }
-
-      if (charset) {
-        ctBodyData = EnigmailData.convertToUnicode(ctBodyData, charset);
-      }
-
-      // get the headers of the MIME-subpart body --> that's the ones we need
-      let bodyHdr = 
Cc["@mozilla.org/messenger/mimeheaders;1"].createInstance(Ci.nsIMimeHeaders);
-      bodyHdr.initialize(ctBodyData);
-
-      for (let i in protectedHdr) {
-        if (bodyHdr.hasHeader(protectedHdr[i])) {
-          newHeaders[protectedHdr[i]] = 
jsmime.headerparser.decodeRFC2047Words(bodyHdr.extractHeader(protectedHdr[i], 
true)) || undefined;
-        }
-      }
-    }
-    else {
+    if (!(innerCt.search(/^text\/(plain|rfc822-headers)/i) === 0 && 
innerCt.search(/; *protected-headers="?v1"?/i) > 0)) {
       startPos = -1;
       endPos = -1;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/mimeEncrypt.jsm 
new/enigmail/package/mimeEncrypt.jsm
--- old/enigmail/package/mimeEncrypt.jsm        2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/package/mimeEncrypt.jsm        2019-12-31 16:19:51.000000000 
+0100
@@ -26,6 +26,7 @@
 const EnigmailPEPAdapter = 
ChromeUtils.import("chrome://enigmail/content/modules/pEpAdapter.jsm").EnigmailPEPAdapter;
 const EnigmailKeyRing = 
ChromeUtils.import("chrome://enigmail/content/modules/keyRing.jsm").EnigmailKeyRing;
 const EnigmailLocale = 
ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale;
+const EnigmailPrefs = 
ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs;
 
 // our own contract IDs
 const PGPMIME_ENCRYPT_CID = 
Components.ID("{96fe88f9-d2cd-466f-93e0-3a351df4c6d2}");
@@ -394,7 +395,18 @@
     w += this.getAutocryptGossip() + `\r\n--${this.encHeader}\r\n`;
     this.writeToPipe(w);
 
-    if (this.cryptoMode == MIME_SIGNED) this.writeOut(w);
+    if (this.cryptoMode == MIME_SIGNED) {
+      this.writeOut(w);
+    }
+    else if (EnigmailPrefs.getPref("protectedHeadersLegacyPart") &&
+      this.originalSubject && this.originalSubject.length > 0 &&
+      (this.sendFlags & EnigmailConstants.ENCRYPT_HEADERS)) {
+      w = 'Content-Type: text/plain; charset=utf-8; 
protected-headers="v1"\r\n' +
+        'Content-Disposition: inline\r\n\r\n' +
+        'Subject: ' + EnigmailData.convertFromUnicode(this.originalSubject, 
"utf-8") + "\r\n\r\n" +
+        `--${this.encHeader}\r\n`;
+      this.writeToPipe(w);
+    }
   },
 
   getAutocryptGossip: function() {
@@ -423,7 +435,7 @@
     let subj = "";
 
     if (this.sendFlags & EnigmailConstants.ENCRYPT_HEADERS) {
-      subj = jsmime.headeremitter.emitStructuredHeader("subject", 
EnigmailFuncs.getProtectedSubjectText(), {});
+      subj = jsmime.headeremitter.emitStructuredHeader("subject", 
EnigmailConstants.PROTECTED_SUBJECT, {});
     }
 
     this.writeOut(subj +
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/prefs/defaultPrefs.js 
new/enigmail/package/prefs/defaultPrefs.js
--- old/enigmail/package/prefs/defaultPrefs.js  2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/package/prefs/defaultPrefs.js  2019-12-31 16:19:51.000000000 
+0100
@@ -221,7 +221,10 @@
 // enable encryption/signing of headers like subject, from, to
 // 1: default: ask user at 1st time use / 0: off /  2: on
 pref("extensions.enigmail.protectedHeaders", 1);
-pref("extensions.enigmail.protectedSubjectText", "");
+
+// Create the Legacy Display part of Protected headers
+// false: off / true: on
+pref("extensions.enigmail.protectedHeadersLegacyPart", false);
 
 // do reset the "references" and "in-reply-to" headers?
 pref("extensions.enigmail.protectReferencesHdr", false);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/tests/mime-test.js 
new/enigmail/package/tests/mime-test.js
--- old/enigmail/package/tests/mime-test.js     2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/package/tests/mime-test.js     2019-12-31 16:19:51.000000000 
+0100
@@ -34,28 +34,26 @@
 const msg1 = 'Content-Type: multipart/mixed; boundary="OuterBoundary";\r\n' +
   '  protected-headers="v1"\r\n' +
   'References: <[email protected]>\r\n' +
-  'Subject: Outer hidden subject\r\n' +
+  'Subject: The hidden subject\r\n' +
+  'From: Starworks <[email protected]>\r\n' +
+  'To: Alan <[email protected]>, Bingo <[email protected]>\r\n' +
+  'Cc: Alan <[email protected]>, Bingo <[email protected]>\r\n' +
+  'Reply-To: Starworks alternative <[email protected]>\r\n' +
+  'Date: Sun, 21 Jun 2015 15:19:32 +0200\r\n' +
   '\r\n' +
   '--OuterBoundary\r\n' +
-  'Content-Transfer-Encoding: base64\r\n' +
-  'Content-Type: text/rfc822-headers; charset="us-ascii";\r\n' +
+  'Content-Type: text/plain; charset="us-ascii"; protected-headers="v1"\r\n' +
   'Content-Disposition: inline\r\n' +
   '\r\n' +
-  'U3ViamVjdDogVGhlIGhpZGRlbiBzdWJqZWN0CkRhdGU6IFN1biwgMjEgSnVuIDIwMTUgMT\r\n' 
+
-  'U6MTk6MzIgKzAyMDAKRnJvbTogU3RhcndvcmtzIDxzdHJpa2VmcmVlZG9tQGVuaWdtYWls\r\n' 
+
-  'LXRlc3QubmV0PgpUbzogUGF0cmljayA8cGF0cmlja0BlbmlnbWFpbC10ZXN0Lm5ldD4sIE\r\n' 
+
-  'JpbmdvIDxiaW5nb0BlbmlnbWFpbC10ZXN0Lm5ldD4KQ2M6IFBhdHJpY2sgPHBhdHJpY2sy\r\n' 
+
-  'QGVuaWdtYWlsLXRlc3QubmV0PiwgQmluZ28gPDJiaW5nb0BlbmlnbWFpbC10ZXN0Lm5ldD\r\n' 
+
-  '4KUmVwbHktVG86IFN0YXJ3b3JrcyBhbHRlcm5hdGl2ZSA8YWx0ZXJuYXRpdmVAZW5pZ21h\r\n' 
+
-  'aWwtdGVzdC5uZXQ+Cg==\r\n' +
+  'Subject: The hidden subject\r\n' +
   '\r\n' +
   '--OuterBoundary\r\n' +
   'Content-Type: multipart/mixed; boundary="innerContent"\r\n' +
   '\r\n' +
   '--innerContent\r\n' +
-  'Content-Type: text/plain; charset="us-ascii"\r\n' +
+  'Content-Type: text/html; charset="us-ascii"\r\n' +
   '\r\n' +
-  'Hello World!\r\n' +
+  '<p>Hello World!</p>\r\n' +
   '\r\n' +
   '--innerContent--\r\n' +
   '--OuterBoundary--\r\n\r\n';
@@ -83,29 +81,29 @@
   var expected = msg2;
 
   var got = r.startPos;
-  Assert.equal(got, 144, "startPos of removed data");
+  Assert.equal(got, 429, "startPos of removed data");
 
   got = r.endPos;
-  Assert.equal(got, 739, "endPos of removed data");
+  Assert.equal(got, 578, "endPos of removed data");
 
   got = r.newHeaders.subject;
   expected = "The hidden subject";
   Assert.equal(got, expected, "subject");
 
   got = r.newHeaders.from;
-  expected = "Starworks <[email protected]>";
+  expected = "Starworks <[email protected]>";
   Assert.equal(got, expected, "from");
 
   got = r.newHeaders.to;
-  expected = "Patrick <[email protected]>, Bingo 
<[email protected]>";
+  expected = "Alan <[email protected]>, Bingo <[email protected]>";
   Assert.equal(got, expected, "to");
 
   got = r.newHeaders.cc;
-  expected = "Patrick <[email protected]>, Bingo 
<[email protected]>";
+  expected = "Alan <[email protected]>, Bingo <[email protected]>";
   Assert.equal(got, expected, "cc");
 
   got = r.newHeaders["reply-to"];
-  expected = "Starworks alternative <[email protected]>";
+  expected = "Starworks alternative <[email protected]>";
   Assert.equal(got, expected, "reply-to");
 
   got = r.newHeaders.date;
@@ -122,7 +120,7 @@
   let tree = EnigmailMime.getMimeTree(msg1);
 
   Assert.ok(tree.headers.contentType.type, "multipart/mixed");
-  Assert.equal(tree.subParts[0].headers.contentType.type, 
"text/rfc822-headers");
+  Assert.equal(tree.subParts[0].headers.contentType.type, "text/plain");
   Assert.equal(tree.subParts[0].headers.charset, "us-ascii");
-  Assert.equal(tree.subParts[1].subParts[0].headers.contentType.type, 
"text/plain");
+  Assert.equal(tree.subParts[1].subParts[0].headers.contentType.type, 
"text/html");
 });
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/tests/mimeEncrypt-test.js 
new/enigmail/package/tests/mimeEncrypt-test.js
--- old/enigmail/package/tests/mimeEncrypt-test.js      1970-01-01 
01:00:00.000000000 +0100
+++ new/enigmail/package/tests/mimeEncrypt-test.js      2019-12-31 
16:19:51.000000000 +0100
@@ -0,0 +1,177 @@
+/*global do_load_module: false, do_get_file: false, do_get_cwd: false, 
testing: false, test: false, Assert: false, resetting: false */
+/*global component: false, withEnigmail: false  withTestGpgHome: false, 
JSUnit: 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 https://mozilla.org/MPL/2.0/.
+ */
+
+"use strict";
+
+
+do_load_module("file://" + do_get_cwd().path + "/testHelper.js");
+
+testing("mimeEncrypt.jsm");
+/* global EnigmailMimeEncrypt: false, PgpMimeEncrypt: false
+ EnigmailConstants: false, EnigmailKeyRing: false,
+ EnigmailPrefs: false,
+ MIME_SIGNED: false, MIME_ENCRYPTED: false */
+
+const EnigmailFiles = component("enigmail/files.jsm").EnigmailFiles;
+
+test(function testSignedMessage() {
+  const e = new PgpMimeEncrypt(null);
+  e.msgCompFields = [];
+  e.hashAlgorithm = "SHA256";
+  e.cryptoMode = MIME_SIGNED;
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED;
+  e.startCryptoHeaders();
+
+  Assert.equal(e.pipeQueue.search(/Content-Type: multipart\/mixed; 
boundary=\"[a-zA-Z0-9]+\"\r\n\r\n--[a-zA-Z0-9]+\r\n/), 0);
+  Assert.equal(e.outQueue.search(/Content-Type: multipart\/signed; 
micalg=pgp-sha256;\r\n protocol=\"application\/pgp-signature\";\r\n 
boundary=\"[a-zA-Z0-9]+\"/), 0);
+});
+
+
+test(withTestGpgHome(withEnigmail(function testFinishCryptoEncapsulation() {
+  const publicKey = do_get_file("resources/dev-strike.asc", false);
+  const secretKey = do_get_file("resources/dev-strike.sec", false);
+  const errorMsgObj = {};
+  const importedKeysObj = {};
+  EnigmailKeyRing.importKeyFromFile(publicKey, errorMsgObj, importedKeysObj);
+  EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj);
+  const strikeAccount = "[email protected]";
+
+  const e = new PgpMimeEncrypt(null);
+  e.msgCompFields = [];
+  e.hashAlgorithm = "SHA256";
+  e.useSmime = false;
+  e.cryptoMode = MIME_ENCRYPTED;
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_ENCRYPTED | EnigmailConstants.SEND_ALWAYS_TRUST;
+  e.senderEmailAddr = strikeAccount;
+  e.recipients = strikeAccount;
+  e.bccRecipients = "";
+  e.pipeQueue = "Hello World";
+  e.win = JSUnit.createStubWindow();
+  e.checkSMime = false;
+  e.encapsulate = false;
+  e.encHeader = null;
+  e.flushOutput = function() {};
+
+  e.finishCryptoEncapsulation(false, false);
+  Assert.equal(e.encryptedData.substr(0, 27), "-----BEGIN PGP MESSAGE-----");
+
+  Assert.ok(e.encryptedData.split(/[\r\n]+/).length >= 14);
+
+  // test if we get an exception if encryption fails
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_ENCRYPTED;
+  try {
+    e.finishCryptoEncapsulation(false, false);
+    Assert.ok(false); // should not succeed because "always trust" is off
+  }
+  catch (ex) {
+    Assert.ok(true);
+  }
+
+  // test signed message
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED;
+  e.finishCryptoEncapsulation(false, false);
+  Assert.equal(e.encryptedData.substr(0, 29), "-----BEGIN PGP SIGNATURE-----");
+})));
+
+
+test(withTestGpgHome(withEnigmail(function testBeginCryptoEncapsulation() {
+  const secretKey = do_get_file("resources/dev-strike.sec", false);
+  const errorMsgObj = {};
+  const importedKeysObj = {};
+  EnigmailKeyRing.importKeyFromFile(secretKey, errorMsgObj, importedKeysObj);
+  const strikeAccount = "[email protected]";
+
+  // force GnuPG to use SHA512
+  EnigmailPrefs.setPref("agentAdditionalParam", "--digest-algo SHA512");
+
+  const e = new PgpMimeEncrypt(null);
+  e.msgCompFields = [];
+  e.hashAlgorithm = "";
+  e.useSmime = false;
+  e.cryptoMode = MIME_ENCRYPTED;
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED;
+  e.senderEmailAddr = strikeAccount;
+  e.recipients = strikeAccount;
+  e.bccRecipients = "";
+  e.pipeQueue = "Hello World";
+  e.win = JSUnit.createStubWindow();
+  e.checkSMime = false;
+  e.encapsulate = false;
+  e.encHeader = null;
+
+  e.beginCryptoEncapsulation({}, strikeAccount, {}, {}, false, false);
+
+  Assert.equal(e.hashAlgorithm, "sha512");
+  EnigmailPrefs.setPref("agentAdditionalParam", "");
+})));
+
+test(function testWriteSecureHeaders() {
+  const e = new PgpMimeEncrypt(null);
+  const SUBJECT = "Some subject with umlauts like ä and é";
+  e.msgCompFields = {
+    from: "Sender <[email protected]>",
+    to: "Recipient <[email protected]>"
+  };
+  e.getAutocryptGossip = function() {
+    return "";
+  };
+  e.encHeader = null;
+  e.cryptoMode = MIME_ENCRYPTED;
+  e.originalSubject = SUBJECT;
+
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED;
+  EnigmailPrefs.setPref("protectedHeadersLegacyPart", false);
+  e.pipeQueue = "";
+  e.writeSecureHeaders();
+  Assert.equal(e.pipeQueue, `Content-Type: multipart/mixed; 
boundary="${e.encHeader}"\r\n\r\n--${e.encHeader}\r\n`);
+
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED;
+  EnigmailPrefs.setPref("protectedHeadersLegacyPart", true);
+  e.pipeQueue = "";
+  e.writeSecureHeaders();
+  Assert.equal(e.pipeQueue, `Content-Type: multipart/mixed; 
boundary="${e.encHeader}"\r\n\r\n--${e.encHeader}\r\n`);
+
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED | EnigmailConstants.ENCRYPT_HEADERS;
+  EnigmailPrefs.setPref("protectedHeadersLegacyPart", false);
+  e.pipeQueue = "";
+  e.writeSecureHeaders();
+  let expected = `Content-Type: multipart/mixed; 
boundary="${e.encHeader}";\r\n protected-headers="v1"\r\n` +
+    `From: ${e.msgCompFields.from}\r\n` +
+    `To: ${e.msgCompFields.to}\r\n` +
+    `Subject: 
=?UTF-8?Q?Some_subject_with_umlauts_like_=c3=a4_and_=c3=a9?=\r\n\r\n` +
+    `--${e.encHeader}\r\n`;
+  Assert.equal(e.pipeQueue, expected);
+
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED | EnigmailConstants.ENCRYPT_HEADERS;
+  EnigmailPrefs.setPref("protectedHeadersLegacyPart", true);
+  e.pipeQueue = "";
+  e.writeSecureHeaders();
+  expected = `Content-Type: multipart/mixed; boundary="${e.encHeader}";\r\n 
protected-headers="v1"\r\n` +
+    `From: ${e.msgCompFields.from}\r\n` +
+    `To: ${e.msgCompFields.to}\r\n` +
+    `Subject: 
=?UTF-8?Q?Some_subject_with_umlauts_like_=c3=a4_and_=c3=a9?=\r\n\r\n` +
+    `--${e.encHeader}\r\n` +
+    'Content-Type: text/plain; charset=utf-8; protected-headers="v1"\r\n' +
+    'Content-Disposition: inline\r\n\r\n' +
+    `Subject: Some subject with umlauts like ä and é\r\n\r\n` +
+    `--${e.encHeader}\r\n`;
+  Assert.equal(e.pipeQueue, expected);
+
+  e.originalSubject = null;
+  e.sendFlags = EnigmailConstants.SEND_PGP_MIME | 
EnigmailConstants.SEND_SIGNED | EnigmailConstants.ENCRYPT_HEADERS;
+  EnigmailPrefs.setPref("protectedHeadersLegacyPart", true);
+  e.pipeQueue = "";
+  e.writeSecureHeaders();
+  expected = `Content-Type: multipart/mixed; boundary="${e.encHeader}";\r\n 
protected-headers="v1"\r\n` +
+    `From: ${e.msgCompFields.from}\r\n` +
+    `To: ${e.msgCompFields.to}\r\n\r\n` +
+    `--${e.encHeader}\r\n`;
+  Assert.equal(e.pipeQueue, expected);
+
+  EnigmailPrefs.setPref("protectedHeadersLegacyPart", false);
+});
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/package/versioning.jsm 
new/enigmail/package/versioning.jsm
--- old/enigmail/package/versioning.jsm 2019-12-11 18:23:50.000000000 +0100
+++ new/enigmail/package/versioning.jsm 2019-12-31 16:19:51.000000000 +0100
@@ -9,10 +9,6 @@
 
 const EXPORTED_SYMBOLS = ["EnigmailVersioning"];
 
-
-
-
-
 const EnigmailLog = 
ChromeUtils.import("chrome://enigmail/content/modules/log.jsm").EnigmailLog;
 const EnigmailExecution = 
ChromeUtils.import("chrome://enigmail/content/modules/execution.jsm").EnigmailExecution;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/enigmailAttachmentsDialog.js 
new/enigmail/ui/content/enigmailAttachmentsDialog.js
--- old/enigmail/ui/content/enigmailAttachmentsDialog.js        2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/content/enigmailAttachmentsDialog.js        2019-12-31 
16:19:51.000000000 +0100
@@ -106,9 +106,9 @@
   }
   if (optionSel) {
     if (optionSel.value !== "") {
-      gArguments[ENIG_RESULT].selected = optionSel.value;
+      gArguments[ENIG_RESULT].selected = Number(optionSel.value);
       if (gArguments[ENIG_INPUT].restrictedScenario === false) {
-        EnigSetPref("encryptAttachments", optionSel.value);
+        EnigSetPref("encryptAttachments", Number(optionSel.value));
       }
       return true;
     } else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/enigmailMessengerOverlay.js 
new/enigmail/ui/content/enigmailMessengerOverlay.js
--- old/enigmail/ui/content/enigmailMessengerOverlay.js 2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/content/enigmailMessengerOverlay.js 2019-12-31 
16:19:51.000000000 +0100
@@ -10,7 +10,7 @@
 /* global ReloadMessage: false, gDBView: false, gSignatureStatus: false, 
gEncryptionStatus: false, showMessageReadSecurityInfo: false */
 /* global gFolderDisplay: false, messenger: false, currentAttachments: false, 
msgWindow: false, PanelUI: false */
 /* global currentHeaderData: false, gViewAllHeaders: false, 
gExpandedHeaderList: false, goDoCommand: false, HandleSelectedAttachments: 
false */
-/* global statusFeedback: false, displayAttachmentsForExpandedView: false, 
gMessageListeners: false, gExpandedHeaderView */
+/* global statusFeedback: false, displayAttachmentsForExpandedView: false, 
gMessageListeners: false, gExpandedHeaderView: false, gSignedUINode: false */
 
 var EnigmailCompat = 
ChromeUtils.import("chrome://enigmail/content/modules/compat.jsm").EnigmailCompat;
 var EnigmailCore = 
ChromeUtils.import("chrome://enigmail/content/modules/core.jsm").EnigmailCore;
@@ -733,6 +733,8 @@
         };
       }
 
+      this.hideNonStandardMimeStructure(mimeMsg);
+
       // Copy selected headers
       Enigmail.msg.savedHeaders = {
         autocrypt: []
@@ -921,6 +923,27 @@
       return -1;
   },
 
+  hideNonStandardMimeStructure: function(mimeMsg) {
+    if (Enigmail.msg.securityInfo === null) return;
+    if (Enigmail.msg.securityInfo.encryptedMimePart === "1") return;
+    if (!((Enigmail.msg.securityInfo.statusFlags & 
EnigmailConstants.PGP_MIME_SIGNED) !== 0 &&
+        (Enigmail.msg.securityInfo.statusFlags & 
EnigmailConstants.DECRYPTION_OKAY) === 0)) return;
+
+    if (Enigmail.msg.securityInfo.encryptedMimePart === "1.1" &&
+      mimeMsg.subParts.length === 2 &&
+      mimeMsg.headers.contentType.type === "multipart/mixed" &&
+      mimeMsg.subParts[1].headers.contentType.type === "text/plain") return;
+
+    // Hide status bar for PGP/MIME signed messages, if we found a 
non-standard message structure
+    Enigmail.msg.securityInfo.statusFlags = 0;
+    Enigmail.msg.securityInfo.statusLine = "";
+    Enigmail.msg.securityInfo.statusInfo = "";
+    Enigmail.hdrView.displayStatusBar();
+    let signedUINode = Enigmail.hdrView.getSignedIcon();
+    signedUINode.removeAttribute("signed");
+    signedUINode.collapsed = true;
+  },
+
   // display header about reparing buggy MS-Exchange messages
   buggyMailHeader: function() {
     let uriStr = EnigmailURIs.createMessageURI(this.getCurrentMsgUrl(),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/enigmailMsgComposeOverlay.js 
new/enigmail/ui/content/enigmailMsgComposeOverlay.js
--- old/enigmail/ui/content/enigmailMsgComposeOverlay.js        2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/content/enigmailMsgComposeOverlay.js        2019-12-31 
16:19:51.000000000 +0100
@@ -4051,15 +4051,15 @@
           // dialog cancelled
           return null;
         }
-        else if (resultObj.selected == 1) {
+        else if (resultObj.selected === 1) {
           // encrypt attachments
           inlineEncAttach = true;
         }
-        else if (resultObj.selected == 2) {
+        else if (resultObj.selected === 2) {
           // send as PGP/MIME
           sendFlags |= EnigmailConstants.SEND_PGP_MIME;
         }
-        else if (resultObj.selected == 3) {
+        else if (resultObj.selected === 3) {
           // cancel the encryption/signing for the whole message
           sendFlags &= ~EnigmailConstants.SEND_ENCRYPTED;
           sendFlags &= ~EnigmailConstants.SEND_SIGNED;
@@ -4076,7 +4076,8 @@
     }
 
     return {
-      inlineEncAttach: inlineEncAttach
+      inlineEncAttach: inlineEncAttach,
+      sendFlags: sendFlags
     };
   },
 
@@ -4264,6 +4265,7 @@
       let attach = this.appendInlineAttachments(sendFlags);
       if (!attach) return false;
       let inlineEncAttach = attach.inlineEncAttach;
+      sendFlags = attach.sendFlags;
 
       var usingPGPMime = (sendFlags & EnigmailConstants.SEND_PGP_MIME) &&
         (sendFlags & (ENCRYPT | SIGN));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/enigmailMsgHdrViewOverlay.js 
new/enigmail/ui/content/enigmailMsgHdrViewOverlay.js
--- old/enigmail/ui/content/enigmailMsgHdrViewOverlay.js        2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/content/enigmailMsgHdrViewOverlay.js        2019-12-31 
16:19:51.000000000 +0100
@@ -255,9 +255,9 @@
         statusFlags |= EnigmailConstants.DECRYPTION_INCOMPLETE;
     }
 
-    if (!(statusFlags & EnigmailConstants.PGP_MIME_ENCRYPTED)) {
-      encMimePartNumber = "";
-    }
+    // if (!(statusFlags & EnigmailConstants.PGP_MIME_ENCRYPTED)) {
+    //   encMimePartNumber = "";
+    // }
 
     if (!EnigmailPrefs.getPref("displayPartiallySigned")) {
       if ((statusFlags & (EnigmailConstants.PARTIALLY_PGP)) &&
@@ -727,10 +727,6 @@
 
     if (EnigmailCompat.isPostbox()) {
       let doc = document.getElementById("messagepane").contentDocument;
-      let sigNodes = doc.getElementsByClassName("hdr-signed-button");
-      if (sigNodes && sigNodes.length > 0) {
-        signedUINode = sigNodes[0];
-      }
 
       let encNodes = doc.getElementsByClassName("hdr-encrypted-button");
       if (encNodes && encNodes.length > 0) {
@@ -741,10 +737,11 @@
     }
     else {
       sMimeContainer = gSMIMEContainer;
-      signedUINode = gSignedUINode;
       encryptedUINode = gEncryptedUINode;
     }
 
+    signedUINode = this.getSignedIcon();
+
     /* eslint block-scoped-var: 0*/
     if (typeof(sMimeContainer) !== "object")
       return;
@@ -822,8 +819,24 @@
     }
   },
 
-  dispSecurityContext: function() {
+  getSignedIcon: function() {
+    let signedUINode = null;
+
+    if (EnigmailCompat.isPostbox()) {
+      let doc = document.getElementById("messagepane").contentDocument;
+      let sigNodes = doc.getElementsByClassName("hdr-signed-button");
+      if (sigNodes && sigNodes.length > 0) {
+        signedUINode = sigNodes[0];
+      }
+    }
+    else {
+      signedUINode = gSignedUINode;
+    }
 
+    return signedUINode;
+  },
+
+  dispSecurityContext: function() {
     try {
       if (Enigmail.msg.securityInfo) {
         if ((Enigmail.msg.securityInfo.statusFlags & EnigmailConstants.NODATA) 
&&
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/enigmailPrivacyOverlay.js 
new/enigmail/ui/content/enigmailPrivacyOverlay.js
--- old/enigmail/ui/content/enigmailPrivacyOverlay.js   2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/content/enigmailPrivacyOverlay.js   2019-12-31 
16:19:51.000000000 +0100
@@ -26,7 +26,7 @@
     document.getElementById("enigmail_juniorMode").value = jm;
 
     let prefWindow = document.getElementById("MailPreferences");
-    if (this._windowResized === 0 && prefWindow.currentPane.id === 
"panePrivacy") {
+    if (this._windowResized === 0 && ("currentPane" in prefWindow) && 
prefWindow.currentPane.id === "panePrivacy") {
       window.resizeBy(0, prefGroup.clientHeight);
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/pref-enigmail.js 
new/enigmail/ui/content/pref-enigmail.js
--- old/enigmail/ui/content/pref-enigmail.js    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/ui/content/pref-enigmail.js    2019-12-31 16:19:51.000000000 
+0100
@@ -133,7 +133,6 @@
   displayPrefs(false, true, false);
 
   document.getElementById("enigmail_agentPath").value = 
EnigConvertToUnicode(EnigGetPref("agentPath"), "utf-8");
-  document.getElementById("protectedSubjectText").value = 
EnigConvertToUnicode(EnigGetPref("protectedSubjectText"), "utf-8");
 
   var maxIdle = -1;
   if (!gEnigmailSvc) {
@@ -412,12 +411,9 @@
     document.getElementById("enigmail_agentPath").value = "";
   }
   var newAgentPath = document.getElementById("enigmail_agentPath").value;
-  var protectedSubjectText = 
document.getElementById("protectedSubjectText").value;
 
   displayPrefs(false, false, true);
   EnigSetPref("agentPath", EnigConvertFromUnicode(newAgentPath, "utf-8"));
-  EnigSetPref("protectedSubjectText", 
EnigConvertFromUnicode(protectedSubjectText, "utf-8"));
-
 
   if (gMimePartsElement &&
     (gMimePartsElement.checked != gMimePartsValue)) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/pref-enigmail.xul 
new/enigmail/ui/content/pref-enigmail.xul
--- old/enigmail/ui/content/pref-enigmail.xul   2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/ui/content/pref-enigmail.xul   2019-12-31 16:19:51.000000000 
+0100
@@ -127,10 +127,6 @@
       <description>&enigmail.protectHeadersPrefs.tooltip;</description>
     </tooltip>
 
-    <tooltip id="protectedSubjectText.tooltip">
-      <description>&enigmail.protectedSubjectText.tooltip;</description>
-    </tooltip>
-
     <tooltip id="resetRememberedValues.tooltip">
       <description>&enigmail.resetRememberedValues.tooltip;</description>
     </tooltip>
@@ -376,27 +372,9 @@
           <description 
class="enigmailPrefsTitle">&enigmail.moreOptions.label;</description>
           <spacer flex="0"/>
 
-          <vbox class="enigmailGroupbox">
-            <vbox>
-              <checkbox id="enigmail_protectHeaders"
-                        label="&enigmail.protectHeadersPrefs.label;"
-                        tooltip="protectHeaders.tooltip"/>
-
-              <hbox>
-                <hbox align="center">
-                  <label control="protectedSubjectText"
-                         tooltip="protectedSubjectText.tooltip"
-                         value="&enigmail.protectedSubjectText.label;"/>
-                </hbox>
-                <hbox>
-                  <textbox id="protectedSubjectText"
-                           tooltip="protectedSubjectText.tooltip"
-                           
placeholder="&enigmail.protectedSubjectText.placeholder;"
-                           size="40"/>
-                </hbox>
-              </hbox>
-            </vbox>
-          </vbox>
+          <checkbox id="enigmail_protectHeaders"
+                    label="&enigmail.protectHeadersPrefs.label;"
+                    tooltip="protectHeaders.tooltip"/>
 
           <checkbox id="enigmail_wrapHtmlBeforeSend"
                     label="&enigmail.wrapHtmlBeforeSend.label;"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/setupWizard2.js 
new/enigmail/ui/content/setupWizard2.js
--- old/enigmail/ui/content/setupWizard2.js     2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/ui/content/setupWizard2.js     2019-12-31 16:19:51.000000000 
+0100
@@ -82,6 +82,8 @@
 
   Promise.all([installPromise, pepPromise, setupPromise]).then(r => {
     displayExistingEmails();
+  }).catch(err => {
+    displayExistingEmails();
   });
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/updateGnuPG.html 
new/enigmail/ui/content/updateGnuPG.html
--- old/enigmail/ui/content/updateGnuPG.html    2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/ui/content/updateGnuPG.html    2019-12-31 16:19:51.000000000 
+0100
@@ -62,21 +62,29 @@
 
     <div id="progressBox" style="max-width: 100%; width: 440px" class="hidden">
       <p>
-        Downloading GnuPG
+        <span txtId="updateGnuPG.downloadingGnuPG"></span>
       </p>
       <progress id="downloadProgress" style="width: 100%;" max="100" 
value="0"/>
       <p/>
       <div id="installProgressBox" class="hidden">
         <p id="installLabel">
-          Launching the GnuPG installer
+          <span txtId="updateGnuPG.startingInstaller"></span>
         </p>
         <progress id="installProgress" style="max-width: 100%; width: 440px; 
:indeterminate;" max="100"/>
       </div>
     </div>
 
+    <div id="convertKeyring" class="hidden">
+      <p>
+        <span txtId="updateGnuPG.importingKeys"></span>
+        <span id="importingKeysProgress" class="enigmailWheel 
enigmailSpinning"></span>
+        <span id="importingKeysDone" class="enigmailOkSign hidden"></span>
+      </p>
+    </div>
+
     <div id="updateComplete" class="hidden">
       <p>
-        GnuPG has been updated successfully.
+        <span txtId="updateGnuPG.success"></span>
       </p>
     </div>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/content/updateGnuPG.js 
new/enigmail/ui/content/updateGnuPG.js
--- old/enigmail/ui/content/updateGnuPG.js      2019-12-11 18:23:50.000000000 
+0100
+++ new/enigmail/ui/content/updateGnuPG.js      2019-12-31 16:19:51.000000000 
+0100
@@ -12,7 +12,6 @@
 
 const EnigmailLocalizeHtml = 
ChromeUtils.import("chrome://enigmail/content/modules/localizeHtml.jsm").EnigmailLocalizeHtml;
 const EnigmailGnuPGUpdate = 
ChromeUtils.import("chrome://enigmail/content/modules/gnupgUpdate.jsm").EnigmailGnuPGUpdate;
-const InstallGnuPG = 
ChromeUtils.import("chrome://enigmail/content/modules/installGnuPG.jsm").InstallGnuPG;
 const EnigmailDialog = 
ChromeUtils.import("chrome://enigmail/content/modules/dialog.jsm").EnigmailDialog;
 const EnigmailLocale = 
ChromeUtils.import("chrome://enigmail/content/modules/locale.jsm").EnigmailLocale;
 const EnigmailPrefs = 
ChromeUtils.import("chrome://enigmail/content/modules/prefs.jsm").EnigmailPrefs;
@@ -65,7 +64,9 @@
   btnInstallGnupg.setAttribute("disabled", true);
   progressBox.classList.remove("hidden");
 
-  InstallGnuPG.startInstaller({
+  let requireKeysUpgrade = EnigmailGnuPGUpdate.requireKeyRingUpgrade();
+
+  EnigmailGnuPGUpdate.performUpdate({
     onStart: function(reqObj) {
       gDownoadObj = reqObj;
     },
@@ -121,7 +122,7 @@
       installProgressBox.classList.add("hidden");
     },
 
-    onLoaded: function() {
+    onLoaded: async function() {
       installProgress.setAttribute("value", 100);
 
       let origPath = EnigmailPrefs.getPref("agentPath");
@@ -134,6 +135,13 @@
         this.returnToDownload();
         EnigmailDialog.alert(window, 
EnigmailLocale.getString("setupWizard.installFailed"));
       } else {
+        if (requireKeysUpgrade) {
+          document.getElementById("convertKeyring").classList.remove("hidden");
+          EnigmailGnuPGUpdate.triggerKeyringConversion();
+          
document.getElementById("importingKeysProgress").classList.add("hidden");
+          
document.getElementById("importingKeysDone").classList.remove("hidden");
+        }
+
         document.getElementById("updateComplete").classList.remove("hidden");
       }
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/locale/en-US/enigmail.properties 
new/enigmail/ui/locale/en-US/enigmail.properties
--- old/enigmail/ui/locale/en-US/enigmail.properties    2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/locale/en-US/enigmail.properties    2019-12-31 
16:19:51.000000000 +0100
@@ -224,7 +224,7 @@
 signOffWithReason=Signing: OFF (%S)
 reasonEnabledByDefault=enabled by default
 reasonManuallyForced=manually forced
-reasonByRecipientRules=forced by per-recipient rules
+reasonByRecipientRules=forced by Autocrypt or per-recipient rules
 reasonByAutoEncryption=forced by auto encryption
 reasonByConflict=due to conflict in per-recipient rules
 reasonByEncryptionMode=due to encryption mode
@@ -832,6 +832,10 @@
 updateGnuPG.installUpdate=Install Update
 updateGnuPG.noMoreUpdates=Don't check for future updates
 updateGnuPG.checkUpdate=Check for GnuPG Updates
+updateGnuPG.success=GnuPG has been updated successfully.
+updateGnuPG.importingKeys=Importing keys in GnuPG. You might be asked for the 
passphrase(s) of your key(s).
+updateGnuPG.downloadingGnuPG=Downloading GnuPG
+updateGnuPG.startingInstaller=Starting the installer. Please follow the steps 
of the GnuPG installer wizard.
 
 
 #strings in keyserver.jsm
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/enigmail/ui/skin/common/enigmail-html.css 
new/enigmail/ui/skin/common/enigmail-html.css
--- old/enigmail/ui/skin/common/enigmail-html.css       2019-12-11 
18:23:50.000000000 +0100
+++ new/enigmail/ui/skin/common/enigmail-html.css       2019-12-31 
16:19:51.000000000 +0100
@@ -98,4 +98,33 @@
 .hidden {
   visibility: collapse;
   max-height: 0px;
-}
\ No newline at end of file
+}
+
+/* a spinning wheel circle */
+.enigmailWheel {
+  content: url("chrome://enigmail/skin/spinning-wheel.png");
+  max-width: 100%;
+  max-height: 100%;
+}
+
+.enigmailSpinning {
+  animation: enigmailDoRotation 1.4s infinite linear;
+  transform: translateZ(0);
+}
+
+@keyframes enigmailDoRotation {
+  0% {
+    transform: rotate(0deg);
+  }
+
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+.enigmailOkSign {
+  content: url("chrome://enigmail/skin/ok-sign.svg");
+  padding-left: 5px;
+  padding-right: 5px;
+  height: 1.3em;
+}



Reply via email to